Vue笔记 - 样式穿透原理及使用方法
样式穿透
1. 为什么需要样式穿透
-
在开发中引入了第三方组件库(如element-ui),但又想要修改第三方组件库中组件的样式。
组件库中的组件往往都有自己的样式,有时在开发中需要做出一定的调整。但是由于scoped的问题,有时对组件的样式修改会失效。而一旦去掉scoped,又会导致各种组件之间样式覆盖,此时就需要使用样式穿透了
-
需要明确一点:并不是所有第三方组件库组件的样式修改都需要样式穿透 (详情请看下文)
1.1 为什么样式会失效
-
为什么有时在修改第三方组件样式时,样式不生效?为什么有时又能直接修改?
/*无效*/ .el-dialog { width: 100%; } /*有效*/ .el-input { width: 198px; }
产生问题的原因很大程度上与scoped有关
-
scoped的原理
scoped底层是通过在
DOM节点
中添加data-v-xxx
,CSS
中通过添加[data-v-xxx]
属性过滤,提高优先级,来实现样式的私有化。也就是说,上面两种组件的运行代码在scoped的作用下实际上长这样:
- el-input
- el-dialog
由此可以看出一个问题,那就是
el-dialog__wrapper
下面的子组件并没有被scoped添加标记,也就是说scoped内的样式并没有对它们生效。但是对于el-input
,scoped成功对它添加了标记,设置的样式也就能对它生效了 -
那么在什么情况下scoped会添加标记呢
scoped在渲染的时候,如果组件内部还有子组件,只会在父组件,以及子组件的根元素加上
data-v-xxx
属性
2. 如何使用样式穿透
-
less写法
/deep/ .el-table__body-wrapper { cursor: pointer; }
-
scss写法
::v-deep .el-table::before { background-color: transparent; }
2.1 实例
我想要修改element-ui中breadcrumb(面包屑)的字体颜色
直接修改el-breadcrumb__item
的字体颜色是不行的,因为字体颜色属性存在于子组件el-breadcrumb__inner
之中,因为scoped的影响无法直接修改它的样式,所以只能使用样式穿透
.header-container {
.l-content {
/deep/.el-breadcrumb__item {
.el-breadcrumb__inner {
font-weight: normal;
&.is-link {
color: #666;
}
}
&:last-child {
.el-breadcrumb__inner {
color: #fff;
}
}
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2021-11-20 如何创建并运行一个Servlet程序