详解源码vue3的样式穿透scope

这篇具有很好参考价值的文章主要介绍了详解源码vue3的样式穿透scope。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

vue3在打包之后只有一个html文件,为了避免样式污染可以为style标签引入scope属性,它的原理十分简单,它会为每一个dom元素都添加一个data属性,这个属性是不重复的,然后会在当前组件的选择器的末尾,追加一个属性选择器,当两者匹配上时,会把样式命中到dom上

scope渲染规则:

1.每个dom元素会自带一层data

2.当前组件的选择器会追加一个属性选择器来保证一一对应

3.当一个组件引入另一个组件时,scope的唯一data属性只会添加到最外层标签

vue3 样式穿透,vue,前端,javascript,html

此时,我们就在backstage这个单文件组件里引入elementplus的组件,我们观察一下此时data属性的位置 

vue3 样式穿透,vue,前端,javascript,html

发现只有最外层的div有data属性 

vue3 样式穿透,vue,前端,javascript,html

现在我们有一个需求,把边框的白线给去掉 

打开调试工具可知我们需要选中截图红框的元素并修改其css属性

vue3 样式穿透,vue,前端,javascript,html

 如果我们做出如下修改

vue3 样式穿透,vue,前端,javascript,html

 vue3 样式穿透,vue,前端,javascript,html

发现页面并没有变化,原因就在于container这个容器是由一层data的,此时的属性选择器是被加到了el-table_cell后面,我们并没有命中到container,所以样式不生效

做出如下修改

vue3 样式穿透,vue,前端,javascript,html

 我们再观察此时页面的情况

vue3 样式穿透,vue,前端,javascript,html

 发现此时的属性选择器被追加到了container后,此时我们就成功命中父级元素container,后面操作它的子元素样式就可以顺利生效。所以这个:deep()深度选择器就干了一件事情,deep写在谁后面,就会把data属性选择器追加到谁后面

使用样式穿透后可以写的更优雅一点

vue3 样式穿透,vue,前端,javascript,html

 文章来源地址https://www.toymoban.com/news/detail-771637.html

现在我们来看看他的源码

vue3源码在此

vue3 样式穿透,vue,前端,javascript,html

scope的具体实现在compiler-src里,这个文件主要就是用于处理后缀名.vue的单文件组件的,

这里写了三个解析器分别解析template标签、script标签、style标签

vue3 样式穿透,vue,前端,javascript,html 这里观察到会首先判断是否开启scope属性,如果有,则会往postcss plugin 里添加一个插件,

vue3 样式穿透,vue,前端,javascript,html

我们点进去看看这个插件具体做了什么事情

vue3 样式穿透,vue,前端,javascript,html

 发现这个插件主要是将css转化成AST,有点类似babel,babel主要操作就是将高阶es6语法先转义成AST,得到这么一个树之后我们就可以随意操作它的节点,甚至做一些定制化的操作

我们点进processRule

vue3 样式穿透,vue,前端,javascript,html

它首先先声明了一个弱集合processeRules,然后判断rule是否存在,这里的rule是AST,如果有,就return出去,如果没有就往里面添加AST

vue3 样式穿透,vue,前端,javascript,html

然后会遍历这个AST,为每个item都调了rewirteSelector 这个函数

我们再看看这个函数

vue3 样式穿透,vue,前端,javascript,html

首先判断我们所使用的深度选择器,如果是vue2的这两种,就不给我们做样式穿透并弹出警告,我们接着往下看

 首先还是会判断类型,类型pseudo如下

vue3 样式穿透,vue,前端,javascript,html

 然后再判断我们的深度选择器是否符合vue3规范,如果符合,则帮我们做样式穿透,实现的方式其实就是挪动下属性选择器的追加位置,第三个框框就是挪动的实现vue3 样式穿透,vue,前端,javascript,html

 观察这里的挪动

vue3 样式穿透,vue,前端,javascript,html

 

到了这里,关于详解源码vue3的样式穿透scope的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • CSS样式穿透技巧:利用scoped与deep实现前端组件样式隔离与穿透

    一、什么是scoped 在vue文件中的style标签上,有一个特殊的属性:scoped。 当一个style标签拥有scoped属性时,它的CSS样式就只能作用于当前的组件,通过该属性,可以使得组件之间的样式不互相污染。 二、scoped的原理 为组件实例生成一个唯一标识,给组件中的每个标签对应的d

    2024年04月10日
    浏览(8)
  • 前端UI库样式穿透问题解决

    前端UI库样式穿透问题解决

    文章目录 随着前端框架的兴起,程序员是越来越懂得利用工具,各种层出不穷的前端UI组件库应运而生,大大减少了程序员对于制作页面需要花费的时间,把时间更专注于业务的逻辑开发,但是应该定制好的组件库固然方便,但是这样大家就会开到千篇一律的组件,高度定制

    2024年02月09日
    浏览(5)
  • 【尚医通】vue3+ts前端项目开发笔记 2 —— 创建项目、封装网络请求、集成elment-plus 、重置样式、准备状态管理/路由 等开发前准备

    【尚医通】vue3+ts前端项目开发笔记 2 —— 创建项目、封装网络请求、集成elment-plus 、重置样式、准备状态管理/路由 等开发前准备

    服务器地址:http://syt.atguigu.cn 医院接口:http://139.198.34.216:8201/swagger-ui.html 公共数据接口:http://139.198.34.216:8202/swagger-ui.html 会员接口:http://139.198.34.216:8203/swagger-ui.html 短信验证码接口:http://139.198.34.216:8204/swagger-ui.html 订单接口:http://139.198.34.216:8206/swagger-ui.html 文件上传接口:

    2024年02月13日
    浏览(8)
  • 【vue3】13-前端路由-Vue-Router的详解: 从入门到掌握

    【vue3】13-前端路由-Vue-Router的详解: 从入门到掌握

    路由其实是网络工程中的一个术语: 在 架构一个网络 时,非常重要的两个设备就是 路由器和交换机 。 当然,目前在我们生活中 路由器 也是越来越被大家所熟知,因为我们生活中都会用到 路由器 : 事实上, 路由器 主要维护的是一个 映射表 ; 映射表 会决定数据的流向; 路由

    2024年02月09日
    浏览(19)
  • vue 3 第二十六章:样式(scoped及样式穿透)

    vue 3 第二十六章:样式(scoped及样式穿透)

    在 Vue 中,我们可以使用 scoped 特性来给组件的样式添加作用域。通过为组件的 style 标签添加 scoped 特性,我们可以确保组件的样式仅应用于该组件的模板中,而不会影响其他组件或全局样式。 在上面的例子中, .example 类的样式只会应用于该组件的模板中,而不会影响其他组

    2024年02月06日
    浏览(15)
  • 带你玩转 ui 框架 ——scoped及样式穿透问题详解

    带你玩转 ui 框架 ——scoped及样式穿透问题详解

    前言 在我们前端的开发中经常会使用到各种 ui 框架 下面这两个是比较火的,也是我常用的两个ui框架。 问题描述 但是在使用框架的时候难免会遇到需要改变组件中的一些样式,当然如果我们所有页面的组件样式都是统一的话,我们可以进行全局设置样式,但是如果我们仅仅

    2023年04月21日
    浏览(7)
  • Vue3浅谈:(三)Vue3类与样式绑定

    目录 一、Vue3 Class 绑定 1.Vue3 Class 绑定基础 绑定对象: 绑定数组 二、Vue3 Style 绑定 1.Vue3 Style  绑定基础 绑定对象: 绑定数组: 自动前缀 : 样式多值: 数据绑定的一个常见需求场景是操纵元素的 CSS class 列表和内联样式。我们可以使用  v-bind  将它们和动态的字符串绑定

    2024年02月02日
    浏览(7)
  • Vue3动态样式

    Vue3动态样式

    我们准备一个简单的 Vue3 项目,并写两个页面: Home : About 页面: 效果如下: 记得添加路由。添加好之后,我们点击加1按钮,看看会发生什么? 首先来看下我们做的事情: 我们定义了几个响应式数据,其中有个 colorRef ,它会根据 count 变量是奇数还是偶数来改变颜色。 我

    2024年02月02日
    浏览(9)
  • 前端开发攻略---从源码角度分析Vue3的Propy比Vue2的defineproperty到底好在哪里。一篇文章让你彻底弄懂响应式原理。

    前端开发攻略---从源码角度分析Vue3的Propy比Vue2的defineproperty到底好在哪里。一篇文章让你彻底弄懂响应式原理。

    Vue的响应式到底要干什么? 无非就是要知道当你 读取 对象的时候,要知道它读了。要做一些别的事情 无非就是要知道当你 修改 对象的时候,要知道它改了。要做一些别的事情 所以要想一个办法, 把读取和修改的动作变成一个函数 ,读取和修改的时候分别调用对应的函数

    2024年04月17日
    浏览(10)
  • vue3-类与样式绑定

    Class 与 Style 绑定 class 和 style 都是 attribute,我们可以和其他 attribute 一样使用 v-bind 将它们和动态的字符串绑定。 Vue 专门为 class 和 style 的 v-bind 用法提供了特殊的功能增强。除了字符串外,表达式的值也可以是对象或数组。 绑定class :class (v-bind:class 的缩写) 传递一个对象来

    2024年01月19日
    浏览(6)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包