美文网首页Vue.js专区Vue.js开发技巧Vue驿站
随手记一记之【Vue Scoped CSS】

随手记一记之【Vue Scoped CSS】

作者: woodccc | 来源:发表于2018-07-26 15:09 被阅读22次

使用 vue 的同学一定不会陌生 scoped。如果在 <style/> 标签中设置 scoped 属性,则它的样式只应用到当前组件的元素中。意味着想直接覆盖子组件的样式是不行的,但是可以使用特殊的方法实现。

举一个实际的例子, element 带状态表格。其状态的控制其实就是根据传入的函数,筛选出需要加状态的行,返回 className。然后再给该 className 自定义样式。但是示例代码的 style 是这样子写的:

<style>
  .el-table .warning-row {
    background: oldlace;
  }

  .el-table .success-row {
    background: #f0f9eb;
  }
</style>

并没有加 scoped 属性在 <style/> ,全局样式当然能够生效。问题是我想使用局部样式,只想在当前组件中应用这个状态。

PostCSS

设置 scoped 属性后,通过 PostCSS 转换代码:

<style scoped>
.example {
  color: red;
}
</style>

<template>
  <div class="example">hi</div>
</template>

装换结果为:

<style>
.example[data-v-f3f3eg9] {
  color: red;
}
</style>

<template>
  <div class="example" data-v-f3f3eg9>hi</div>
</template>

html 标签会自动加类似 data-v-f3f3eg9 这样的属性,css 也会用 .example[data-v-f3f3eg9]的方式转换。

子组件根元素

如果想使用 .example .child { }去覆盖子组件中的样式,并不会生效。使用 scoped 后,父组件的样式不会渗透到子组件中。但是子组件的根节点会受影响,这样设计是为了让父组件可以从布局的角度出发,调整其子组件根元素的样式。

深度作用选择器

如果想让类似 .example .child { } 样式生效,可以使用 >>> 操作符。有些 css 预处理器无法解析 >>> 操作符,可以使用 /deep/ 代替。例如:

<style scoped>
.example >>> .child { /* ... */ }
</style>

编译为:

.example[data-v-f3f3eg9] .child { /* ... */ }

参考

Scoped CSS

相关文章

网友评论

    本文标题:随手记一记之【Vue Scoped CSS】

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