vue-loader的深度作用选择器

583 阅读1分钟

深度作用选择器(>>>)

在项目开发中,不可避免的会使用到第三方的组件库,但是有时提供的组件UI并不能如我们的预期,因此需要自行定制。如果这些组件采用的是有作用域的CSS,父组件想要定制第三方组件的样式就比较麻烦了。

不过vue-loader的一个功能:深度作用选择器可以助我们一臂之力。

<template>
<div>
  <h1 class="child-title">
    如果你希望 scoped 样式中的一个选择器能够作用得“更深”,例如影响子组件,你可以使用 >>> 操作   
  </h1>
</div>
</template>
<script>
export default {
  name: 'child',
  data() {
    return {}
  }
}
</script>
<style scoped>
.child-title {
  font-size: 12px;
}
</style>

上面的child组件中 .child-title 的作用域CSS设定字体大小为12px,现在想在父组件中定制为大小20px,颜色为红色。

<template>
<div>
  <child class="parent-custom"></child>
</div>
</template>
<script>
import Child from './child'
export default {
  name: 'parent',
  components: {
    Child
  },
  data() {
    return {}
  }
}
</script>
<style>
.parent-custom  >>> .child-title {
  font-size:20px;
  color: red;
}
</style>

但是以上的效果只能是使用原生的CSS来写,如果使用了less或者sass来写,则会收到一个报错,因为预处理器无法识别>>>这个符号。

预处理器的解决方案

<style lang="less">
@deep: ~'>>>';
.parent-custom {
  @{deep} .child-title {
    font-size:20px;
    color: red;
  }
}
</style>
<style lang="scss">
.parent-custom {
 \deep\ .child-title {
    font-size:20px;
    color: red;
  }
}
</style>