重学前端 13 # 浏览器工作解析(三)

简介: 重学前端 13 # 浏览器工作解析(三)

一、概括


本文主要聊聊浏览器是如何把 CSS 规则应用到节点上,并给这棵朴素的 DOM 树添加上 CSS 属性的。



二、CSS构建过程


构建 DOM 的过程是:从父到子,从先到后,一个一个节点构造,并且挂载到 DOM 树上的,那么这个过程中,依次拿到上一步构造好的元素,去检查它匹配到了哪些规则,再根据规则的优先级,做覆盖和调整。


2.1、选择器


  • 空格: 后代,选中它的子节点和所有子节点的后代节点
  • >: 子代,选中它的子节点
  • +:直接后继选择器,选中它的下一个相邻节点
  • ~:后继,选中它之后所有的相邻节点
  • ||:列,选中表格中的一列


选择器有个特点,那就是选择器的出现顺序,必定跟构建 DOM 树的顺序一致。这是一个 CSS 设计的原则,即保证选择器在 DOM 树构建到当前节点时,已经可以准确判断是否匹配,不需要后续节点信息。


接下来看一下操作过程。



三、操作过程


首先,须把 CSS 规则进行处理。作为一门语言,CSS 需要先经过词法分析和语法分析,变成计算机能够理解的结构。将其抽象成一棵可用的抽象语法树。


一个 compound-selector 是检查一个元素的规则,而一个复合型选择器,则是由数个 compound-selector 通过前面讲的符号连接起来的。



3.1、后代选择器 “空格”


后代选择器的作用范围是父节点的所有子节点,因此规则是在匹配到本标签的结束标签时回退。

a#b .cls {
    width: 100px;
}


当匹配 a#b 的元素时,才会开始检查它所有的子代是否匹配 .cls

后退的情况:

<a id=b>
    <span>1<span>
    <span class=cls>2<span>
</a>
<span class=cls>3<span>


这段代码里有 cls 类的有有两个 span 标签,所以为了防止第三个 span 才不会被选中,当遇到 </a> 时,必须使得规则 a#b .cls 回退一步。



3.2、后继选择器“ ~ ”

.cls~* {
    border:solid 1px green;
}
<div>
<span>1<span>
<span class=cls>2<span>
<span>
    3
    <span>4</span>
<span>
<span>5</span>
</div>


上面代码可以看出 .cls 选中了span2,它的后继应该是 span3,span4是span3的子节点不应被选中, span5是后继应该被选中。


从上面我们可以得出一个结论:后继节点和当前节点父元素相同是充分必要条件。




3.3、子代选择器 “>”

div>.cls {
    border:solid 1px green;
}
<div>
<span>1<span>
<span class=cls>2<span>
<span>
    3
    <span>4</span>
<span>
<span>5</span>
</div>


DOM 树构造到 div 时,匹配了 CSS 规则的第一段,激活后面的 .cls 选择条件,并且指定父元素必须是当前 div。于是span2就会被选中。


3.4、直接后继选择器 “+”

直接后继选择器只对唯一一个元素生效,不需要像前面几种一样反复激活和关闭规则。


3.5、列选择器 “ || ”

列选择器比较特别,它是专门针对表格的选择器。


3.6、其他

3.6.1、逗号分隔

/* 这里用,隔开,可以当作两条规则处理 */
a#b, .cls {
}
a#b {
}
.cls {
}


3.6.2、选择器重合

可以使用树形结构来进行一些合并,来提高效率。

#a .cls {
}
#a span {
}
#a>span {
}


上面选择器可以构建成一棵树


  • #a    
  • < 空格 >.cls
  • < 空格 >span
  • >span
目录
相关文章
|
1月前
|
前端开发
调试前端时,在浏览器上修改参数并重新调用接口
有时候我们的页面点击过了,但是接口出问题,想修改参数再调用一次,一般是用apiPost工具把接口复制,再加上token和参数,但是这样非常的效率比较低。
42 0
|
1月前
|
资源调度 前端开发 JavaScript
构建高效前端项目:现代包管理器与模块化的深度解析
【2月更文挑战第21天】 在当今快速演变的前端开发领域,高效的项目管理和代码组织已成为成功交付复杂Web应用的关键。本文将深入探讨现代前端包管理器如npm, yarn和pnpm的工作原理,以及它们如何与模块化编程实践(例如CommonJS、ES6模块)协同工作以优化开发流程。我们将剖析这些工具的内部机制,了解它们如何解决依赖冲突,提高安装速度,并保证项目的健壮性。同时,本文还将介绍模块化编程的最佳实践,包括代码拆分、重用和版本控制,帮助开发者构建可维护且性能卓越的前端项目。
|
1月前
|
前端开发 UED
前端解析Excel文件
前端解析Excel文件
34 0
|
14天前
|
监控 前端开发 JavaScript
如何使用浏览器调试前端代码?
【4月更文挑战第11天】前端开发中,浏览器调试是关键技能,能提升代码质量。本文介绍了如何使用浏览器的调试工具:1) 打开调试窗口(F12或右键检查);2) Elements标签页检查DOM结构和样式;3) Console调试JavaScript,查看日志和错误信息;4) Sources设置断点调试JS文件;5) 利用Network、Performance和Memory等标签页优化性能。熟悉调试工具、利用日志和错误信息能有效定位问题,提高开发效率。
37 7
|
1月前
|
前端开发 JavaScript 程序员
推荐给前端程序员的5款浏览器插件
推荐给前端程序员的5款浏览器插件
|
1月前
|
SQL 存储 JavaScript
前端浏览器调试详解版
前端浏览器调试详解版
55 0
|
2月前
|
缓存 前端开发 JavaScript
前端性能优化实践与原理解析
【2月更文挑战第3天】 在当今互联网时代,前端性能优化已经成为了开发人员必须要面对的重要课题。本文将结合实际案例,探讨前端性能优化的一些实践方法,并深入分析其背后的原理,旨在帮助开发者更好地理解和应用前端性能优化技术。
21 5
|
2月前
|
JSON 前端开发 JavaScript
从前端到后端——Web开发的全流程解析
【2月更文挑战第2天】Web开发涉及多个方面,从前端设计到后端实现,需要开发者具备一定的技术能力和知识储备。本文将以一个简单的Web应用为例,详细介绍Web开发的全流程。
|
8月前
|
Web App开发 前端开发 JavaScript
前端学习笔记202307学习笔记第五十七天-模拟面试笔记react-fiber解决了什么问题
前端学习笔记202307学习笔记第五十七天-模拟面试笔记react-fiber解决了什么问题
95 0
|
8月前
|
前端开发 定位技术
前端学习笔记202305学习笔记第二十三天-地图单线程配置
前端学习笔记202305学习笔记第二十三天-地图单线程配置
65 0
前端学习笔记202305学习笔记第二十三天-地图单线程配置

推荐镜像

更多