详解Vue中CSS样式穿透问题


Posted in Javascript onSeptember 12, 2019

1. 问题由来

在做两款H5的APP项目,前期采用微信官方推荐的weui组件库。后来因呈现的效果不理想,组件不丰富,最终项目完成后全部升级采用了有赞开发的vant组件库。同时将webpack顺利从3升级到4(项目结构 webpack+vue+vue-store+vue-router+vant+less)。相信好多做TOB的开发朋友都会选择顺手组件库。组件库内置了很多样式,方便了我们开发者,同时又因高度封装,有时也会给我们带来一点点困扰。比如,在使用vant组件库中的环形进度条时,查看官方文档,有改变进度条颜色,有改变轨道颜色,也有改变填充颜色。就是没有改变显示文字颜色的。凑巧的是,我们的需求就是要改变文字颜色。怎么办呢?写个css不就好了么。

2. 编写样式

为了说明情况,我为本文专门配合了一个测试demo。假如您现在也已经初始化好了一个Vue项目,并引入了我们需要的vant组件库。接下来,我们在components文件夹中新建一个CssScope.vue的单文件组件。基本代码如下:

<template>
<div><van-circle v-model="currentRate" :rate="90" :speed="100" :text="text" /></div>
</template>
<style lang="less" scoped>
</style>
<script>...</script>

编译运行,我们在浏览器就会看到一个进度为90%的环形进度条。当然显示文字90%显示是黑色,现在我们就来改变它。

最初我们想到,文字颜色color是可以从父级继承的,所以我们在Style标签中写下如下css样式:

<style lang="less" scoped>
.van-circle{color:blue;}
</style>

回到浏览器,文字颜色没变。通过Chrome的开者工具,找到我们的圆形进度条。才发现,原来,这个组件内部是一个svg 和 div 标签组成,svg用于显示我们图形,div用于显示文字。并且在这个div上存在一个class 为 van-circle__text。根据css优先级,我们刚在父级设置的字体颜色无效。找到原因,那就好办了。我们需要在Style标签中定义这个class选择器,并设置它字体颜色为蓝色。于是我们删除刚写的样式,改写为如下:

<style lang="less" scoped>
.van-circle{
  .van-circle__text{olor:blue;}
}
</style>

这下应该可以了,可回到浏览器,效果依旧。黑色,还是黑色。此时,回到chrome,在开发者工具找到我们的元素。仔细的你才发现,显示文字的标签和它的父级好像不一样,少个data-v-xxx的属性。也许是style的 scoped搞鬼,那我们就去掉。回到浏览器,文字颜色居然改变了。欢喜之余,总感觉哪里不对?我们得查查这个水鬼scoped

3. Style中的 Scoped神奇效果

我们的项目采用Less作为CSS 预处理语言。在组件中习惯于使用一个带有scoped属性的Style标签,scoped 属性的效果,就是在编译打包后,在当前组件能一眼看到的标签中统一添加一个随机的属性(下图 data-v-97a9747e)如下图所示:

详解Vue中CSS样式穿透问题

编译的css也会对于加上那个随机属性

详解Vue中CSS样式穿透问题

我们再在回到解决问题的那里,我们去掉了scoped后,Style标签里边的样式变成全局的了,这可不是我们想要的结果。不生效的原因,通过以上两图,已经一目了然。我们得穿透一下。怎么办?找文档?记得在vue-loader中找。

4. 深度作用选择器

从官方文档了解到,我们所谓的穿透,官方叫做深度选择器。怎么用的呢 ?就是在我们想穿透的选择器前边添加 >>> 或者 /deep/ 或者 ::v-deep。官方还说>>>可能存在问题,建议用后两者,我们用的less,就选择 /deep/ 好了,于是我们加回刚在style中删除的scoped属性,并修改为如下代码:

<style lang="less" scoped>
.van-circle {
 /deep/ .van-circle__text {
  color: blue;
 }
}
</style>

回到浏览器,颜色改变,大功告成。不过,我们还是得仔细检查检查,再次找到生成的css,如下图所示:

详解Vue中CSS样式穿透问题

对,没毛病,是我们要的结果。

4. 总结

写代码,查问题,得找对路径。用别人的东西,就多看看对应官方文档。

以上所述是小编给大家介绍的Vue中CSS样式穿透问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
为你的网站增加亮点的9款jQuery插件推荐
May 03 Javascript
JavaScript面向对象知识串结(读JavaScript高级程序设计(第三版))
Jul 17 Javascript
用JQuery在网页中实现分隔条功能的代码
Aug 09 Javascript
jQuery is()函数用法3例
May 06 Javascript
Jquery api 速查表分享
Jan 12 Javascript
《JavaScript高级编程》学习笔记之object和array引用类型
Nov 01 Javascript
js获取当前周、上一周、下一周日期
Mar 19 Javascript
微信小程序 数据遍历的实现
Apr 05 Javascript
angularJS实现动态添加,删除div方法
Feb 27 Javascript
vue中父子组件注意事项,传值及slot应用技巧
May 09 Javascript
React路由管理之React Router总结
May 10 Javascript
解决node-sass偶尔安装失败的方法小结
Dec 05 Javascript
微信小程序 函数防抖 解决重复点击消耗性能问题实现代码
Sep 12 #Javascript
微信小程序之 catalog 切换实现解析
Sep 12 #Javascript
layui实现checkbox的目录树tree的例子
Sep 12 #Javascript
layui表单提交到后台自动封装到实体类的方法
Sep 12 #Javascript
使用flow来规范javascript的变量类型
Sep 12 #Javascript
LayUI数据接口返回实体封装的例子
Sep 12 #Javascript
浅谈layui 数据表格前后台传值的问题
Sep 12 #Javascript
You might like
Apache设置虚拟WEB
2006/10/09 PHP
自己写的php curl库实现整站克隆功能
2015/02/12 PHP
php判断linux下程序问题实例
2015/07/09 PHP
php求今天、昨天、明天时间戳的简单实现方法
2016/07/28 PHP
php 数组处理函数extract详解及实例代码
2016/11/23 PHP
JavaScript 设计模式学习 Singleton
2009/07/27 Javascript
测试JavaScript字符串处理性能的代码
2009/12/07 Javascript
高性能WEB开发 flush让页面分块,逐步呈现 flush让页面分块,逐步呈现
2010/06/19 Javascript
jquery 图片轮换效果
2010/07/29 Javascript
js onkeypress与onkeydown 事件区别详细说明
2012/12/13 Javascript
基于jquery的has()方法以及与find()方法以及filter()方法的区别详解
2013/04/26 Javascript
js对图片base64编码字符串进行解码并输出图像示例
2014/03/17 Javascript
JS实现仿雅虎首页快捷登录入口及导航模块效果
2015/09/19 Javascript
Jquery promise实现一张一张加载图片
2015/11/13 Javascript
解决jquery插件:TypeError:$.browser is undefined报错的方法
2015/11/21 Javascript
Jquery对新插入的节点 绑定Click事件失效的解决方法
2016/06/02 Javascript
vue从使用到源码实现教程详解
2016/09/19 Javascript
Javascript中内建函数reduce的应用详解
2016/10/20 Javascript
js获取地址栏中传递的参数(两种方法)
2017/02/08 Javascript
微信小程序开发入门基础教程
2017/04/19 Javascript
NodeJs模拟登陆正方教务
2017/04/28 NodeJs
vue下跨域设置的相关介绍
2017/08/26 Javascript
Js利用prototype自定义数组方法示例
2017/10/20 Javascript
浅析js中mvvm模式实现的原理
2018/10/06 Javascript
如何基于filter实现网站整体变灰功能
2020/04/17 Javascript
微信小程序手动添加收货地址省市区联动
2020/05/18 Javascript
简单了解three.js 着色器材质
2020/08/03 Javascript
一篇超完整的Vue新手入门指导教程
2020/11/18 Vue.js
Python编写屏幕截图程序方法
2015/02/18 Python
Python中将字典转换为XML以及相关的命名空间解析
2015/10/15 Python
解决Python二维数组赋值问题
2019/11/28 Python
澳大利亚家居用品零售商:Harris Scarfe
2020/10/10 全球购物
设计顾问服务计划书
2014/05/04 职场文书
党的群众路线教育实践活动制度建设计划方案
2014/10/31 职场文书
开平碉楼导游词
2015/02/06 职场文书
Android Canvas绘制文字横纵向对齐
2022/06/05 Java/Android