Open FrankKai opened 4 years ago
当一个<style>标签有scoped属性时,它的CSS只作用于当前组件的元素。这和Shadow DOM的样式封装是一样的。它有一些警告(caveats),但是不需要任何填充(polyfill)。是通过PostCSS实现转换的:
<style>
<style scoped> .example { color: red; } </style> <template> <div class="example">hi</div> </template>
转化成下面的:
<style> // 选择有data-v-f3f3eg9属性,并且class名为example的元素 .example[data-v-f3f3eg9] { color: red; } </style> <template> <div class="example" data-v-f3f3eg9>hi</div> </template>
同一个组件里,可以同时包含本地样式和全局样式。
<style> /* global styles */ </style> <style scoped> /* local styles */ </style>
如果你想让在scoped styles上的选择器变得"deep",例如:影响子组件,可以使用>>>连接符。
>>>
<style scoped> .a >>> .b {/*...*/} </style>
上面的代码会编译成:.a[data-v-f3f3eg9] .b {/* ... */}
.a[data-v-f3f3eg9] .b {/* ... */}
一些预处理器,例如Sass,不能解析>>>属性。这些情况下,你使用/deep/或::v-deep连接符可以取代,这两个操作符是>>>等效的。
为什么用p会慢很多?
因为如果是元素选择器,无论是局部还是全局,浏览器需要在所有元素上搜索,几乎是从头到尾去解析,这个过程是耗性能的。而如果是类选择器或者是id选择器,只要从选择器列表中去找到即可,性能更好。
参考资料:https://vue-loader.vuejs.org/guide/scoped-css.html#mixing-local-and-global-styles
当一个
<style>
标签有scoped属性时,它的CSS只作用于当前组件的元素。这和Shadow DOM的样式封装是一样的。它有一些警告(caveats),但是不需要任何填充(polyfill)。是通过PostCSS实现转换的:转化成下面的:
混入本地和全局的样式(Mixing Local and Global Styles)
同一个组件里,可以同时包含本地样式和全局样式。
子组件根元素
深度选择器
如果你想让在scoped styles上的选择器变得"deep",例如:影响子组件,可以使用
>>>
连接符。上面的代码会编译成:
.a[data-v-f3f3eg9] .b {/* ... */}
一些预处理器,例如Sass,不能解析>>>属性。这些情况下,你使用/deep/或::v-deep连接符可以取代,这两个操作符是>>>等效的。
动态生成内容
时刻提醒自己
为什么用p会慢很多?
因为如果是元素选择器,无论是局部还是全局,浏览器需要在所有元素上搜索,几乎是从头到尾去解析,这个过程是耗性能的。而如果是类选择器或者是id选择器,只要从选择器列表中去找到即可,性能更好。
参考资料:https://vue-loader.vuejs.org/guide/scoped-css.html#mixing-local-and-global-styles