解决vue+scss中使用 /deep/ 不生效

2,064 阅读2分钟

遇到的问题如下:

在这里插入图片描述

在这里插入图片描述

elementUI里使用复合input输入框时,默认append的样式不能满足后面经纬度符号的显示,并且背景颜色也有问题,对此进行样式修改,如下

在这里插入图片描述

但修改后的效果如第一张图所示没有任何效果,在Chrome里也并未出现上述样式,明显是没有选中。

在这里插入图片描述

于是想到深度选择器,依稀记得原来好像使用过/deep/深度选择器,不过vue编译报错 使用 >>> 选择器也不行,编译能通过,但不生效

在这里插入图片描述

于是在 vue-loader的官方文档 找到了解决办法,关于为什么/deep/选择器没有生效在此没有深入研究,欢迎大佬指正。 使用 ::v-deep 替换深度选择器后,虽然vsc的代码高亮没有识别出来,但是实际样式生效了

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

以上内容写自题主刚学习前端的时候,当时理解并不全面,以下是最近的补充。

需要深度选择器原因 是此样式是放在带有scoped属性的style标签内的,这种类型样式,在实际编译时会带上一个唯一的data-v值,vue在渲染组件的模板时也会给该组件的元素附上一个唯一的data-v值(可以在上图的开发者工具界面中看到),以保证其只在组件内生效。

而这个vue组件中引入的 其他组件 内的元素,并不会带上这样的data-v,所以CSS选择器才选择不到指定的元素。

工作后在公司写代码时也遇到了类似的问题,因为仓库webpack配置原因(用了魔改的vue-loader),无法支持深度选择器(即编译后始终后始终不生效)。

看到这里的朋友可以尝试另一种更友好的方式:在要更改样式的组件的父节点,添加一个特定的id或class(单个项目唯一命名),并在不带有scoped属性的style标签,用css父子选择器添加样式。如下:

<template>
  <!-- home-page即为特定的class名,保证其不会污染到其他元素即可 -->
  <div class="parent-node home-page">
    <el-input class="input-with-select">
      <el-select slot="append"></el-select>
    </el-input>
  </div>
</template>

<style scoped>
/* 一些组件内样式 */
</style>

<style lang="scss">
.home-page {
  .input-with-select {
    .el-input-groud__append {
      // 要设置的样式
    }
  }
}
</style>