vue中style scope深度访问方式

作者: 嘻哈章鱼小丸子 | 来源:发表于2020-10-17 17:12 被阅读0次

背景:
vue-cli3.0项目中需要修改element-ui collapse collapse-item 的样式(背景色等),template简单如下:

  <el-collapse class="my-collapse">
      <el-collapse-item title="分类1" name="1" class="plugins-collapse-item">
        <span>分类1</span>
      </el-collapse-item>
      <el-collapse-item title="分类2" name="2">
       <span>分类2</span>
      </el-collapse-item>
    </el-collapse>

试了scoped局部样式,完全不生效。

<style lang="scss" scoped>
 .el-collapse-item {
    .el-collapse-item__header {
      background: #262720;
      color: #ffffff;
      height: 24px;
      line-height: 24px;
      font-size: 12px;
      border-bottom: 1px solid #4b4c44;
      display: flex;
      flex-direction: row-reverse;
      justify-content: flex-end;
      .el-collapse-item__arrow {
        margin: 0;
        margin-right: 5px;
      }
    }
    .el-collapse-item__wrap {
      background: #262720;
      border-bottom: 1px solid #4b4c44;
      color: #ffffff;
      .el-collapse-item__content {
        color: #ffffff;
        padding-bottom: 0;
        line-height: 18px;
      }
    }
  }
</style>

去掉scoped,写在全局样式里,生效了!

<style lang="scss">
///上述代码
</style>

第一次试全局样式没生效,找到原因:没写父类class .el-collapse-item,层级加载顺序出了问题,样式被覆盖了。

虽然全局样式可以解决,但是不想写在全局样式里,怎么办呢?找到了Deep Selectors,可以在父组件中修改子组件的样式,那咱就来尝个鲜吧。

  • 在css中,使用 >>>
<style >
 .el-collapse-item >>> .el-collapse-item__header {
  background: #262720;
  color: #ffffff;
  height: 24px;
  line-height: 24px;
  font-size: 12px;
  border-bottom: 1px solid #4b4c44;
  display: flex;
  flex-direction: row-reverse;
  justify-content: flex-end;
}

.el-collapse-item >>> .el-collapse-item__wrap {
  background: #262720;
  border-bottom: 1px solid #4b4c44;
  color: #ffffff;
} 
</style>
  • 在无法正确解析>>>的预处理器中(例如sass)使用 /deep/ or ::v-deep
.el-collapse-item {
    ::v-deep .el-collapse-item__header {
      background: #262720;
      color: #ffffff;
      height: 24px;
      line-height: 24px;
      font-size: 12px;
      border-bottom: 1px solid #4b4c44;
      display: flex;
      flex-direction: row-reverse;
      justify-content: flex-end;
      .el-collapse-item__arrow {
        margin: 0;
        margin-right: 5px;
      }
    }
    ::v-deep .el-collapse-item__wrap {
      background: #262720;
      border-bottom: 1px solid #4b4c44;
      color: #ffffff;
      .el-collapse-item__content {
        color: #ffffff;
        padding-bottom: 0;
        line-height: 18px;
      }
    }
  }

编译后的结果:


/deep/ or ::v-deep

实现逻辑在插件component-compiler-utils里,附上component-compiler-utils解析scope的源码:

scope解析

参考:
vue中style scope深度访问新方式(::v-deep)

相关文章

网友评论

    本文标题:vue中style scope深度访问方式

    本文链接:https://www.haomeiwen.com/subject/xzgupktx.html