随手记一记之【Vue Scoped CSS】

使用 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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,267评论 19 139
  • 文署名雨林季风 你看我 我看你 看來看去 不如看我自己 困难哭过 幸福哭过 从今往后 生活灿烂无比 你笑过我苦 我...
    雨林季风阅读 7,406评论 39 66
  • 找一天的工作,太累的,洗完澡就上床睡觉。迷迷糊糊中居然听到了自己的心跳,嘣嘣嘣嘣。居然一下就精神了,真是太累了
    幽_059f阅读 1,522评论 0 0

友情链接更多精彩内容