搜索
首页web前端css教程CSS元素选择器的运作原理介绍

CSS元素选择器的运作原理介绍

Nov 11, 2020 pm 05:56 PM
csshtmljavascript前端

CSS元素选择器的运作原理介绍

推荐教程:CSS视频教程

在前端工程师的日常工作中,使用 CSS 元素选择器是稀松平常的事;无论你是编写一般的 CSS 还是需要经过编译的 SASS,SCSS,LESS等,最终都被编译成一行一行的 CSS 样式属性,最终交给浏览器解析并套用。但是你想过没有这是如何实现的呢?

浏览器渲染

我们先看一下浏览器的渲染步骤:

1.png

CSS 在被浏览器加载后,会被解析成 CSSOM 树,并尝试与 Dom 叠加成渲染树,随后进行计算位置、渲染等步骤。这样看来,CSS 属性套用的关键就在于如何从 CSS 转化成 CSSOM 树,以及怎么把 CSSOM 套用到 DOM 上去。

CSSOM树

当我们写下一组 CSS 样式时,例如:

#id .class h4 + p {
   ...
}

浏览器在解析它时,你可能会认为 CSS 会按照由左到右的依序找出#id>.class>h4>p,最后套用,但实际上浏览器解析 CSS 的顺序是由右到左p>h4>.class>#id

很违背直觉对吧?但如果考虑到性能问题,从右到左的解析会比从左到右强很多。

假设这有这样的 HTML:

<p id="p1">
    <p class="a">
        <p class="b">
            ...
        </p>
        <p class="c">
            <p class="d">
                ...
            </p>
            <p class="e">
                ...
            </p>
        </p>
    </p>
    <p class="f">
        <p class="c">
            <p class="d">
                ...
            </p>
        </p>
    </p>
</p>

以及这边五条 CSS 样式规则:

#p1 .c .d {}
.f .c .d {}
.a .c .e {}
#p1 .f {}
.c .d {}

让我们模拟一下,如果把 CSS 从左到右解析,将会生成类似这样的 CSSOM 树:

2.png

通过 <p class =“ d”> 中的 .d 来思考,这样的 CSSOM 树在套用样式时,必须对所有的样式规则进行检查,以确认样式规则是否会影响到 .d,到最后才能确定可能会影响到 .d 的样式规则有这三条:

  • #p1 .c .d
  • .f .c .d
  • .c .d

以此类推,每个 DOM 树上的元素,都必须便利所有的样式规则,才可以取得个别的样式,这样会造成大量冗余的计算,进而严重影响性能。

反过来,如果将前面的 CSS 由右到左进行解析,CSSOM 树则可能会如下:

3.png

和前面的例子一样,从 <p class =“ d”>.d 的角度来看,由于会被样式规则影响到的目标元素,已经全都集中在第一层了,所以就不用再去便利整个 CSSOM 树了,甚至只需要检查 .d 以下的子属性变量是否符合实际 DOM 结构,再将所有符合的样式规则重新取回,便能完成 .d 对元素的样式规则套用。

从右到左的解析顺序能够将所有共享的规则路径收拢在一起,当浏览器进行属性比对时,就不用再便利整个 CSSOM 树,大大的减少了无效的比对计算。

也可以换个方式思考:在 HTML 的结构中,一个元素可以有无数个子元素,但只能有一个父元素,由子找父(由下往上)搜寻绝对是比较快的。

套用样式

将 CSSOM 树解析出来之后就能够和 DOM 结合了吗?如果真的有这么简单就太好了。

除了开发者定义好的 CSS 档外,还有几个地方可能会定义样式规则,影响画面的渲染:

  • HTML 的 inline style 设置
  • 浏览器预设值(就是 CSS reset/normalize 要覆盖掉的东西)
  • 浏览器的使用者偏好设定

浏览器负责处理 CSS 的部分,会吧前面所有的东西以及 CSS 文件定义的样式规则分别整理成单独的样式规则组(CSS 规则集),内容记载了样式规则、目标属性等信息。

目标属性

为了提升后面的计算效率,浏览器的 CSS 处理内核会按照样式规则组中个别规则的目标属性将其分组存放;一共分为以下四组

  • idRules
  • classRules
  • tagNameRules
  • universalRules

这样在取用时,可以依据目标元素是否存在这个属性,快速筛出可能会套用的样式。

套用规则

最后是套用规则。浏览器会遵循以下顺序和样式规则权重套用所有的样式规则:

  • 浏览器的预设值
  • 浏览器的使用者偏好设定
  • 开发者定义的 CSS
  • inline style
  • 加上 !important 的样式属性

你可能会好奇:为什么 inline style 和开发者定义的 CSS 会被另外处理?

我们可以回顾一下浏览器渲染的步骤,由于 inline style 存在于 DOM 元素中,只能在 CSS 套用到 DOM 上时才会接触到,事前无法将两者结合。

CSS 效率

实际上浏览器在这里已经完成了优化机制;浏览器会自动将状态一致的元素做样式快照。状态一致就是要满足以下几个条件:

  • 没有设定 ID
  • tag 及 class 必须完全一致
  • 没有设定 style 属性
  • 样式规则中不能使用各种同级选择器(例如: +:first-child 等)

由于上面的条件,以及前面讨论到的 CSS 运算过程,编写 CSS 时也有几个地方可以稍微留心一下:

  • 由于样式规则的目标属性会分组存放,id 选择器效率非常高,所以是不能与其他条件混用的。
  • 不要写过深的 CSS 样式规则
  • 能不用 inline style 就不要用,除了难以维护外,由于是存在于 DOM 树上,无法预先与其他样式合并计算,所以效率也会大打折扣

如果能够注意到这类典型的小细节,CSS 效率自然也可以大幅提升。

延伸

认识了 CSS 选择器之后,你一定会很好奇,JavaScript 的元素选择器又是怎么回事呢?这个问题可以参考 jQuery 的源码,它是由左到右的解析,至为什么为什么不一样,其实在文中也有答案,就留给你思考挖掘吧。

更多编程相关知识,请访问:编程入门!!

以上是CSS元素选择器的运作原理介绍的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文转载于:segmentfault。如有侵权,请联系admin@php.cn删除
感觉就像我没有释放:走向理智的旅程感觉就像我没有释放:走向理智的旅程Apr 23, 2025 am 09:19 AM

像白痴一样部署的部署归结为您部署的工具与降低复杂性与添加的复杂性之间的奖励之间的不匹配。

因此,您想放弃CSS前和后处理器...因此,您想放弃CSS前和后处理器...Apr 23, 2025 am 09:18 AM

曾经有一个本地CSS缺乏许多基本功能的时候,使开发人员能够提出各种方式,使CSS更容易撰写。

新的'网络”准备报告新的'网络”准备报告Apr 23, 2025 am 09:14 AM

HTML 5准备就绪是一个通过颜色彩虹展示的网站,浏览器支持多个Web功能。那新版本呢?

用Astro组件和打字稿制作强大的DX用Astro组件和打字稿制作强大的DXApr 23, 2025 am 09:10 AM

我们可以始终如一地帮助团队代码的一件事是提供类型检查,以便在编码时可为特定组件提供所有可配置的选项。布莱恩(Bryan

模拟鼠标运动模拟鼠标运动Apr 22, 2025 am 11:45 AM

如果您曾经在现场演讲或课程中必须显示一个互动动画,那么您可能知道它并不总是那么容易与您的幻灯片进行互动

通过Astro Action和Fuse.js为搜索提供动力通过Astro Action和Fuse.js为搜索提供动力Apr 22, 2025 am 11:41 AM

对于Astro,我们可以在构建过程中生成大部分网站,但是有一小部分服务器端代码可以使用Fuse.js之类的搜索功能来处理搜索功能。在此演示中,我们将使用保险丝搜索一组个人“书签”

未定义:第三个布尔值未定义:第三个布尔值Apr 22, 2025 am 11:38 AM

我想在我的一个项目中实现一条通知消息,类似于您在保存文档时在Google文档中看到的信息。换句话说,一个

捍卫三元声明捍卫三元声明Apr 22, 2025 am 11:25 AM

几个月前,我正在使用黑客新闻(就像一个人一样),并且遇到了一篇(现已删除的)文章,内容涉及不使用if语句。如果您是这个想法的新手(就像我

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

VSCode Windows 64位 下载

VSCode Windows 64位 下载

微软推出的免费、功能强大的一款IDE编辑器

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

SublimeText3 英文版

SublimeText3 英文版

推荐:为Win版本,支持代码提示!