scoped作用

<style> 标签有 scoped 属性时,它的 CSS 只作用于当前组件中的元素

scoped目标

scoped是为了实现组件的私有化,表示style只属于当前模块,不对全局造成污染。

使用 scoped 后,父组件的样式将不会渗透到子组件中。不过一个子组件的根节点会同时受其父组件有作用域的 CSS 和子组件有作用域的 CSS 的影响。这样设计是为了让父组件可以从布局的角度出发,调整其子组件根元素的样式。

scoped原理

通过观察渲染之后的html及CSS可以发现,添加scoped属性的组件,DOM结构中都会出现 data-v-469af010 的字段,相当于是唯一标识符。

添加了scoped属性的组件,为了达到组件私有化的目的:

  • 在DOM结构中加入了 data-v-469af010 唯一标识符
  • 组件的每个样式选择器后添加一个等同与“不重复属性”相同的字段,实现类似于“作用域”的作用,不影响全局
  • 如果组件内部还有组件,只会给最外层的组件里的标签加上唯一属性字段,不影响组件内部引用的组件

混用本地和全局样式

一个组件中有作用域和无作用域的样式是可以同时使用的

<style>
/* 全局样式 */
</style><style scoped>
/* 本地样式 */
</style>

谨慎使用的场景

从原理可见,之所以scoped可达到类似组件私有化、样式设置“作用域”的效果,其实只是在设置scoped属性的组件上的所有标签添加唯一的data开头的属性,且在标签选择器的结尾加上和属性同样的字段,起到唯一性的作用,但是这样如果组件中也引用其他组建就会出现类似下面的问题:

  • 父组件无scoped属性,子组件带有scoped,父组件是无法操作子组件的样式的,虽然我们可以在全局中通过该类标签的标签选择器设置样式,但会影响到其他组件
  • 父组件有scoped属性,子组件无,父组件也无法设置子组件样式,因为父组件的所有标签都会带有data-v-469af010唯一标志,但子组件不会带有这个唯一标志属性,与1同理,虽然我们可以在全局中通过该类标签的标签选择器设置样式,但会影响到其他组件
  • 父子组件都有scoped属性,同理也无法设置样式,

深度作用选择器

写在前面,目前只推荐 ::v-deep

官方文档:

如果你希望 scoped 样式中的一个选择器能够作用得“更深”,例如影响子组件,你可以使用 >>> 操作符:

<style scoped>
.a >>> .b { /* ... */ }
</style>

有些像 Sass 之类的预处理器无法正确解析 >>>。这种情况下你可以使用 /deep/ 操作符取而代之——这是一个 >>> 的别名,同样可以正常工作。

修正:

但是,并不是所有的操作符都是爸爸的好孩子,其中有些是已经被官方弃用的,根据尤雨溪2020年9月的这篇文章,我们大概可以了解到:

  1. 最初是使用 >>> 来达到 “deep” 的效果,但是某些 CSS 预处理器不支持

  2. 后来选择了 /deep/,它曾经是 CSS 的一个真正的提议(甚至在 Chrome 中自带),但是后来被放弃了。所以为了避免用户困惑,最后使用了 ::v-deep(加了个 v,证明是我 Vue 的纯正血统)

  3. 然后 Vue 3 来了,我们可以抛弃历史包袱了,所以在 Vue 3 中,我们不再支持 >>>/deep/ ,推荐大家使用 ::v-deep,而且为了更加符合 CSS 的书写习惯,希望大家使用 ::v-deep(.class) 的书写规则

  4. 在 Vue 3 中还提供了 ::v-slotted::v-global 两种新的操作符,针对 <slot> 和全局 CSS 规则

  5. ::v-slotted 编译之后的属性值为 data-v-xxx-s,-s 的后缀使得它只针对 <slot> 内容

  6. ::v-global 编译之后则不带 data-v-xxx 的属性

Vue2:

  • 不推荐使用 /deep/
  • 在 Sass 之类的预处理器中使用 ::v-deep
  • 没有预处理器的情况下使用 >>>
  • 使用上面的操作符,<style> 必须有 scoped 属性

Vue3:

  • 不支持 /deep/>>>
  • 推荐使用 ::v-deep(.class) 代替 ::v-deep .class
  • 针对 <slot> 可以使用 ::v-slotted 选择器
  • 可以使用 ::v-global 注册全局样式
  • 使用上面的操作符,<style> 必须有 scoped 属性

参考文档

CSS 作用域 · vue-loader (vuejs.org)

vue中scoped的原理及慎用原因

Vue scoped属性和深度作用选择器

浅析scoped属性原理及深度作用选择器相关推荐

  1. 【uni-app】深度作用选择器解决修改checkbox样式无效问题

    uni-app表单多项选择器需要使用内置组件checkbox,具体使用见官网链接,如下: checkbox - uni-app官网 (dcloud.io) 官方给出h5端的默认样式是这样的: ​ 现在 ...

  2. Vue scoped CSS 与深度作用选择器 /deep/

    2019独角兽企业重金招聘Python工程师标准>>> 如果你希望 scoped 样式中的一个选择器能够作用得"更深",例如影响子组件,你可以使用 >> ...

  3. Vue项目中 css样式的作用域(深度作用选择器)

    vue官方文档 父组件对子组件设置的样式,只能作用到子组件的根节点上!!!

  4. vue - 深入理解vue中的scoped属性

    文章目录 1,前言 2,scoped原理 3,父子组件使用scoped的不同情况 4,第一种:父组件未添加scoped,子组件未添加scoped 5,第二种:父组件未添加scoped,子组件添加sco ...

  5. vue中慎用style的scoped属性

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

  6. Vue中scoped属性学习笔记

    #什么是scoped vue中在style标签中的一个属性,使用scoped属性可以使标签内的样式只作用于当前组件中的元素. #scoped的原理 在刚开始使用的时候,页面调试的html标签内和样式中 ...

  7. CSS深度(穿透)选择器

    前言: 今天在项目开发过程中,使用 Element UI 的走马灯(轮播图)组件,想去改左右箭头样式和下面的小圆点.使用发现改不了发现直接修改不了,需去掉 scoped 属性或者使用深度选择器才能修改 ...

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

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

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

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

最新文章

  1. iOS开发系列--通知与消息机制
  2. xcode7.2 真机测试
  3. c语言memset清空指向数组的指针_C语言中数组和指针的关系
  4. /usr/bin/ld: cannot find -lltdl collect2: ld returned 1 exit status make: *** [sapi/cgi/php-cgi] Err
  5. SVM 推到期间 遇到的 表背景知识 (间隔最大化)
  6. FFMPEG分析比较细的文章
  7. #Java小案例 随机产生数
  8. leetcode —— 1319. 连通网络的操作次数
  9. 等了一年终于要来了 电影《八佰》定档8月21日全国上映
  10. jedis操作set_Redis从入门到深入-Java操作Redis(12)
  11. 这件装备让你排位上分有如神助,vivo X20王者荣耀限量版图评
  12. scrollIntoView()窗口滚动
  13. html5json转换为数组,Json转数组 在线
  14. p3输入p1输出c语言,单片机C语言编程基础
  15. Task 3: Subword Models
  16. Doevents用法
  17. Directx11进阶教程之Tiled Based Deffered Shading
  18. veins中实现rsu与车辆通信
  19. HTML的meta标签
  20. 项目管理(二)项目阶段与项目生命周期

热门文章

  1. OTA酒店订单自动录入同步到PMS酒店管理系统技术(及旅业系统身份证信息自动录入技术)
  2. 夏普MX-M2658N复印机显示请放入载体组件
  3. python将矩阵存为lmdb文件
  4. 【考试记录】Apsara Clouder基础技能认证:阿里云RPA(机器人流程自动化)- 初级入门(可视化)
  5. Linux系统vi和vim的介绍
  6. VS2010 之TFS基础使用教程
  7. 微信公众号支付java前后端分离开发
  8. 整合SOUI的默认资源(soui-sys-resource.dll)
  9. Java之智力题【史上最全】
  10. oracle 特殊字符表示,Oracle如何插入在特殊字符: amp; 和 #39; (各种解决方案)