<style>
标签可以有 scoped
或者 module
属性
对于样式全局化问题,解决方案可以有:CSS Modules、 scoped css
、CSS预处理器(Sass/Less等)
CSS Modules:https://blog.csdn.net/weixin_44869002/article/details/105806021
- 当
<style>
标签有scoped
属性时,它通过使用 PostCSS 来实现以下转换:
<style scoped>
.example {
color: red;
}
</style>
<template>
<div class="example">hi</div>
</template>
转换为:
<style>
.example[data-v-f3f3eg9] {
color: red;
}
</style>
<template>
<div class="example" data-v-f3f3eg9>hi</div>
</template>
- 一个组件中同时使用有 scoped 和非 scoped 样式
<style>
/* 全局样式 */
</style>
<style scoped>
/* 本地样式 */
</style>
- 使用
scoped
后,父组件的样式将不会渗透到子组件中。不过一个子组件的根节点会同时受其父组件的 scoped CSS 和子组件的 scoped CSS 的影响。这样设计是为了让父组件可以从布局的角度出发,调整其子组件根元素的样式。 - 深度作用选择器:>>>
- 有些像 Sass 之类的预处理器无法正确解析
>>>
。这种情况下你可以使用/deep/
或::v-deep
操作符取而代之——两者都是>>>
的别名,同样可以正常工作。 - 通过
v-html
创建的 DOM 内容不受 scoped 样式影响,但是你仍然可以通过深度作用选择器来为他们设置样式
<style scoped>
.a >>> .b { /* ... */ }
</style>
会编译成
.a[data-v-f3f3eg9] .b { /* ... */ }
性能:
当 p { color: red }
是 scoped 时 (即与特性选择器组合使用时) 会慢很多倍。如果你使用 class 或者 id 取而代之,比如 .example { color: red }
,性能影响就会消除。