vue组件样式scoped
1.vue组件中的样式如果没加scrped,样式代表的是全局样式(避免组件之间样式的冲突)。加了属性代表是模块化的。
其他组件引用button组件
上面分析了单个组件渲染后的结果,那么组件互相调用之后会出现什么样的结果呢?,具体分两种情况:模块一般组件引用模块私有组件(本质和模块私有组件引用模块一般组件一样);模块私有组件引用模块私有组件。
举个例子:在组件content.vue中使用了button组件,那么content.vue组件是否添加scoped属性渲染出来的结果有什么区别呢?
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
//content.vue<template> <div class="content"> <p class="title"></p> <!-- v-button假设是上面定义的组件 --> <v-button></v-button> </div></template>...<style> .content{ width: 1200px; margin: 0 auto; } .content .button{ border-raduis: 5px; }</style> |
模块一般组件(未添加scoped)引用模块私有组件
如果style上没有加scoped属性,那么渲染出来html和css分别就是:
|
1
2
3
4
5
6
7
|
<div class="content"> <p class="title"></p> <!-- v-button假设是上面定义的组件 --> <div data-v-2311c06a class="button-warp"> <button data-v-2311c06a class="button">text</button> </div></div> |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
/*button.vue渲染出来的css*/.button-warp[data-v-2311c06a]{ display:inline-block;}.button[data-v-2311c06a]{ padding: 5px 10px; font-size: 12px; border-radus: 2px;}/*content.vue渲染出来的css*/.content{ width: 1200px; margin: 0 auto;}.content .button{ border-raduis: 5px;} |
可以看出,虽然在content组件中,修改了button的border-raduis属性,但是由于权重关系,生效的依然是组件内部的样式(此时是外部的样式被覆盖)。所以如果要达到修改样式的目的,就必须加重我们要修改样式的权重(增加选择器层级,ID选择器,并列选择器,impotant等)
模块私有组件(添加scoped)引用模块私有组件
如果加了scoped属性呢?按照开始分析出来的规则(事实也是这么的):
首先是在所有的DOM节点加上data属性
然后在css选择器尾部加上data属性选择器
那么渲染出来html和css分别就是:
|
1
2
3
4
5
6
7
|
<div data-v-57bc25a0 class="content"> <p data-v-57bc25a0 class="title"></p> <!-- v-button假设是上面定义的组件 --> <div data-v-57bc25a0 data-v-2311c06a class="button-warp"> <button data-v-2311c06a class="button">text</button> </div></div> |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
/*button.vue渲染出来的css*/.button-warp[data-v-2311c06a]{ display:inline-block;}.button[data-v-2311c06a]{ padding: 5px 10px; font-size: 12px; border-radus: 2px;}/*content.vue渲染出来的css*/.content[data-v-57bc25a0]{ width: 1200px; margin: 0 auto;}.content .button[data-v-57bc25a0]{ border-raduis: 5px;} |
对于上面的两种情况,可以明显看出来渲染后的结果大不相同。
虽然我们在content添加了想要修改button组件的样式的代码,但是仔细看,由于.content .button这句在末尾加的是content组件的scoped标记,最后这句其实根本作用不到我们想要的DOM节点上,所以这种情况我们在content内部写的任何样式都不会影响到button.vue组件,所以这就尴尬了。。。。
当然这个问题也是可以解决的,就是直接加全局样式可以修改到,但这势必会影响全部地方的组件;所以需要另外一种方法在content.vue组件内再加一个不带scoped属性的style标签,也就意味着要加两个style,一个用于私有样式,一个用于共有样式。这肯定是有点shit的,并且这两种解决方案都回避不了一个问题:权重!!!
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
//content.vue<template> <div class="content"> <p class="title"></p> <!-- v-button假设是上面定义的组件 --> <v-button></v-button> </div></template>...<style scoped> .content{ width: 1200px; margin: 0 auto; }</style><style> .content .button{ border-raduis: 5px; }</style> |
这样符合规范么?貌似没看到不能这么写,并且这么写也确实生效了。。。但这样确实增加了思维的复杂度,有点苦恼啊。
2.
总结一下scoped三条渲染规则
- 给HTML的DOM节点加一个不重复data属性(形如:data-v-2311c06a)来表示他的唯一性
- 在每句css选择器的末尾(编译后的生成的css语句)加一个当前组件的data属性选择器(如[data-v-2311c06a])来私有化样式
- 如果组件内部包含有其他组件,只会给其他组件的最外层标签加上当前组件的data属性
vue组件样式scoped的更多相关文章
- vue组件样式添加scoped属性之后,无法被父组件修改。或者无法在本组件修改element UI样式
在vue开发中,需要使用scoped属性避免样式的全局干扰,但是这样在父组件中是无法被修改的,不仅如此如果项目中用了UI框架比如element Ui,这个时候在本组件也无法修改样式,因为权重问题.但是 ...
- vue 组件样式如何不影响全局
可以在 "style" 标签中添加 "scoped" 属性. <style scoped> .red { color: #f00; } </s ...
- vue组件如何被其他项目引用
自己写的vue组件怎么才能让其他人引用呢,或者是共用组件如何让其他项目引用.本文就粗细的介绍下,如有疑问欢迎共同讨论.在这里你能了解下如下知识点: 1. 如何发布一个包到npmjs仓库上 2.如何引用 ...
- vue scoped 穿透_vue 修改内部组件样式问题
何为scoped? 在vue文件中的style标签上,有一个特殊的属性:scoped.当一个style标签拥有scoped属性时,它的CSS样式就只能作用于当前的组件,也就是说,该样式只能适用于当前组 ...
- vue组件中的样式属性:scoped,解决在父组件中无法修改子组件样式问题
Scoped CSS规范是Web组件产生不污染其他组件,也不被其他组件污染的CSS规范. vue组件中的style标签标有scoped属性时表明style里的css样式只适用于当前组件元素,它是通过使 ...
- vue组件中的样式属性--scoped
Scoped CSS Scoped CSS规范是Web组件产生不污染其他组件,也不被其他组件污染的CSS规范. vue组件中的style标签标有scoped属性时表明style里的css样式只适用于当 ...
- Vue中的scoped及穿透方法(修改第三方组件局部的样式)
何为scoped? 在vue文件中的style标签上,有一个特殊的属性:scoped.当一个style标签拥有scoped属性时,它的CSS样式就只能作用于当前的组件,也就是说,该样式只能适用于当前组 ...
- Vue+element-ui 重置组件样式的写法
两种方式实现element-ui组件的样式 方案1:重置的公共组件样式的写法如下 然后在main.js中引入 import '@/assets/css/element.css' 方案2:每个.vu ...
- 在vue组件中style scoped中遇到的坑
在uve组件中我们我们经常需要给style添加scoped来使得当前样式只作用于当前组件的节点.添加scoped之后,实际上vue在背后做的工作是将当前组件的节点添加一个像data-v-1233这样唯 ...
随机推荐
- 快速入门分布式消息队列之 RabbitMQ(3)
目录 目录 前文列表 前言 通道 Channel 一个基本的生产者消费者实现 消费者 生产者 运行结果 应用预取计数 应用 ACK 机制 最后 前文列表 快速入门分布式消息队列之 RabbitMQ(1 ...
- 有关MSSQL2000在Win7上的安装
https://baijiahao.baidu.com/s?id=1593533837896849226&wfr=spider&for=pc 怎么在win7下安装sql server2 ...
- 安装CentOS7虚拟机
基础环境 Windows 10 VMware Workstation 1.下载CentOS7镜像 https://www.centos.org/download/ 此次安装使用的版本为: CentOS ...
- C语言黑与白问题
问题描述: 有A.B.C.D.E这5个人,每个人额头上都帖了一张黑或白的纸.5人对坐,每 个人都可以看到其他人额头上纸的颜色.5人相互观察后: A说:“我看见有3人额头上贴的是白纸,1人额头上贴的是黑 ...
- Tarjan水题系列(4):HAOI2010 软件安装
题目: 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和最大). ...
- Fusioncharts图表常用参数设置
1.1 <chart>参数设置: 图表和轴的标题* caption=”String” : 图表上方的标题* subCaption=”String” : 图表上方的副标题* xAxisNam ...
- maven的概念模型
maven包含了一个项目对象模型(project object model),一组标准集合,一个项目生命周期(project lifecycle),一个依赖管理系统(dependency manage ...
- Trait讲解
<?php /** * Trait解决PHP单继承的一种方法,使开发人员在不同层次结构的类中复用属性和方法 * Trait无法实例化 * Trait不是类,不能被继承,所以不能再Trait中不能 ...
- 前端为什么要学习 Selenium
如果你正在阅读本文,那么可能希望从手动测试升级为自动化测试.你是对的,因为你需要学习 Selenium.我这样说是因为自动化测试已经风靡全球,而且业界正很缺少 Selenium 认证专家. 你可能还想 ...
- OC+swift混编
作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/34440159 转载请注明出处 如果觉得文章对你有所帮助,请通过留言 ...