天涯论坛

 找回密码
 立即注册
搜索
查看: 78|回复: 4

css & 深入理解 css 选取器优先级

[复制链接]

3107

主题

176

回帖

9909万

积分

论坛元老

Rank: 8Rank: 8

积分
99098703
发表于 2024-6-30 07:04:28 | 显示全部楼层 |阅读模式

1、什么是选取器优先级?

浏览器经过优先级来判断那些属性值与一个元素最为关联,从而在该元素上应用这些属性值。优先级是基于区别种类选取构成的匹配规则。

以上字段定义来自https://developer.mozilla.org/zh-CN/docs/Web/CSS/Specificity

先抛出个问题,下面例子字体颜色最后是什么颜色,以及为何
<div class="item" id="item"> item </div> <style> #item { color: #f00; }/*红色*/ .item { color: #0f0; }/*绿色*/ </style>

答案很简单:红色。

这就触及到了优先级问题,同一起内容,咱们同时用了 ID选取器 和 类选取器,由于 ID选取器 优先级大于 类选取器 , 因此最后表示为红色。

2、优先级的计算规则

广泛已知选取器优先级关系是:

内联 > ID选取器 > 类选取器 > 标签选取

然则,浏览器详细的优先级算法是怎么样的?可能还有些人不晓得。《CSS Refactoring》中说到了算法的过程 。

A specificity is determined by plugging numbers into A, B, C, D):

If the styles are applied via the style attribute, a=1; otherwise, a=0.B is equal to the number of ID selectors present.C is equal to the number of class selectors, attribute selectors, and pseudoclasses present.D is equal to the number of type selectors and pseudoelements present.

翻译过来便是

优先级是由于 A 、B、C、D 的值来决定的,其中它们的值计算规则如下:

倘若存在内联样式,那样 A = 1, 否则 A = 0;B 的值等于 ID选取器(#id) 显现的次数;C 的值等于 类选取器(.class) 和 属性选取器(a[]) 和 伪类(:first-child) 显现的总次数;D 的值等于 标签选取器(div,span,a) 和 伪元素(::before,::after) 显现的总次数 。

以上理论按照奉上,先上个栗子:

#name > div > span > a.hover

套用上面的算法,依次求出 A B C D 的值:

由于内联样式 ,因此 A = 0ID选取器总共显现了1次, B = 1类选取显现了1次, 属性选取显现了0次,伪类选取显现0次,因此 C = (1 + 0 + 0) = 1标签选取显现了3次, 伪元素显现了0次,因此 D = (3 + 0) = 3

经过以上过程算出的A 、 B、C、D 能够简记作:(0, 1, 1, 3)。

为了熟悉把握优先级算法 ,咱们再来做有些练习:

li /* (0, 0, 0, 1) */ ul li /* (0, 0, 0, 2) */ ul ol+li /* (0, 0, 0, 3) */ h1 + *[REL=up] /* (0, 0, 1, 1) */ ul ol li.red /* (0, 0, 1, 3) */ li.red.level /* (0, 0, 2, 1) */ .a1.a2.a3.a4.a5.a6.a7.a8.a9.a10.a11 /* (0, 0, 11,0) */ #name /* (0, 1, 0, 0) */ li:nth-child(odd) main .name /* (0, 0, 2, 2) */ #name .active > a:hover /* (0, 1, 2, 1) */ html body #name .active > a:hover /* (0, 1, 2, 3) */

经过一段小代码的练习已然能清楚了优先级是怎么算的了。但





上一篇:CSS--选取器及其优先级
下一篇:光纤收发器有哪几种
回复

使用道具 举报

0

主题

1万

回帖

1

积分

新手上路

Rank: 1

积分
1
发表于 2024-8-25 13:12:09 | 显示全部楼层
你的见解真是独到,让我受益匪浅。
回复

使用道具 举报

3138

主题

3万

回帖

9996万

积分

论坛元老

Rank: 8Rank: 8

积分
99968624
发表于 2024-10-24 19:08:02 | 显示全部楼层
我完全赞同你的观点,思考很有深度。
回复

使用道具 举报

3047

主题

3万

回帖

9606万

积分

论坛元老

Rank: 8Rank: 8

积分
96065852
发表于 2024-10-30 05:42:54 | 显示全部楼层
你的见解真是独到,让我受益匪浅。
回复

使用道具 举报

3061

主题

3万

回帖

9913万

积分

论坛元老

Rank: 8Rank: 8

积分
99139052
发表于 昨天 23:33 | 显示全部楼层
楼主发的这篇帖子,我觉得非常有道理。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

站点统计|Archiver|手机版|小黑屋|天涯论坛 ( 非经营性网站 )|网站地图

GMT+8, 2024-11-23 09:59 , Processed in 0.114287 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.