FrankKai / FrankKai.github.io

FE blog
https://frankkai.github.io/
362 stars 39 forks source link

Scoped CSS是什么? #176

Open FrankKai opened 4 years ago

FrankKai commented 4 years ago

当一个<style>标签有scoped属性时,它的CSS只作用于当前组件的元素。这和Shadow DOM的样式封装是一样的。它有一些警告(caveats),但是不需要任何填充(polyfill)。是通过PostCSS实现转换的:

<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>

混入本地和全局的样式(Mixing Local and Global Styles)

同一个组件里,可以同时包含本地样式和全局样式。

<style>
/* global styles */
</style>

<style scoped>
/* local styles */
</style>

子组件根元素

深度选择器

如果你想让在scoped styles上的选择器变得"deep",例如:影响子组件,可以使用>>>连接符。

<style scoped>
.a >>> .b {/*...*/}
</style>

上面的代码会编译成:.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