scoped属性与 element-ui 样式

1 、vue 文件中 style 标签内 scoped 后,有时候需要修改 elemet-ui 控件样式,但是发现不成功。

  想找到解决方案,首先来看看不生效的原因

  1)、首先,scoped 是如何实现局部样式的?

   查看 vue-loader 文档,根据文档可以知道,当 <style> 标签有 scoped 属性时,会对组件内的元素加上一个类似于 data-v-f3f3eg9 的独特标签,组件内的样式只会对带有这个标签的 DOM 元素生效,因此加上 scoped 后,组件内的样式不会影响组件外。

 2)、那 scoped 为什么对第三方子组件内的 dom 元素不生效

   子组件的根元素

      使用 scoped 后,父组件的样式将不会渗透到子组件,不过一个子组件的根节点会同时受其父组件的 scoped 和子组件的 scoped CSS 的影响。这样设计时为了让父组件可以从布局的角度出发,调整其根元素的样式。

      这段话,也就是说采用 scoped 后,对组件A内采用的子组件,只会对其根元素加上组件A的独特标签,因此对子组件的根元素改变样式能生效,而对非根元素是不生效的。

 

例、

<div class="test">
    <el-button>按钮</el-button>
</div>
<style lang="less" scoped>
.test{
  .el-button span{
    background:red;
  }
}
</style>

 

   上图中 data-v-5752faac 是当前组件 test 的独特标签(其他是父元素带上的,这里忽略),可以看到子组件 el-button 带上了此标签,而非根元素 span 没带上,因此对 span 的修改是不生效的,此时如果手动在span元素上加上 data-v-5752faac,会发现样式生效。

 

解决方案:

方案一、 加上一个非 scoped 样式

<style>
.test{
  .el-button span{
    background:red;
  }
}
</style>

<style scoped>
/* 本地样式 */
</style>

 

方案二、采用深度选择器,组件的样式可以渗透到子组件相应的元素上

 1、  >>>

 2、deep(less语法中)、

 3、/deep/(sass语法中)选择器

 

posted on 2022-02-25 14:41  zhishiyv  阅读(279)  评论(0编辑  收藏  举报

导航