vue中的三种样式穿透

991 阅读1分钟

背景

在之前的项目中,使用element-ul组件库对结构和样式进行搭建,需要用到样式穿透,特来分享

样式穿透是什么

我们说所的穿透,官方叫做深度选择器。就是在我们想穿透的选择器前边添加>>>或者 /deep/ 或者 ::v-deep

为什么要样式穿透呢

我们在写组件样式时通常如下代码:

<style scoped lang="scss">
.img-container {
   .img{
    border-radius: 50%;
    width: 100px;
    height: 100px;
  }
}
</style>

形成样式不起效的原因:

因为关键字scoped的原因,style标签内的样式只会对当前组件内容生效,也就是他只会对带有data-v-...属性的html元素生效。
但是如果这个img样式,是在某个第三方组件当中使用时,这个组件的class就是img,但他没有带有data-v-....,这时候我们这么写样式是无法生效的,会造成组件之间的样式覆盖所以就需要用到样式穿透。

编译器会将data-v-...放到了上一个标签选择器上面,

由此img样式只会对.img-container[data-v-...]下的HTML元素生效,

即完成了对classimg的HTML元素设置样式,又保证了不影响范围之外的img元素。

样式穿透, 有三种写法:

1、>>>

如果vue的style使用的是css,那么则

<style lang="css" scoped>
.a >>> .b { 
 /* ... */ 
}
</style>
复制代码

但是像 less ,scss等预处理器却无法解析>>>,所以我们使用下面的方式.

2、/deep/

<style lang="less" scoped>
.a{
 /deep/ .b { 
  /* ... */ 
 }
} 
</style>

在vue-cli3编译时,deep的方式会报错或者警告。
此时我们可以使用第三种方式

3、::v-deep

切记必须是双冒号

<style lang="scss" scoped>
.a{
 ::v-deep .b { 
  /* ... */ 
 }
} 
</style>