css 中 scoped 如何实现

64 阅读1分钟

前言

为什么 <style scoped> 不会造成样式污染,影响其他样式。

一、简单看一下vue编译或的结果

image.png

发现每个标签几乎多了一个 “属性选择器” data-v-xxxxx

vue就是通过属性选择器来实现对css样式的隔离

二、生成规则

为什么有的标签有两个或多个属性选择器

根据这个Scoped CSS特性,父组件的样式不会渗透到子组件的样式,但是根节点会同时受其父组件的 scoped CSS 和子组件的scoped CSS的影响。所以会同时拥有两个属性选择器 data-v-xxxxx

父组件:

image.png

子组件:

image.png

三、如果要选择子组件如何实现?

通过深度作用选择器 可以使用 >>> 操作符:

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

上述代码将会编译成:

.a[data-v-f3f3eg9] .b { /* ... */ }

参考链接: