浏览器是如何解析CSS选择器的

在生成渲染树的过程中,渲染引擎会根据选择器提供的信息来遍历 DOM 树,找到对应的 DOM 节点后将样式规则附加到上面。

来看一段样式选择器代码、以及一段要应用样式的 HTML:

css:

.mod-nav h3 span {font-size: 16px;
}

html: 

<div class="mod-nav"><header><h3><span>标题</span></h3></header><div><ul><li><a href="#">项目一</a></li><li><a href="#">项目一</a></li><li><a href="#">项目一</a></li></ul></div>
</div><div class="box">...
</div>

渲染引擎是怎么根据以上样式选择器去遍历这个 DOM 树的呢?是按照从左往右的选择器顺序去匹配,还是从右往左呢?

为了更直观的观查,我们先将这棵 DOM 树先绘制成图:

然后我们来对比一下两种顺序的匹配:

  1. 遍历所有的元素, 找有 .mod-nav 类的节点

  2. .mod-nav 开始遍历所有的⼦孙节点 headerdivh3ul ....

    遍历所有的后代元素后, 知道了, 整个子孙后代只有一个 h3

  3. 找到 h3 , 还要继续重新遍历 h3 的所有子孙节点, 去找 span

    

问题: 会进行大量树形结构子孙节点的遍历, 这是非常消耗成本的!

这在真实页面中⼀棵 DOM 树的节点成百上千的情况下,这种遍历方式的效率会非常的低,根本不适合采用。

从右往左:span => h3 => .mod-nav

  1. 先找到所有的 span 节点 ,然后基于每⼀个 span 再向上查找 h3

  2. h3 再向上查找 .mod-nav 的节点

  3. 最后触及根元素 html 结束该分⽀遍历

    ...

从右向左的匹配规则, 只有第一次会遍历所有元素找节点, 而剩下的就是在看父辈祖辈是否满足选择器的条件, 匹配效率大大提升!

因此,浏览器遵循 “从右往左” 的规则来解析 CSS 选择器!

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

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

相关文章

10Linux 进程管理学习笔记

Linux 进程管理 目录 文章目录 Linux 进程管理一.进程1.显示当前进程状态(ps)进程树(pstree)1.1实时显示进程信息(top)顶部概览信息&#xff1a;CPU 状态&#xff1a;内存状态&#xff1a;进程信息表头&#xff1a;进程列表&#xff1a;1.2(htop) 2.终止进程(kill)2.1通过名称…

Jetson Orin Nano安装使用;cuda、pytorch安装;yolo使用

参考: https://blog.csdn.net/q839039228/article/details/126278528 1、jtop工具安装 安装jtop资源查看: sudo apt update sudo apt upgrade安装: sudo apt install curl nanosudo pip install jetson-stats查看: jtop 按2查看GPU 按3查看CPU 2、JetPack套件 参…

修改云主机配置 - 内存增容

文章目录 一、修改云主机配置缘由二、修改云主机配置步骤1、查看云主机概述2、查看master云主机3、更改master云主机配置4、查看master云主机 三、使用Spark Shell玩Saprk SQL1、启动HDFS服务2、启动Spark集群3、启动集群模式Spark Shell4、读取文件生成单例数据帧5、将单列数据…

C语言----字符串、字符数组

一、定义 C语言中的字符串是以字符数组的形态存在的 在C语言中&#xff0c;没有字符串类型&#xff0c;字符串实际上是使用空字符\0结尾的一维字符数组。因此&#xff0c;\0是用于标记字符串的结束。 二 、如何创建字符串&#xff1f; 1.通过字符数组来创建字符串&#xff0…

某黑产组织最新攻击样本利用BYVOD技术的详细分析

前言概述 最近一两年BYVOD技术被广泛应用到了各种黑产攻击、APT攻击以及勒索病毒攻击活动当中&#xff0c;笔者近期在对某黑产组织进行跟踪&#xff0c;捕获到该组织的最新攻击样本&#xff0c;通过某安全厂商的驱动漏洞&#xff0c;利用BYVOD技术对抗其他安全软件包括各种EDR…

单片机+M26429+PAM8403+MH-M18无线蓝牙音频功放设计 原理图PCB源程序

目录 功能描述&#xff1a; 原理图 PCB ​代码 资料下载地址&#xff1a;单片机M26429PAM8403MH-M18无线蓝牙音频功放设计 原理图PCB源程序 功能描述&#xff1a; 1&#xff0c;无线蓝牙连接&#xff0c;手机可控制歌曲音频选择。 2&#xff0c;音频声音的大小可控制一排…

博客摘录「 Nuplayer 音视频同步学习笔记」2024年4月9日

4. AVsync Audio更新锚点时间 (1) AVsync原理 系统时间和媒体时间应该是线性关系: (mediaTimeUs - anchorTimeMediaUs) PlaybackRate*(nowUs - anchorTimeRealUs)。 所以理论上&#xff0c;我们可以根据锚点, 计算出任意一点的媒体时间对应的系统时间(Buffer应该播放的时间).…

三维模型轻量化工具:手工模型、BIM、倾斜摄影等皆可用!

老子云是全球领先的数字孪生引擎技术及服务提供商&#xff0c;它专注于让一切3D模型在全网多端轻量化处理与展示&#xff0c;为行业数字化转型升级与数字孪生应用提供成套的3D可视化技术、产品与服务。 老子云是全球领先的数字孪生引擎技术及服务提供商&#xff0c;它专注于让…

Docker安装Bitbucket

centos7版本 [rootlocalhost ~]# cat /etc/os-release NAME"CentOS Linux" VERSION"7 (Core)" ID"centos" ID_LIKE"rhel fedora" VERSION_ID"7" PRETTY_NAME"CentOS Linux 7 (Core)" ANSI_COLOR"0;31"…

sectigo和certum ip ssl证书的区别

IP SSL证书是一种数字证书&#xff0c;为客户端和服务器之间的信息传输提供加密服务。但是和应用比较广泛的域名SSL证书相比&#xff0c;IP SSL证书是为只有公网IP地址的网站准备的数字证书。市场上常见的IP SSL证书品牌就是Sectigo和Certum&#xff0c;那么&#xff0c;这两种…

[AI Google] Ask Photos: 使用Gemini搜索照片的新方法

借助Gemini模型&#xff0c;将Google Photos提升到一个新的水平。 Google Photos是我们最早以AI为核心构建的产品之一&#xff0c;让你能够搜索照片和视频中的人、宠物、地点等。现在&#xff0c;我们通过我们最强大的AI模型Gemini对Google Photos进行重大升级。通过Ask Photos…

【C/C++】——小白初步了解——内存管理

目录 1. C/C内存分布 代码区&#xff08;Code Segment&#xff09;&#xff1a; 数据区&#xff08;Data Segment&#xff09;&#xff1a; 堆区&#xff08;Heap&#xff09;&#xff1a; 栈区&#xff08;Stack&#xff09;&#xff1a; 常量区&#xff08;Constant Seg…

数据中心横向虚拟化 M-LAG 技术

M-LAG 一、M-LAG概述 1、M-LAG定义&#xff1a;M-LAG&#xff08;Multichassis Link Aggregation Group&#xff09;是跨设备链路聚合组。可以将两台设备进行跨设备链路聚合&#xff0c;从而把链路的可靠性从单板机提高到了设备级。 2、优势&#xff1a; (1)、M-LAG系统的两台…

UE 打包报错 MarketplaceRules.dll‘ does not exist.

Precompiled rules assembly /Users/unity/Library/Application Support/Epic/UnrealEngine/Intermediate/Build/BuildRules/MarketplaceRules.dll does not exist. Window下找到该DLL 拷到Mac对应的目录下即可。如没有则需要手动创建相应的文件夹 /Users/unity/Library/Appl…

# 全面解剖 消息中间件 RocketMQ-(5)

全面解剖 消息中间件 RocketMQ-&#xff08;5&#xff09; 一、RocketMQ &#xff1a;过滤消息的两种方式 1、Tag 过滤 在大多数情况下&#xff0c;TAG 是一个简单而有用的设计&#xff0c;其可以来选择您想要的消息。 例如: DefaultMoPushconsumer consumer new DefaultM…

vuePC 录制桌面 并下载到本地

页面代码 <button click"startRecording">开始录制桌面</button> <button click"stopRecording" :disabled"!isRecording">结束录制</button> js代码 // 录制桌面 保存到本地 methods&#xff1a;{async startRecordi…

文件夹突变解析:类型变文件的数据恢复与预防

在数字化时代&#xff0c;文件夹作为我们存储和组织数据的基本单元&#xff0c;其重要性不言而喻。然而&#xff0c;有时我们可能会遇到一种令人困惑的情况——文件夹的类型突然变为文件&#xff0c;导致无法正常访问其中的内容。这种现象不仅会影响我们的工作效率&#xff0c;…

[MySQL最详细的知识点]

MySQL 关系型数据库以一行作为一个记录,列数据库以一列为一个记录一行是一个记录,一列是一个字段一行是一个实体,一列是一个属性 MySQL引擎: MySQL引擎&#xff1a;可以理解为&#xff0c;MySQL的“文件系统”&#xff0c;只不过功能更加强大。​MySQL引擎功能&#xff1a;除…

mysql 分区

目标 给一个表&#xff08;半年有800万&#xff09;增加分区以增加查询速度 约束 分区不能有外键否则会报错 https://blog.csdn.net/yabingshi_tech/article/details/52241034 主键 按照时间列进行分区 https://blog.csdn.net/winerpro/article/details/135736454 参看以…

微波炉触摸芯片的工作原理及技术特点

随着科技的不断发展&#xff0c;微波炉已经成为现代家庭中不可或缺的厨房电器之一。而触摸面板作为微波炉的重要组成部分&#xff0c;其操作的便捷性和灵敏度直接影响用户的使用体验。在触摸面板的设计中&#xff0c;触摸芯片起着关键的作用。本文将深入探讨微波炉触摸面板中触…