vue中修改第三方组件的样式不生效
问题
在使用element-ui时,有时候想要修改组件内的样式,但不成功,例如
<div class="test">
<el-button>按钮</el-button>
</div>
<style lang="less" scoped>
.test{
.el-button span{
background:red;
}
}
</style>
以上对.el-button span
的样式不生效
问题的原因
想要找到解决方案,我们先来看看不生效的原因。
1)首先,scoped是如何实现局部样式的?
查看vu-loader文档,根据文档可以知道,当 <style>
标签有 scoped
属性时,会对组件内的元素加上一个类似于data-v-f3f3eg9
的独特标签,组件内的样式只会对带有这个标签的dom元素生效,因此加上scoped
后,组件内的样式不会影响组件外。
2)那scoped为什么对第三方子组件内的dom元素不生效?
文档中提到
仔细阅读这句话,也就是说采用scoped
后,对组件A内采用的子组件,只会对其根元素加上组件A的独特标签,因此对子组件的根元素改变样式能生效,而对非根元素是不生效的。因此上面的例子如果改为对根元素.el-button修改样式,就会生效
<style lang="less" scoped>
.test{
.el-button{
background:red;
}
}
</style>
可以看下具体的dom元素,如图
上图中data-v-5752faac是当前组件test的独特标签(其他是父元素带上的,这里忽略),可以看到子组件el-button的根元素带上了此标签,而非根元素span没带上,因此对span的修改是不生效的,此时如果手动在span元素上加上data-v-5752faac,会发现样式生效
3)不仅限于第三方组件
从上面的分析来看,其实不仅限于第三方组件,任何采用到的子组件,只要是想修改子组件的非根元素都是不生效的
解决方案
- 【方案一】加上一个非scoped样式
根据文档可知,vue可以混用本地和全局样式,因此对子组件的非根元素样式修改,可以单独放在一个非 scoped 样式中
<style>
.test{
.el-button span{
background:red;
}
}
</style>
<style scoped>
/* 本地样式 */
</style>
- 【方案二】采用/deep/
加上/deep/,组件的样式可以渗透到子组件相应的元素上
<style lang="less" scoped>
.test{
/deep/ .el-button span{
background:red;
}
}
</style>
参考文档
vu-loader文档
vue中修改第三方组件的样式不生效的更多相关文章
- vue中修改第三方组件的样式并不造成污染
vue引用了第三方组件, 需要在组件中局部修改第三方组件的样式, 而又不想去除scoped属性造成组件之间的样式污染. 此时只能通过>>>,穿透scoped. 但是,在sass中存在 ...
- vue中修改子组件样式
一.问题叙述 项目里需要新添加一个表单页面,里面就只是几个select,这个几个select是原本封装好的组件,有自己原本的样式,而这次的原型图却没有和之前的样式统一起来,需要微调一下,这里就涉及到父 ...
- Vue中的scoped及穿透方法(修改第三方组件局部的样式)
何为scoped? 在vue文件中的style标签上,有一个特殊的属性:scoped.当一个style标签拥有scoped属性时,它的CSS样式就只能作用于当前的组件,也就是说,该样式只能适用于当前组 ...
- 如何在vue中修改动态标签中的样式和修改组件库样式
vue中修改动态标签中的样式和修改组件库样式 因为vue中的标签在渲染的时候,都会给标签加上id 所以你想在<style lang="scss" scoped>直接修改 ...
- vue中滚动页面,改变样式&&导航栏滚动时,样式透明度修改
vue中滚动页面,改变样式&&导航栏滚动时,样式透明度修改.vue <div class="commonHeader" v-bind:class=" ...
- 【Vue】Vue中的父子组件通讯以及使用sync同步父子组件数据
前言: 之前写过一篇文章<在不同场景下Vue组件间的数据交流>,但现在来看,其中关于“父子组件通信”的介绍仍有诸多缺漏或者不当之处, 正好这几天学习了关于用sync修饰符做父子组件数据双向 ...
- vue中的父子组件相互调用
vue中的父子组件相互调用: 1.vue子组件调用父组件方法:子组件:this.$emit('xx'); 父组件:定义yy方法,并在引用子组件时传参,如@xx="yy" 2.vue ...
- vue中使用第三方插件animate.css实现动画效果
vue中使用第三方插件animate.css实现动画效果1.首先先引入第三方类animated.css2.将你所需要动画的标签用包裹起来3.在transition元素中添加enter-active-c ...
- Vue——解决使用第三方组件库时无法修改默认样式的问题(使用 /deep/ )
最近在开发一个基于Vue的后台管理系统,其中使用了element-ui第三方ui组件库.使用过组件库的人都知道,第三方组件往往会有一些默认的样式,而有些又是我们想要改变的. 一.基础(了解 <s ...
随机推荐
- MyBatis_01 框架
Mybatis概述 Mybatis是什么 Mybatis是一个持久层框架. Mybatis的作用 Mybatis是一个持久层框架,当然作用就是操作数据库的(增删改查). 为什么需要学习Myba ...
- css 小图标 & iconfont 字体图标
前言:这是笔者学习之后自己的理解与整理.如果有错误或者疑问的地方,请大家指正,我会持续更新! iconfont 字体图标 我们的需求中,很多时候会看到一些小的图形,或者叫图标,比如天猫网站中: ...
- Html Agility Pack 使用 XPath 选择器
想做一个爬虫程序,以前用的一直使用CSS选择器的html解析插件,最近做的项目想使用 Html Agility Pack 来做解析 Html Agility Pack使用 XPath 和 Linq 来 ...
- Java Web 深入分析(2) DNS
DNS :Domain Name System,域名系统 ,通俗的来说需要把我们日常见到的URL 网址信息解析成IP地址,例如 DNS域名解析过程 用户浏览器:用户在浏览器地址栏输入域名进行访问,浏览 ...
- 再谈.NET委托(delegate、Func<>)
为了演示委托,我们先来定义一个方法:public static bool IsTen(int i){ return i == 10 ? true : false;} 如果要用自定义委托,则需要声 ...
- JavaScript Drum kit
用 JavaScript 实现网页鼓乐器,相关的初始代码在 JavaScript30 官网和 GitHub 上已经存在.我把 sound 文件夹下的音频全部替换掉了,一些相关解释也直接在注释中标明. ...
- #LOF算法
a.每个数据点,计算它与其他点的距离 b.找到它的K近邻,计算LOF得分 clf=LocalOutlierFactor(n_neighbors=20,algorithm='auto',contamin ...
- Linux赋予root权限
按照帖子都一一尝试了下 https://blog.csdn.net/yajie_china/article/details/80636783 首先增加用户和给新用户创建密码,都不用说 用useradd ...
- Install RabbitMQ on CentOS 7
NOTE: this article is only for CentOS 7 How to Install RabbitMQ on CentOS 7 yum update Install erlan ...
- js面向对象篇(一)
Javascript是一种基于对象(object-based)的语言,你遇到的所有东西几乎都是对象.但是,它又不是一种真正的面向对象编程(OOP)语言,因为它的语法中没有class(类). ----摘 ...