博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
重学前端学习笔记(十三)--浏览器工作解析(三)
阅读量:5982 次
发布时间:2019-06-20

本文共 1679 字,大约阅读时间需要 5 分钟。

笔记说明

重学前端是程劭非(winter)【前手机淘宝前端负责人】在极客时间开的一个专栏,,笔者主要整理学习过程的一些要点笔记以及感悟,完整的可以加入winter的专栏学习【原文有winter的语音】,如有侵权请联系我,邮箱:kaimo313@foxmail.com。

一、概括

本文主要聊聊浏览器是如何把 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

后退的情况:

    1    23复制代码

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

3.2、后继选择器“ ~ ”

.cls~* {    border:solid 1px green;}复制代码
12 3 45
复制代码

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

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

3.3、子代选择器 “>”

div>.cls {    border:solid 1px green;}复制代码
12 3 45
复制代码

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

个人总结

之前学习css的时候没有想过是什么实现的,只知道怎么用,这样写能实现效果就行了,学习winter专栏之后,认识更深了,有些问题直接本质可能对你会影响更大。

转载于:https://juejin.im/post/5cd8538d6fb9a031ed20d7c7

你可能感兴趣的文章
mac下dashboard小控件开发实例(附源码)
查看>>
BAIR论文:通过“元学习”和“一次性学习”算法,让机器人快速掌握新技能
查看>>
一场会,100位顶级大咖,超过2G的PPT技术资料和超过50小时的技术视频与君分享...
查看>>
前MySQL CEO跳槽加入基准基金公司
查看>>
hbase集群写不进去数据的问题追踪过程
查看>>
JACK MA LAYS OUT HOPES, VISION FOR ALIBABA DAMO ACADEMY
查看>>
Alibaba Cloud and Red Hat Join Forces to Bring Increased Flexibility with Open Source
查看>>
保障金融无线网络安全从“头”开始
查看>>
安全应急响应的一些经验总结
查看>>
MIT TR 35 Anca Dragan:为了人类与机器人和谐地工作、生活而奋斗
查看>>
AlwaysON同步的原理及可用模式
查看>>
Disconf入门指南(1)
查看>>
物联网支付技术架构和发展趋势
查看>>
中建信息(834082)与亚信安全达成战略合作 双重安全为您保驾护航
查看>>
英特尔7.4亿美金投资Cloudera持股达18%
查看>>
为厂商赋能 阿里智能云加速互联网+实践
查看>>
零售互联网化“革命”从改造收银台开始
查看>>
程序员编程面试取胜的8个技巧
查看>>
浅谈保险业的信息安全
查看>>
网络安全的四层智能化革命
查看>>