重学前端
程劭非(winter)
前手机淘宝前端负责人
105347 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 57 讲
开篇词+学习路线+架构图 (3讲)
重学前端
15
15
1.0x
00:00/00:00
登录|注册

浏览器:一个浏览器是如何工作的(阶段三)

树形结构合并
||
匹配一次后失效
父元素条件
父元素条件
~
回退条件
匹配条件
空格
选择器重合
逗号分隔
列选择器
直接后继选择器
子代选择器
后继选择器
后代选择器
compound-selector
抽象语法树
词法分析和语法分析
显示相关属性添加
应用到DOM树
选择器
CSS规则处理
节点和属性构建
CSS语法解析结构
CSS计算过程
CSS规则应用到节点上
浏览器的DOM构建过程
浏览器工作阶段三

该思维导图由 AI 生成,仅供参考

你好,我是 winter。
在上一节课中,我已经讲了浏览器的 DOM 构建过程,但是这个构建的 DOM,实际上信息是不全的,它只有节点和属性,不包含任何的样式信息。
我们这一节课就来讲讲:浏览器是如何把 CSS 规则应用到节点上,并给这棵朴素的 DOM 树添加上 CSS 属性的。

整体过程

首先我们还是要感性地理解一下这个过程。
首先 CSS 选择器这个名称,可能会给你带来一定的误解,觉得好像 CSS 规则是 DOM 树构建好了以后,再进行选择并给它添加样式的。实际上,这个过程并不是这样的。
我们回忆一下我们在浏览器第一节课讲的内容,浏览器会尽量流式处理整个过程。我们上一节课构建 DOM 的过程是:从父到子,从先到后,一个一个节点构造,并且挂载到 DOM 树上的,那么这个过程中,我们是否能同步把 CSS 属性计算出来呢?
答案是肯定的。
在这个过程中,我们依次拿到上一步构造好的元素,去检查它匹配到了哪些规则,再根据规则的优先级,做覆盖和调整。所以,从这个角度看,所谓的选择器,应该被理解成“匹配器”才更合适。
我在 CSS 语法部分,已经总结了选择器的各种符号,这里再把它列出来,我们回顾一下。
空格: 后代,选中它的子节点和所有子节点的后代节点。
>: 子代,选中它的子节点。
+:直接后继选择器,选中它的下一个相邻节点。
~:后继,选中它之后所有的相邻节点。
||:列,选中表格中的一列。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了浏览器如何将CSS规则应用到DOM树上,为DOM结构添加显示相关属性的过程。首先介绍了CSS选择器的各种符号,如空格、>、+、~、||等,以及其在DOM树构建过程中的应用。然后详细讲解了后代选择器、后继选择器、子代选择器、直接后继选择器和列选择器的实现原理。文章还提到了CSS选择器的逗号分隔和选择器重合的处理方式。最后,留下了一个问题,探讨了CSS语法解析成何种结构最适合进行CSS计算。整体来说,本文通过深入浅出的方式,帮助读者了解了浏览器中CSS计算的过程,为读者打下了基础。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《重学前端》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(36)

  • 最新
  • 精选
  • 老师,对于这个问题,我也有疑问: dom树构建与cssom构建有先后关系吗?css计算与dom树流式构建同步进行是不是意味着dom树流式构建之前cssom已经构建完成呢?

    作者回复: 我这里说的确实有点歧义,cssom是有rule部分和view部分的,rule部分是在dom开始之前就构件完成的,而view部分是跟着dom同步构建的。

    2019-03-01
    17
  • 啊柴
    老师好,文中后代选择器是说先检查父级,匹配后再检查子级,以前学习看到比较多的一种说法是从关键选择器开始匹配,然后左移查找选择器的祖先元素,实践中也一直把最后一个选择器权重加高。请问这是从开始就学错了,还是我对两种说法理解有偏差呢?

    作者回复: 浏览器编写本身有不同的思路,但是按关键选择器这个思路,据我所知还没有实现。

    2019-02-14
    17
  • flow
    请问DOM去匹配css rule的时候是不是必须先等页面的css都下载完成后才会去匹配的?否则如果DOM匹配的时候对应的css还没下载完,后面怎么得到正确的css?

    作者回复: head中的css是要下载完的,body中放CSS的话,会重新计算。

    2019-02-16
    3
    14
  • 嗯喊我杰哥
    <也就是说,未来也不可能会出现“父元素选择器”这种东西, 因为父元素选择器要求根据当前节点的子节点,来判断当前节点是否被选中,而父节点会先于子节点构建。> 这句话后半句好难理解,有大神能通俗地解释一下吗

    作者回复: 意思是DOM树构造到父节点的时候,还不知道它有没有子节点,所以算不出来CSS。

    2019-02-14
    10
  • CC
    第一反应猜测 CSS 语法应该解析成对象(Object),然后根据 DOM 的树形结构,CSS 也会生成自己的树形结构。 查找验证后发现,这被称为 CSSOM(CSS Object Model)。 举个 CSSOM 的例子: body {font-size: 16px;} h1 {font-size: 2rem;} .orange {color: orange;} div {margin: 1rem 0;} div p {padding-bottom: 1rem;} 从根结点 body 开始,树形结构如下: * body {font-size: 16px;} * h1 {font-size: 2rem;} * .orange {color: orange;} * div {margin: 1rem 0;} * div p {padding-bottom: 1rem;} 不知道这样理解是否准确?

    作者回复: 哈哈 CSSOM不是这样子的,CSSOM主要是DOM结构上的盒的描述,它基本上是依附于DOM树的。 你说的这个东西,比较接近的是CSS的语法树。

    2019-02-14
    8
  • 乃乎
    CSS 没有父选择器那里讲得太好了,这个原因不能更合理

    作者回复: 其实Selector Level 4里面已经打破这个规则了,现在还是draft,也不知道最后能不能过。 要是真过了 webkit这块差不多得重写……

    2019-02-26
    2
    7
  • flow
    看到老师一个分享会的视频,说到DOM匹配css rule的时候是从右往左匹配的,为什么跟文章提到的后代选择器的匹配顺序相反呢?

    作者回复: 哈哈,是这样的没错,但是你看,新加了这么多运算符,所以思路也会有不一样。 其实浏览器实现是比较懒的,直接每条规则都检查了,没做合并优化。

    2019-02-16
    2
    7
  • Dylan-Tseng
    请问老师,有一点不是很明白,如果是在构建dom树的同时,就开始构建css,带空格选择子元素的时候,css怎么知道dom树有没有构建完成,是否有没有子元素,是怎么做匹配的?

    作者回复: 并不管有没有子元素,只是让这条规则前进一格。

    2019-02-20
    2
  • 啊咩
    || 列选择器 是最新的标准出的吗? 我在w3school和 菜鸟教程 都找不到这个选择器

    作者回复: Selector Level 3里的,不过不太重要,不用太在意。

    2019-02-22
    1
  • 么么
    按照文章的描述,css的匹配好像是从左到右匹配的,但是网上有很多文章说的是从右往左进行匹配的,这样的规则可以优化重复选择计算。那这种说法与文章上的是否右冲突?

    作者回复: 是没错,浏览器多数实现是从右往左匹配的,这个说法早年我还设计过实验,但是现在我觉得这是比较偷懒的做法,实际上关于”实现“并没有一定的规定,我这里讲的也仅仅是一种思路。

    2019-02-19
    1
收起评论
显示
设置
留言
36
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部