scoped 导致css样式不生效

1,576 阅读1分钟

scoped原理

在编译组件的时候,如果当前组件内style标签上有scoped属性,那么会在当前所有标签上添加一个data-v-hash属性

而当前样式表内的所有末尾选择器后面也会加上该属性,那么就使得当前组件内的样式只会作用于当前组件内的元素。

注意:

  • 当父组件,子组件同时使用scoped属性时,子组件最外层的标签既会被加上当前组件的hash值,又会加上父级组件的hash值,如<div data-v-b45036b2 data-v-384b136e ></div>

样式不生效问题

问题:

  • 在当前组件内使用的scoped,无法在当前组件内改变子组件的样式(非最外层标签)

原因:

  • 父组件内样式内解析的是父组件的hash值,而子组件内标签上添加的是子组件的hash值,对应不上即没效果

<style scoped>
.father-div .child-div{color:red;}
</style>

// 到了浏览器上会解析成
.father-div .child-div[data-v-b45036b2]{color:red;}

// 而标签上是这样的
<div data-v-384b136e></div>

解决办法

方法一

另写一个style标签,然后不加scoped属性,来盖子组件的样式

方法二

/deep/ 深度作用选择器

scss中使用::v-deep

5261630070456_.pic_hd.jpg

.father-div /deep/ .child-div{color:red;}

// 当遇到"/deep/“的时候会将”/deep/"的位置替换成组件的hash值,解析成

.father-div[data-v-b45036b2] .child-div{color:red;}

// 这样只需要注意css的权重就可以覆盖子组件内的样式了

5171630031860_.pic_hd.jpg

注意: 子组件内最外层的样式由于是带了父子组件的两个hash值,所以是会被两头控制的,不需要/deep/就可以在父组件内覆盖样式

参考文献