霓虹星宝闯地球
14.25MB · 2025-12-07
如果你希望 scoped 样式中的一个选择器能够作用得“更深”,例如影响子组件,你可以使用 >>> 操作符:
<style scoped>.a >>> .b { /* ... */ }</style>上述代码将会编译成:
.a[data-v-f3f3eg9] .b { /* ... */ }有些像 Sass 之类的预处理器无法正确解析 >>>。这种情况下你可以使用 /deep/ 或 ::v-deep 操作符取而代之——两者都是 >>> 的别名,同样可以正常工作。
当你不想写全局样式,想写scoped局部样式不污染全局,又想更改子组件内的样式,此时就可以用/deep/深度作用选择器.满足你所有想法
1.scoped会给局部区域的非组件元素和组件根元素(不含组件内子元素)增加一个不重复的data属性
2.加了scoped后若写样式,会在每句css选择器的末尾(编译后生成的css语句)加一个当前组件(大的.a)的data属性选择器,若多层也是给最后末尾设置
因给.c设置了.a的属性选择器,然后.c属于子组件内的子元素不会增加.a的属性所以自然获取不到此元素 样式无效
//.a为大div父组件 .b为子组件根元素 .c为子组件内的子元素 .a .b .c{//多层 color:red } //会渲染成 .a .b .c[data-v-2311c06a]{ color:red }当scoped时,#app是父组件 button是子组件内的子元素 [data-v-7ba5bd90]是app的属性
//渲染前的源代码 #app button{ background-color: red; } #app /deep/ button{ background-color: yellow; }//不加/deep/的渲染效果 样式无效#app button[data-v-7ba5bd90] { background-color: red;}//加了/deep/的渲染效果 样式有效#app[data-v-7ba5bd90] button { background-color: yellow;}[data-v-7ba5bd90]是app的属性,button是子组件内的子元素并无此属性,所以不加/deep/样式,获取不到元素,样式无效
加了/deep/后 属性选择器跑到前面去了
//渲染前 #app /deep/ button{ background-color: yellow; span{ color:blue; } }//渲染后 样式有效#app[data-v-7ba5bd90] button span { color: blue;}//渲染前 #app button{ /deep/ span{ color:pink; } }//渲染后 data-v-7ba5bd90是#app的属性 所以无效#app button[data-v-7ba5bd90] span { color: pink;}//渲染前 #app button{ span{ /deep/ span{ color:pink } } }//渲染后#app button span[data-v-7ba5bd90] span { color: pink;}综上可以看出.在哪里加的/deep/ ,data属性选择器就会跑到写的上一层去.
多个/deep/的情况下,只有最外层的/deep/有效,内层的其他/deep/都是无效的,写了也没意义,不建议写.
//渲染前 #app /deep/ button{ /deep/ span{ color:yellow } }//打包后的样式显示#app[data-v-7ba5bd90] button /deep/ span { color: yellow;}