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

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:

...

...

...

...

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

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

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

2.png

通过

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

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

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

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

3.png

和前面的例子一样,从

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

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

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

套用样式

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

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

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

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

目标属性

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

idRulesclassRulestagNameRulesuniversalRules

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

套用规则

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

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

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

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

CSS 效率

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

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

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

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

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

延伸

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

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

以上就是CSS元素选择器的运作原理介绍的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1616050.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月24日 05:13:23
下一篇 2025年12月24日 05:13:35

相关推荐

  • 了解css中容易被忽略特性,避免一些经常遇到的坑

    CSS初学感觉很简单,但随着学习的深入才感觉CSS的水由多深,平常总会遇到各种坑,先总结一些经常遇到的坑。 推荐教程:CSS视频教程 大小写不敏感 虽然我们平时在写CSS的时候都是用小写,但其实CSS并不是大小写敏感的 立即学习“前端免费学习笔记(深入)”; .test{ background-CO…

    2025年12月24日 好文分享
    000
  • 什么是CSS权重

    CSS权重是指选择符的优先级,优先级高的css样式会覆盖优先级低的样式,优先级越高说明权重越高。当css选择规则的权重不同时,权值高的优先。当css选择规则的权值相同时,后定义的规则优先。 要知道什么是CSS的权重,那么我们必须先了解CSS样式的6种基础选择器:ID选择器、类选择器、属性选择器、伪类…

    2025年12月24日
    000
  • 什么是css预编译

    css预编译是指通过能读取文件的语言编写的插件把文件解析成css文件,因为它们的文件名都不是css,写法也不是纯css,而是无法被浏览器识别的,所以写完需要编译一下才能使用,这便是css预编译。 预编译原理 通过能读取文件的语言编写的插件把文件解析成css文件,因为他们的文件名都不是css,写法也不…

    2025年12月24日
    000
  • css怎么设置图片的对比度

    css设置图片的对比度的方法:可以利用【filter:contrast(%)】属性来设置图片的对比度,如【filter:contrast(0%)】。filter属性定义了元素的可视效果,如模糊、饱和度、对比度等。 属性介绍: filter 属性定义了元素(通常是)的可视效果(例如:模糊与饱和度)。 …

    2025年12月24日
    000
  • css如何设置鼠标的形状

    css设置鼠标的形状的方法:可以利用cursor属性来进行设置,如【span.crosshair {cursor:crosshair;}】。cursor属性规定要显示的光标的类型,默认状态下光标是一个箭头。 cursor 属性规定要显示的光标的类型(形状)。 该属性定义了鼠标指针放在一个元素边界范围…

    2025年12月24日
    000
  • css中的流式布局是什么意思

    css中的流式布局是指页面中元素的宽度按照屏幕分辨率自动进行适配调整,它可以保证当前屏幕分辨率发生改变的时候,页面中的元素大小也可以跟着改变。 什么是流式布局 网页布局中包括:静态布局,流式布局,响应式布局和弹性布局几种情况。 (学习视频分享:css视频教程) 静态布局:指的就是网页中的所有元素都使…

    2025年12月24日
    000
  • 怎么用CSS调整背景图的大小

    用CSS调整背景图的大小的方法:可以利用background-size属性来进行调整,如【background-size:80px 60px;】。backgrond-size属性规定了背景图像的尺寸。 属性介绍: background-size 属性规定背景图像的尺寸。 (学习视频分享:css视频教…

    2025年12月24日
    000
  • css如何隐藏溢出来的文字

    css隐藏溢出来的文字的方法:可以利用text-overflow属性来实现,如【text-overflow:ellipaos;】,属性值ellipsis表示显示省略符号来代表溢出来的文字。 属性介绍: text-overflow 属性规定当文本溢出包含元素时发生的事情。 (学习视频分享:css视频教…

    2025年12月24日
    000
  • css伪元素是用来干嘛的

    css伪元素是用来添加一些选择器的特殊效果的,例如【:first-line】伪元素用来向文本首行设置特殊样式,【:first-letter】伪元素用于向文本的首字母设置特殊样式。 CSS伪元素是用来添加一些选择器的特殊效果。 (学习视频分享:css视频教程) 伪元素的语法: selector:pse…

    2025年12月24日
    000
  • css怎么控制字间距

    css控制字间距的方法是:利用letter-spacing属性来进行控制,如【h1 {letter-spacing:2px;}】。letter-spacing属性用于增加或减少字符间的空白(字符间距)。 本教程操作环境:windows10系统、css3,本文适用于所有品牌的电脑。 属性介绍: let…

    2025年12月24日
    000
  • css中rem有什么特点

    css中rem的特点是:使用rem为元素设定字体大小时,仍然是相对大小,但相对的是HTML根元素,例如【.b{font-size: 2rem;   //这里就8px;}】。 本教程操作环境:windows10系统、css3,本文适用于所有品牌的电脑。 rem:(相对于根元素的即HTML) rem是C…

    2025年12月24日
    000
  • css中list-style是什么意思

    css中list-style是一个简写属性,它涵盖了所有其他列表样式属性。list-style属性可以应用到任何元素中,并由list-item元素继承,如【list-style:square inside url()】。 本教程操作环境:windows10系统、css3,本文适用于所有品牌的电脑。 …

    2025年12月24日
    000
  • css文本属性有哪些

    css文本属性有:1、颜色属性color;2、文本方向direction;3、行高line-height;4、字符间距letter-spacing;5、文本阴影text-shadow;6、文本方向unicode-bidi。 css文本属性: (学习视频分享:java视频教程) color 设置文本颜…

    2025年12月24日
    000
  • css如何让图片自适应屏幕大小

    css让图片自适应屏幕大小的方法:在css文件中加入代码【img {height: auto; width: auto9; width:100%;}】即可。如果我们只想更改特定的图片,那么可以使用方法【height: auto;】。 本教程操作环境:windows10系统、css3,本文适用于所有品…

    2025年12月24日
    000
  • css中的内联元素是什么

    css中的内联元素是指行内元素,与块级元素对应。内联元素和它的兄弟元素之间一个挨着一个,都在同一行按从左至右的顺序显示,不单独占一行。内联元素通常被包含在块级元素中使用。 一、什么是内联元素? 内联元素有很多种叫法,如内联元素、内嵌元素、行内元素、直进式元素等,和块级元素对应。内联元素和它的兄弟元素…

    2025年12月24日
    000
  • css怎么让字体更大

    css让字体更大的方法:可以利用font-size属性来设置字体的大小,如【font-size:12px】。需要注意的是,font-size属性设置的是字体中字符框的高度。 本教程操作环境:windows7系统、css1版,该方法适用于所有品牌电脑。 相关推荐:CSS教程 css让字体更大 font…

    2025年12月24日
    000
  • css怎么实现文本的垂直排列

    css实现文本的垂直排列的方法:可以利用writing-mode属性来实现,如【writing-mode: vertical-rl;】。writing-mode属性定义了文本在水平或垂直方向上如何排布。 本教程操作环境:windows10系统、css3,本文适用于所有品牌的电脑。 writing-m…

    2025年12月24日
    000
  • css Bulma框架是什么

    css Bulma框架是一个开源、简单、现代的css框架,它基于flexbox模块,纯css没有js代码。Bulma框架的优点:1、为电脑、平板和手机提供响应式设计;2、纯css框架;3、代码优雅简洁。 Bulma是一个开源、简单、现代的CSS框架,它基于flexbox模块(用于开发响应式布局结构)…

    2025年12月24日
    000
  • css网页布局小技巧

    前端网页布局小技巧: (视频教程推荐:css视频教程) 1、ul标签在Mozilla中默认是有padding值的,而在IE中只有margin有值。 2、同一个的class选择符可以在一个文档中重复出现,而id选择符却只能出现一次;对一个标签同时使用class和id进行CSS定义,如果定义有重复,id…

    2025年12月24日
    000
  • css如何定义字体颜色

    css定义字体颜色的方法:可以利用color属性来自定义字体的颜色,如【color:red;color:#00ff00;color:rgb(0,0,255)】。合理的背景颜色与文本颜色搭配,可以提高文本的可读性。 本教程操作环境:windows10系统、css3,本文适用于所有品牌的电脑。 属性介绍…

    2025年12月24日
    000

发表回复

登录后才能评论
关注微信