CSS选择器匹配规则

近期考虑对CSS进行一些重构,看着以前自己的代码整个人凌乱了。于是做了一些调研,看到一些不一样的地方给大家分享一下。

一、CSS的匹配规则

1、根据CSS定义位置来区别

平常所认为的优先级规则,从根本上来讲是片面的。

默认样式<外部样式表<内部样式表<行内样式    //是片面的

浏览器默认样式最低,行内样式最高,这是肯定的。
但是外部样式表和内部样式表其实优先级并没有太大的区别,只是我们一般都会在head中先引用外部样式表,再定义内部样式表,才形成了以上的观点。(你完全可以把外部样式表放到body的下面,虽然不太好但是规则是允许的)
对于所有的非行内自定义样式(可以统一称为样式表),

样式表的优先级完全取决于被引入或者定义的位置。

2、根据选择器的优先级来确定

选择器的优先级规则为:ID > 伪类 > 属性 > 类 > 元素 > 通配符,对于组合选择器的优先级就对以上规则从左到右依次进行比较,知道可以得出结果。
例如:#test_id div 则比#test_id .test_class的优先级要低。
通常为了保证样式的准确性,我们会使用较高优先级的选择器,或者使用多种选择器的组合形式。

3、!important

最高优先级

二、CSS选择器解析规则

前面讲到,为了保证样式应用的准确性,会使用多种选择器的组合形式。于是,就有了一些比较极端的写法——总是或者尽量使用更多层级的选择器组合。
从准确性来看,毫无问题;从性能上看,这样会有什么问题吗?
显然,这涉及到CSS的匹配规则。

1、从右到左的匹配规则

通常思维是选择器指定越详细,则越容易匹配,性能越好。这种观点建立的基础是,对每一个CSS样式去查询匹配dom中的节点,那么选择器的详细程度越高,就越能减少查询的冗余,性能越好。例如:

.test_class .test_span1{} // 样式1
.test_class .test_div1 .test_span1{} // 样式2
// 布局
<div class="test_class">
        <div class="test_div1"><span class="test_span1">测试1</span></div>
        <div class="test_div2"><span class="test_span2">测试2</span></div>
</div>

按照上述规则,样式1会比样式2多做一次比较,即对test_span2的比较。
这种CSS查询匹配dom节点的方式,就是常说的从左到右的匹配规则(针对CSS选择器而言)——针对样式1,从左到右匹配5次,从右到左匹配7次。

2、从右到左的匹配规则

还有一种思维是选择器指定越精简,则越容易匹配,性能越好。这种观点建立的基础是,对每一个dom节点去查询匹配CSS中的样式,那么选择器的详细程度越高,查询匹配的次数就越多,性能越差。例如:

 .test_div1 .test_span{} // 样式1
.test_class .test_div1 .test_span{} // 样式2
// 布局
<div class="test_class">
        <div class="test_div1"><span class="test_span">测试1</span></div>
</div>

按照上述规则,针对“测试1”的样式匹配,样式1要比样式2少1次匹配。这种dom节点查询匹配CSS选择器的方式,就是常说的从右到左的匹配规则(针对CSS选择器而言)——针对样式1,从左到右匹配3次,从右到左匹配2次。

3、CSS选择器匹配规则

事实上虽然上述两种匹配方式都有一定到理论性,但是结论只有一个——从右到左。至于原因,先来看一下一些有趣的回答。

3.1 哲学思维

人可以选择两条路,但是真正走的却只有一条。

最根本的道理。

3.2 价值取向

英文顺序一般先小后大,先具体后宽泛,例如姓名是先名后姓,地址是X号X街X城市X州、日期是日/月/年。
西方比较强调个体价值,中国比较强调家族观念。
而从右到左正好符合了西方的个体价值观。
——很性感的思维。

3.3、Sunday算法

这里只做了一个概述,具体的可以自己百科一下,还挺有意思的。

Sunday算法是Daniel M.Sunday于1990年提出的字符串模式匹配。其核心思想是:在匹配过程中,模式串发现不匹配时,算法能跳过尽可能多的字符以进行下一步的匹配,从而提高了匹配效率。

而从右向左也正符合这一算法。

3.4、浏览器加载方式

访问网页的整个过程在浏览器的表现:

请求数据--词法语法解析--下载link文件--生成dom树--构建render树--绘制

而CSS样式的匹配正是在构建render树时进行的,所以需要采用对每个dom节点查询匹配CSS选择器的方式,即从右到左的匹配规则(从1、2可以知道这样匹配的次数较少)。

三、结论

很显然,我们在定义样式的选择器时,在准确表达的情况下,应该尽量较少选择器组合中的冗余,从一定程度上提升CSS的性能。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,902评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,037评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,978评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,867评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,763评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,104评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,565评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,236评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,379评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,313评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,363评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,034评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,637评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,719评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,952评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,371评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,948评论 2 341

推荐阅读更多精彩内容

  • 1. 介绍 浏览器可能是最广泛使用的软件。本书将介绍浏览器的工作原理。我们将看到,当你在地址栏中输入google....
    康斌阅读 2,005评论 7 18
  • 简介网络浏览器很可能是使用最广的软件。在这篇入门文章中,我将会介绍它们的幕后工作原理。我们会了解到,从您在地址栏输...
    wengjq阅读 1,994评论 2 15
  • 1.CSS 元素选择器 最常见的 CSS 选择器是元素选择器。换句话说,文档的元素就是最基本的选择器。如果设置 H...
    饥人谷_小侯阅读 847评论 0 1
  • 这一个星期 我看完了三本所谓的杂书 在如此忙碌的生活中 我都很少会有一个月看完一本书的时候了 有堆积如高山的作业要...
    噗啦噗嗤阅读 1,927评论 0 0
  • 想象力小孩子总是更丰富,因为没有条条框框的限制,但是成人的联想能力也不容易小觑,因为他们有更多的生活经验, 超过3...
    V5特湘叶叶阅读 487评论 0 0