详解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 相关文章推荐
理解JavaScript中的事件
Sep 23 Javascript
javascript 弹出窗口中是否显示地址栏的实现代码
Apr 14 Javascript
onkeypress字符按键兼容所有浏览器使用介绍
Apr 24 Javascript
使用javascript:将其它类型值转换成布尔类型值的解决方法详解
May 07 Javascript
js关闭浏览器窗口及检查浏览器关闭事件
Sep 03 Javascript
JavaScript实现将文本框的值插入指定位置的方法
Aug 13 Javascript
JS组件系列之Bootstrap table表格组件神器【终结篇】
May 10 Javascript
解决Jstree 选中父节点时被禁用的子节点也会选中的问题
Dec 27 Javascript
vue动态设置img的src路径实例
Sep 18 Javascript
JS实现简单的抽奖转盘效果示例
Feb 16 Javascript
vuex 中插件的编写案例解析
Jun 10 Javascript
js实现随机点名程序
Sep 17 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
推荐个功能齐全的发送PHP邮件类
2007/01/03 PHP
PHP 杂谈《重构-改善既有代码的设计》之三 重新组织数据
2012/04/09 PHP
php数组相加 array(“a”)+array(“b”)结果还是array(“a”)
2012/09/19 PHP
Yii框架防止sql注入,xss攻击与csrf攻击的方法
2016/10/18 PHP
ubutu 16.04环境下,PHP与mysql数据库,网页登录验证实例讲解
2017/07/20 PHP
Laravel框架表单验证操作实例分析
2019/09/30 PHP
js自动闭合html标签(自动补全html标记)
2012/10/04 Javascript
JavaScript实现统计文本框Textarea字数增强用户体验
2012/12/21 Javascript
将HTML格式的String转化为HTMLElement的实现方法
2014/08/07 Javascript
jquery实现图片左右切换的方法
2015/05/07 Javascript
JavaScript实现非常简单实用的下拉菜单效果
2015/08/27 Javascript
jQuery时间插件jquery.clock.js用法实例(5个示例)
2016/01/14 Javascript
jQuery使用Selectator插件实现多选下拉列表过滤框(附源码下载)
2016/04/08 Javascript
JS基于正则实现数字千分位用逗号分隔的方法
2017/06/16 Javascript
JS中type=&quot;button&quot;和type=&quot;submit&quot;的区别
2017/07/04 Javascript
jQuery简单实现向列表动态添加新元素的方法示例
2017/12/25 jQuery
图片懒加载imgLazyLoading.js使用详解
2020/09/15 Javascript
浅谈angular4.0中路由传递参数、获取参数最nice的写法
2018/03/12 Javascript
详解Vue.js使用Swiper.js在iOS
2018/09/10 Javascript
Angular8基础应用之表单及其验证
2019/08/11 Javascript
微信小程序实现横向滚动导航栏效果
2019/12/12 Javascript
JavaScript交换变量的常用方法小结【4种方法】
2020/05/07 Javascript
uin-app+mockjs实现本地数据模拟
2020/08/26 Javascript
python类中super()和__init__()的区别
2016/10/18 Python
解析Python3中的Import
2019/10/13 Python
Html5 实现微信分享及自定义内容的流程
2019/08/20 HTML / CSS
你们项目是如何进行变更控制的
2015/08/26 面试题
参观监狱心得体会
2014/01/02 职场文书
幼儿园招生广告
2014/03/19 职场文书
大学毕业生推荐信
2014/07/09 职场文书
学校党的群众路线教育实践活动总结材料
2014/10/30 职场文书
2014年统战工作总结
2014/12/09 职场文书
党员示范岗材料
2014/12/19 职场文书
田径运动会通讯稿
2015/07/18 职场文书
接触艺术对孩子学习思维有益
2019/08/06 职场文书
Win11使用CAD卡顿或者致命错误怎么办?Win11无法正常使用CAD的解决方法
2022/07/23 数码科技