vue中style的scoped属性这里是怎实现的呢?

scoped三条渲染规则

  1. 给HTML的DOM节点加一个不重复data属性(形如:data-v-2311c06a)来表示他的唯一性
  2. 在每句css选择器的末尾(编译后的生成的css语句)加一个当前组件的data属性选择器(如[data-v-2311c06a])来私有化样式
  3. 如果组件内部包含有其他组件,只会给其他组件的最外层标签加上当前组件的data属性

一个简单组件例子:

//button.vue
<template><div class="button-warp"><button class="button">text</button></div>
</template>
...
<style scoped>.button-warp{display:inline-block;}.button{padding: 5px 10px;font-size: 12px;border-radus: 2px;}
</style>

浏览器渲染组件

HTML

<div data-v-2311c06a class="button-warp"><button data-v-2311c06a class="button">text</button>
</div>

CSS

.button-warp[data-v-2311c06a]{display:inline-block;
}
.button[data-v-2311c06a]{padding: 5px 10px;font-size: 12px;border-radus: 2px;
}

从上面的字可以看出,添加了scoped属性的组件,为了达到组件样式模块化,做了两个处理:

  • 给HTML的DOM节点加一个不重复data属性(形如:data-v-2311c06a)来表示他的唯一性
  • 在每句css选择器的末尾(编译后的生成的css语句)加一个当前组件的data属性选择器(如[data-v-2311c06a])来私有化样式

大家都知道css样式有一个优先级的说法,scoped的这一操作,虽然达到了组件样式模块化的目的,但是会造成一种后果:每个样式的权重加重了:理论上我们要去修改这个样式,需要更高的权重去覆盖这个样式。这是增加复杂度的其中一个维度。


其他组件引用button组件

上面分析了单个组件渲染后的结果,那么组件互相调用之后会出现什么样的结果呢?,具体分两种情况:模块一般组件引用模块私有组件(本质和模块私有组件引用模块一般组件一样);模块私有组件引用模块私有组件。

举个例子:在组件content.vue中使用了button组件,那么content.vue组件是否添加scoped属性渲染出来的结果有什么区别呢?

//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分别就是:
HTML

<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>

CSS

/*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分别就是:

<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>
/*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;
}

原文链接:https://segmentfault.com/a/1190000012184604?utm_source=tuicool&utm_medium=referral

vue中style的scoped属性的设计方式相关推荐

  1. vue中style的scoped属性这样用,修改第三方组件iview 或 element 样式

    vue中style的scoped属性这样用,修改第三方组件iview 或 element 样式 文章目录 vue中style的scoped属性这样用,修改第三方组件iview 或 element 样式 ...

  2. vue中style的scoped属性

    原文链接(这两篇讲得超级好):vue中慎用style的scoped属性_June.1的博客-CSDN博客_scoped scoped 和 deep的用法深究_格竹悟道的博客-CSDN博客_scoped ...

  3. 【Vue基础】关于Vue中CSS的scoped属性作用域与样式穿透

    scoped 在了解scoped属性之前,先了解一下Vue(中的插件)在渲染DOM时干了什么.Vue在渲染DOM后会在DOM节点上生成一个随机串data属性,这一属性给了当前组件下的DOM一种唯一标识 ...

  4. vue中慎用style的scoped属性

    " 在vue组件中,在style标签上添加scoped属性,以表示它的样式作用于当下的模块,很好的实现了样式私有化的目的,这是一个非常好的机制.但是为什么要慎用呢?在实际业务中我们往往会对公 ...

  5. [vue] 你知道style加scoped属性的用途和原理吗?

    [vue] 你知道style加scoped属性的用途和原理吗? 在标签上绑定了自定义属性,防止css全局污染 但是很多时候使用ui框架如果加scope就不能覆盖,这个时候一般写sass 会在最外层包裹 ...

  6. 理解vue中less的scoped和/deep/工作原理

    理解vue中less的scoped和/deep/工作原理 scoped /deep/ 实战 总结 scoped vue项目一般是单页面.多组件,整个项目共用一个css样式表,有时候我们在写组件的过程中 ...

  7. 高德地图 Vue 中 加载 数据可视化 Loca 的方式

    高德地图 Vue 中 加载 数据可视化 Loca 的方式 今天想用 Loca 试试如何的,结果怎么都加载不上,我的代码是这样的 AMapLoader.load({key: "这个就不展示了& ...

  8. vue中style scoped属性的作用和原理以及scoped穿透

    一.为什么要给style 节点加 scoped 属性(vue) 1.作用:当style标签里面有scoped属性时,它的css只作用于当前组建的元素.在单页面项目中可以使组件之间互不污染,实现模块化( ...

  9. Vue中Css的scoped的原理

    当style标签拥有scoped属性的时候,它的css样式只会作用在当前组件 也就是说scoped可以使得组件之间的样式互相隔离,互不影响 如果一个项目中的左右组件style标签都加上scoped就相 ...

最新文章

  1. angular模拟web API
  2. 项目 cmdb(一)
  3. 15_采用Pull解析器解析和生成XML内容
  4. WebSocket API使用篇检测浏览器是否支持WebSocket(4)
  5. 10.11.5 brew mysql_mac os10.11下安装MySQLdb
  6. 本周四直播:Oracle 19c 升级实战分享
  7. 辗转相除将分数化为连分数形式
  8. ORBSLAM的ORB特征到底从哪儿来?
  9. c# tooltip 取消关联控件
  10. 在 Mac 上如何使用时间机器备份文件?
  11. java 注册表 下载_Java修改windows注册表(完全修改)
  12. 什么是OGNL表达式
  13. She Will Be Loved
  14. 亲测成功 office 2007 安装问题 无法找到OfficeLR.cab/OfficeMUI.msi
  15. 数据API开发如何快速上手:先了解什么是数据API生命周期管理
  16. PSI 项目经理 PMP 计算题公式人话版解释
  17. 领域驱动设计(DDD)在爱奇艺打赏业务的实践
  18. git diff使用简单记录
  19. MySQL 之 扩展例子
  20. 直呼OMG!键盘残余热量可能泄露密码

热门文章

  1. Elasticsearch对地理数据查询(一)
  2. Elasticsearch Mapping 详解
  3. DeepCTR-Torch,基于深度学习的CTR预测算法库
  4. 最小二乘、最大似然和最大后验的简单总结
  5. 解决升级Spark2.0之后,DataFrame map操作报错
  6. 从缓存行出发理解volatile变量、伪共享False sharing、disruptor
  7. DDoS攻击惯犯图鉴
  8. 浅谈前端实现页面加载进度条以及 nprogress.js 的实现
  9. hashCode()方法的性能优化
  10. android 仿人人网滑动侧边栏