有时候基于 Vue 的单文件组件开发项目时, 不得不使用全局样式, 这时有一些须要注意的地方.css
当遇到须要使用全局样式时, 下列几种状况html
下面详细记录一下须要注意的问题:vue
若是样式须要在项目各处均有使用, 例如: reset.css, tiny-trim.css 等等.
这时推荐在项目入口文件中直接导入样式文件:git
// src/main.js import 'tiny-trim.css' import 'asset/reset.css' import 'asset/global.css'
固然, 也能够在顶层组件中没有设置 scoped
属性的 style
标签中导入:github
@import url(asset/reset.css); @import url(asset/global.css);
当使用一些第三方 UI 库时, 有一些 UI 库生成的 DOM 在 template
中并不能直接添加 class
或 style
来修改第三方 UI 库的组件样式, 这时咱们能够经过当前组件没有 scoped
属性的 style
标签来添加全局样式.web
但此时须要考虑一些问题:浏览器
template
标签里 (DOM 由第三方 UI 库的 JS 在浏览器加载时构建或在编译打包过程当中生成), 不能直接设置 class
或 style
来修改样式, 故只能使用没有 scoped
属性的 style
标签能够看出两点是有必定矛盾的. 不过能够采用以下方法解决或缓解:url
为当前组件根元素设置自定义 data
属性code
<!-- src/components/MyComponent.vue --> <template> <div class="my-component" data-custom-mycomponent> <!-- ... --> </div> </tempalte>
在没有 scoped
属性的 style
标签中使用自定义 data
属性限定样式做用域component
.my-component[data-custom-mycomponent] { // ... }
这里推荐使用Less
或Sass
, 嵌套语法能减小许多代码冗余.
这种状况主要是针对上一种状况的补充, 有时候第三方 UI 库生成的 DOM 节点并不在当前组件的 DOM 内, 可能渲染到 body
中 (如 dialog
, tooltip
, message
等).
这些渲染到当前组件 DOM
以外的组件, 须要在上一种状况的处理基础上, 为它们的顶层元素再设置一个自定义的 data
属性:
<!-- src/components/MyComponent.vue --> <template> <div class="my-component" data-custom-mycomponent> <!-- message 组件的 DOM 将被渲染到 body 中, 而不是当前组件 .my-component 中 --> <message class="my-component-message" msg="You got a message! " data-custom-mycomponent-message /> </div> </tempalte>
.my-component[data-custom-mycomponent] { // ... } .my-component-message[data-custom-mycomponent-message] { // ... }
-EOF
原文: [笔记] 当在 Vue 中不得不用全局样式时...