问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

vue让某个组件的样式不受全局样式影响

发布网友 发布时间:2022-04-23 20:24

我来回答

3个回答

懂视网 时间:2022-05-11 09:43

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)如下图所示:

编译的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,如下图所示:

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

4. 总结

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

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

热心网友 时间:2022-05-11 06:51

在组件中使用scoped属性,父组件的style样式将不会渗透到子组件中,然而子组件的根节点元素会同时被设置了scoped的父css样式和设置了scoped的子css样式影响,这么设计的目的是父组件可以对子组件根元素进行布局

热心网友 时间:2022-05-11 08:09

楼主你好,在vue中 style 标签有 scoped 属性时,它的 CSS 只作用于当前组件中的元素,防止样式的全局污染,如果组件内部还有组件,只会给最外层的组件里的标签加上唯一属性字段,不影响组件内部引用的组件( 注意 )。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
粒上皇开口熟栗120g*5袋(共600g)-详细介绍 三皇王板栗介绍 品牌榜:2024年板栗十大品牌排行榜 投票结果公布【新】 为什么来大姨妈胸会胀 少儿学什么舞蹈 青年学什么舞蹈好 成年人学什么舞蹈 福州企业最低工资标准 2013年厦门的底薪是多少 生产要素的需求有哪些性质 如何利用Vue.js库中的v-bind绑定样式属性 vue前端样式问题? vue样式绑定 vue 修改样式添加!important不起作用怎么办? vue怎么绑定style样式改变div宽度 vue从后台获取的数据有html标签通过v-html渲染到页面,然后怎么给这里面... vue怎么提取sass的样式,需要webpack的什么配置 用webpack打包的vue组件怎么引入css样式跟js样式 怎么学看音乐中的拍子啊? 如何在Vue中有条件地使用CSS类 到淘宝买东西什么叫拍下啊!怎么拍了 跳舞用嘴喊拍子一般都是怎么喊的? 微信中拍一拍头又叫一声大哥的功能如何操作? 开一家私营药店,要具备什么条件才可以办合作医疗,或者通过哪些部门可以办理定点药店合作医疗。 只回答_百度问一问 38妇女节为妈妈做什么事能让妈妈大吃一惊,仔细点的。要快 三八妇女节送给妈妈的礼物 妇女节送什么给妈妈好? 明天3月8日妇女节,你给妈妈准备了什么惊喜,准备怎么过,把经过和你的心情记录? 三八妇女节,怎样给妈妈一个惊喜 妇女节要到了 想给妈妈一个惊喜。不知道各位有何高见? vue为什么更改element里面的样式只能是全局样式加了scope没有效果_百度... css内联样式与Vue的data引入的style样式有什么本质的区别??? 笔记本电脑DNS服务器未响应怎么办? 奇瑞汽车有多少车型 奇瑞有多少个子品牌? DNS服务器未响应怎么弄? 奇瑞有哪几款车型? dns 服务器未响应 怎么解决 奇瑞汽车有什么车型? dns服务器未响应怎么设置 奇瑞汽车有哪几款车型? 奇瑞汽车现主要车型有几种? DNS服务器未响应.怎么弄 奇瑞汽车旗下4大品牌是什么? 笔记本电脑的DNS服务器未响应怎么办? 奇瑞汽车所有车型有哪些款? 华硕笔记本dns服务器未响应怎么解决 dns服务器未响应,怎么解决? 奇瑞汽车有哪些品牌? 奇瑞汽车有哪几种车型,怎么界别