一文弄懂vue中样式穿透v-deep

1. 前言

vue3的世界里,有一个style标签的关键字v-deep,官网称之为样式穿透。那他究竟是什么原理呢?又是怎么工作的呢?让我们一起探究一下。

2. 准备工作

需要实现搭建一个vue3的环境,我这里使用的是vite+vue3的架构进行研究。不会的可以自行上网了解一下。

3. scoped的作用

在了解v-deep之前,我们有必要先了解一下style标签中scoped的作用。

<template><div></div>
</template>
<script lang=ts setup>
</script>
<style lang=scss scoped>
</style>

我们知道,scoped具有作用域的意思,也就是说如果在style标签中加上scope标签,那么这里面书写的样式不会再其他vue文件中生效。那他的原理又是什么呢?

3.1 style生效的位置

我们知道,所有的vue文件中的style标签的内容,最终会渲染到html文件的head中的style标签中。
如下vue代码

<template><div class="container"><span>1111</span></div>
</template>
<script lang=ts setup>
</script>
<style lang=scss>
.container{background-color: lightblue;width: 100px;height: 100px;
}
</style>

那么我们打开网页,查看源码
在这里插入图片描述
再style标签中,会出现一个属性data-vite-dev-id,他指向的是当前样式所对应的文件路径以及属性信息。

3.2 没有scoped效果

在这里插入图片描述
基本和源代码的格式一样。

3.3 增加scoped效果

此时,我们发现相较于源码,再生成的文件的类选择器.container中,多了一个[data-v-68595a3e]属性选择器,这又是做什么的呢?其实,他是每个vue文件的文件指纹。如下图,再每个vue文件template标签的html片段中每个标签,都会生成一个文件指纹。我们发现container的容器中又两个文件指纹,另外一个是继承了父组件的文件指纹。
在这里插入图片描述
这也正是scope的基本原理。再style中,选择器定义了选择器.container[data-v-68595a3e],我们知道这是并且的关系,满足类名.container并且包含属性data-v-68595a3e的,由于文件指纹具有唯一性,所以<style lang=scss scoped>中的样式只针对当前文件生效。

4. v-deep效果

4.1 v-deep原理

通过上面的讲解,我们了解到scope主要通过文件指纹控制作用域范围。而针对每个样式的定义,只能出现一个文件指纹。我们看如下代码:

<template><div class="container"><span>1111</span></div>
</template>
<script lang=ts setup>
</script>
<style lang=scss scoped>
.container{background-color: lightblue;width: 100px;height: 100px;.abc{background-color: #fff;.def{color: red;}}
}
</style>

这里我们使用的是scss语法,我们看一下编译后的呈现形式:
在这里插入图片描述
通过截图我们发现会在每个样式后面都加上一个文件指纹的属性。
那我现在有个需求,我想把文件指纹加到中间该怎么办呢?此时,v-deep就派上用途了。看下面代码:

<template><div class="container"><span>1111</span></div>
</template>
<script lang=ts setup>
</script>
<style lang=scss scoped>
.container{background-color: lightblue;width: 100px;height: 100px;::v-deep.abc{background-color: #fff;.def{color: red;}}
}
</style>

在这里插入图片描述
我们发现,针对后面两个样式,文件指纹追加到中间了。针对中间的样式,做一些解释,我们知道,scss语法,会对嵌套的样式进行转换。

.container{.abc{}
}

上面的代码转换称为.container .abc,如果我们在.abc前面加上::v-deep,相当于.container ::v-deep .abc
哎?我们似乎明白点什么了?v-deep不就是文件指纹吗?
所以我们得出一个结论:

加上scoped标签,就相当于在样式的末尾追加了一个v-deep

<style lang=scss scoped>
.container::v-deep{background-color: lightblue;width: 100px;height: 100px;
}
</style>

在这里插入图片描述
既然v-deep可以追加文件指纹,那么style如果不加scope,但是样式末尾追加v-deep会生效吗?

<style lang=scss>
.container::v-deep{background-color: lightblue;width: 100px;height: 100px;
}
</style>

在这里插入图片描述
很遗憾,他就不认识v-deep是什么意思了。所以这里有得出一个结论

v-deep只有在scoped下才能生效。

4.2 v-deep有效性

那么他都对哪些选择器有效。

4.2.1 &子选择器

在scss中,&相当于父元素。

<style lang=scss scoped>
.container{background-color: lightblue;width: 100px;height: 100px;&::v-deep .abc{background-color: #fff;.def{color: red;}}
}
</style>

在这里插入图片描述

4.2.2 伪类和伪元素选择器

放到伪类后面

<style lang=scss scoped>
.container{background-color: lightblue;width: 100px;height: 110px;&.abc{background-color: #fff;.def:hover::v-deep::after{color: red;}}
}
</style>

在这里插入图片描述
放到伪元素前面

<style lang=scss scoped>
.container{background-color: lightblue;width: 100px;height: 110px;&.abc{background-color: #fff;.def:hover::after::v-deep{color: red;}}
}
</style>

在这里插入图片描述
伪元素后面再加上一个标签

<style lang=scss scoped>
.container{background-color: lightblue;width: 100px;height: 110px;&.abc{background-color: #fff;.def:hover::after div::v-deep{color: red;}}
}
</style>

在这里插入图片描述
通过上面三个示例,我们发现v-deep会越过伪类和伪元素选择器。

4.2.3 多个v-deep

<style lang=scss scoped>
.container{background-color: lightblue;width: 100px;height: 110px;::v-deep.abc{background-color: #fff;.def:hover::after div::v-deep{color: red;}}
}
</style>

在这里插入图片描述
第一个出现v-deep会生效,后面再出现的按照样式处理。

5 案例

通过上面的讲解,那他究竟有什么作用呢?下面我们通过一个案例体会他的真正作用。
再vue的世界中,我们很多时候会使用第三方库,比如element-ui等。如果我想该里面的样式,之前好多同事会把样式放到全局中,这样显而易见容易污染其他的元素,此时,v-deep就会大显身手。

5.1 准备代码

我们暂时选择ant-design库作为测试。

  • 安装ant-design
     yarn add ant-design-vue@next 
    
  • main.ts配置主要代码
    import Antd from 'ant-design-vue'
    import 'ant-design-vue/dist/reset.css'
    app.use(router).use(Antd).mount('#app')
    

index.vue

<template><div class="container"><a-checkbox class="check" v-model:checked="checked">Checkbox</a-checkbox></div>
</template><script lang=ts setup>
import { ref } from 'vue';
const checked = ref(true)
</script><style lang=scss scoped>
.container{background-color: lightblue;width: 500px;height: 510px;
}
</style>

此时,我们看一下生成的代码片段:
在这里插入图片描述
在这里插入图片描述

假如我现在有个需求,想把复选框中间的蓝色变成红色,很容易想到需求修改ant-checkbox-inner的样式,如下代码:

<style lang=scss scoped>
.container{background-color: lightblue;width: 500px;height: 510px;.check{.ant-checkbox-inner{background-color: red;}}
}
</style>

然而,并没有生效,我们看一下生成的代码:
在这里插入图片描述
我们发现在ant-checkbox-inner后面加了一个文件指纹。而实际这是第三方库(也就是已经打包好的文件),里面的标签根本不会出现文件指纹。这样就导致我们写的样式文件不能作用于ant-checkbox-inner上。此时,我们很容易想到要把样式变成全局。

<style lang=scss>
.container{background-color: lightblue;width: 500px;height: 510px;.check{.ant-checkbox-inner{background-color: red;}}
}
</style>

在这里插入图片描述
虽然样式生效了,但是出现了最严重的问题,它会污染到其他vue组件使用的checkbox组件。此时v-deep就登场了。代码如下:

<style lang=scss scoped>
.container{background-color: lightblue;width: 500px;height: 510px;.check{::v-deep .ant-checkbox-inner{background-color: red;}}
}
</style>

在这里插入图片描述
此时我们发现样式生效了。
再看样式表,发现给check加了文件指纹,check是我们vue组件的标签,因此编译的时候会加上文件指纹。这样就完美解决了问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/600694.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用JavaScript制作一个简单的天气应用

随着Web开发技术的不断发展&#xff0c;JavaScript已经成为前端开发中不可或缺的一部分。它不仅可以用于创建动态和交互式的用户界面&#xff0c;还可以用于处理各种复杂的任务&#xff0c;如数据验证、动态内容更新、实时通信等。以下是一个使用JavaScript来创建一个简单天气应…

【OJ】单链表刷题

力扣刷题 1. 反转链表&#xff08;206&#xff09;1.1 题目描述1.2 题目分析1.2.1 头插法1.2.2 箭头反转 1.3 题目代码1.3.1 头插入1.3.2 箭头反转 2.合并两个有序链表&#xff08;21&#xff09;2.1 题目描述2.2 题目分析2.3 题目代码 1. 反转链表&#xff08;206&#xff09;…

视频转音频软件哪个好? 11 个高效的视频转音频转换器分享

网络上拥有数百个值得观看和聆听的音乐视频。但要聆听喜爱的音乐&#xff0c;用户必须观看整个视频&#xff0c;即使只有音乐让他们兴奋。那么&#xff0c;如何从视频中提取音频呢&#xff1f;简单的答案是使用视频到音频转换器将视频转换为音频格式并将其保存在您的设备上以供…

gflags.exe 工具入门详解

gflags.exe 是 Windows 平台上的一个调试工具&#xff0c;它来自 Microsoft Debugging Tools for Windows 工具集。gflags&#xff08;全局标志&#xff09;主要用于设置和管理针对特定进程或系统的调试选项以及性能监视特性。这个工具可以帮助开发者对程序进行更深入的故障排查…

【读书】《白帽子讲web安全》个人笔记Ⅰ-1

目录 前言&#xff1a; 第1章 我的安全世界观 1.1 Web安全简史 1.1.1中国黑客简史 1.1.2黑客技术的发展历程 1.1.3web安全的兴起 1.2黑帽子&#xff0c;白帽子 1.3返璞归真&#xff0c;揭秘安全的本质 1.4破除迷信&#xff0c;没有银弹 1.5安全三要素 1.6如何实施安…

使用pymysql框架连接和查询MySQL数据库

使用pymysql框架连接和查询MySQL数据库步骤&#xff1a; 前提&#xff1a;安装并import pymysql模块 1、使用 pymysql.connect&#xff08;&#xff09;函数创建一个数据库连接对象 2、正确填写数据库配置信息&#xff0c;地址、端口、用户名、密码、数据库名称 3、创建游标…

微服务-sentinel-基本案例,持久化

sentinel 功能 限流 限流文档 直接拒绝&#xff1a;触发阀值直接抛弃。冷启动&#xff1a;在一段时间内针对突发流量缓慢增长处理数量。 3&#xff09;匀速器&#xff1a;请求以均匀的速度通过。 降级降级文档 1&#xff09;RT 统计时间内&#xff0c;大于预设请求数量&…

MySQL数据库的查询操作

MySQL单表查询 字段解析字段名字段类型雇员编号idint雇员姓名namevarchar(30)雇员性别sexenum雇用时期hire_datedate雇员职位postvarchar(50)职位描述job_descriptionvarchar(100)雇员薪水salarydouble(15,2)办公室officeint部门编号dep_idint #创表 CREATE TABLE company.em…

架构(1)

目录 1.如何理解架构的演进&#xff1f; 2.如何理解架构的服务化趋势&#xff1f; 3.架构中有哪些技术点&#xff1f; 4.谈谈架构中的缓存应用&#xff1f; 5.在开发中缓存具体如何实现&#xff1f; 1.如何理解架构的演进&#xff1f; 初始阶段的网站架构应用服务和数据服…

tcl 基础

exec catch file mkdir

【QT】QStandardItemModel类的应用介绍

目录 1 概述 2 常用方法 3 QStandardItemModel的使用 3.1 界面设计与主窗口类定义 3.2 系统初始化 3.3 从文本文件导入数据 3.4 数据修改 3.5 单元格格式设置 3.6 数据另存为文件 1 概述 QStandardItemModel是标准的以项数据&#xff08;itemdata&#xff09;为基础的…

【管理篇 / 恢复】❀ 08. 文件权限对macOS下用命令刷新固件的影响 ❀ FortiGate 防火墙

【简介】虽然上篇文章中成功的在macOS下刷新了固件&#xff0c;但是很多小伙伴在实际操作中碰到了无法成功的状况&#xff0c;我们来看看最常见的一种。 在/private/tftpboot目录拷贝另一个版本的固件文件&#xff0c;具体拷贝过程不再详述。 打开终端&#xff0c;输入命令 sud…

Do you know about domestic CPUs

Do you know about domestic CPUs CPU指令集国产CPU CPU指令集 国产CPU 参考文献 国产CPU之4种架构和6大品牌指令集及架构一文深入了解 CPU 的型号、代际架构与微架构国产GPU芯片厂商有哪些深入GPU硬件架构及运行机制详解服务器GPU架构和基础知识

编写一个弹跳小球的程序,小球在窗口中四处反弹(python)

import pygame import random# 初始化Pygame pygame.init()# 窗口尺寸 width 800 height 600# 创建窗口 screen pygame.display.set_mode((width, height)) pygame.display.set_caption("Bouncing Ball")# 小球初始位置和速度 ball_radius 20 ball_color (255, …

TCP和UDP的区别是什么

TCP和UDP是互联网协议中两个重要传输层协议。 一、工作原理 1.1 TCP TCP是一种面向连接的协议&#xff0c;通过三次握手建立可靠的连接。发送端将数据分割成多个TCP段&#xff0c;并通过IP进行传输。接收端接收到TCP后进行重组&#xff0c;并通过确认机制确保数据的可靠性。…

HUAWEI华为荣耀MagicBook X 15酷睿i5-10210U处理器集显(BBR-WAH9)笔记本电脑原装出厂Windows10系统

链接&#xff1a;https://pan.baidu.com/s/1YVcnOP5YKfFOoLt0z706rg?pwdfwp0 提取码&#xff1a;fwp0 MagicBook荣耀原厂Win10系统自带所有驱动、出厂主题壁纸、系统属性专属LOGO标志、Office办公软件、华为/荣耀电脑管家等预装程序 文件格式&#xff1a;esd/wim/swm 安装…

docker 部署haproxy cpu占用特别高

在部署mysql 主主高可用时&#xff0c;使用haproxy进行负载&#xff0c;在服务部使用的情况下发现服务器cpu占比高&#xff0c;负载也高&#xff0c;因此急需解决这个问题。 1.解决前现状 1.1 部署配置文件 cat > haproxy.cfg << EOF globalmaxconn 4000nbthrea…

解码 Elasticsearch 查询 DSL:利用 Elasticsearch 中的 has_child 和 has_parent 查询进行父子文档搜索

今天&#xff0c;让我们深入研究 has_child 查询和 has_parent 查询&#xff0c;这将帮助我们将 2 个不同的文档组合到一个索引中&#xff0c;从而使我们能够将它们与关系关联起来。 这样做会对我们搜索相关文档时有很大帮助。 在使用 has_child 及 has_parent 这种关系时&…

移动端-vue-BScroll用法教程

移动端-vue-BScroll用法教程 简介官网安装使用移动端滚动使用移动端联合滚动实现懒加载页面使用 扩展-什么是防抖和节流相同点区别 简介 BetterScroll 是一款重点解决移动端&#xff08;已支持 PC&#xff09;各种滚动场景需求的插件&#xff0c;是最接近与原生的滚动插件&…

51单片机定时/计数器相关知识点

51单片机定时/计数器相关知识点 结构组成 51单片机的定时/计数器中有两个寄存器&#xff1a; T0&#xff1a;低位&#xff1a;TL0&#xff08;字节地址8AH&#xff09;高位&#xff1a;TH0&#xff08;字节地址8CH&#xff09;T1&#xff1a;低位&#xff1a;TL1&#xff08…