CSS选择器权重值的计算

权重顺序 “important > 内联 > ID > 类 > 标签 | 伪类 | 属性选择 > 伪对象 > 继承 > 通配符”。选择器权重值的计算;

    A:如果规则是写在标签的style属性中(内联样式),则A=1,否则,A=0. 对于内联样式,由于没有选择器,所以B、C、D的值都为0,即A=1, B=0, C=0, D=0(简写为1,0,0,0,下同)。

    B:计算该选择器中ID的数量。(例如,#header 这样的选择器,计算为0, 1, 0, 0)。

    C:计算该选择器中伪类及其它属性的数量(包括class、属性选择器等,不包括伪元素)。(例如, .logo[id='site-logo'] 这样的选择器,计算为0, 0, 2, 0)。

    D:计算该选择器中伪元素及标签的数量。(例如,p:first-letter 这样的选择器,计算为0, 0, 0, 2)。

总结
  1. 一条样式规则的整体权重值包含四个独立的部分:[A, B, C, D];
  2. A表示内联样式,只有1或者0两个值;
  3. B表示规则中ID的数量;
  4. C表示规则中除了ID、标签和伪元素以外的其它选择器数量;
  5. D表示规则中标签和伪元素的数量;
  6. 比较时从高位到低位(从A到D)分别比较,高位相同才需要比较低位;
  7. 有 !important 标记的属性权重值无视没用 !important 指定的一切情况;
  8. 多次指定 !important 时,相互抵销。


------------------------------------------------------------------------------- CSS2.1中使用一个4位的数字来表示权重,以下是有关权重的一些规定:
类型选择符的权重为:0001
类选择符的权重为:0010
通用选择符的权重为:0000
子选择符的权重为:0000
属性选择符的权重为:0010
伪类选择符的权重为:0010
伪元素选择符的权重为:0010
包含选择符的权重为:包含的选择符权重值之和
内联样式的权重为:1000
继承的样式的权重为:0000

例子1:
<html> <head> <title>样式冲突</title> <style type="text/css"> <!-- p{color:red} /*权重为:0001*/ p[align]{color:blue} /*权重为:0010*/ .vip{color:green} /*权重为:0010*/ #myid{color:purple} /*权重为:0100*/ --> </style> </head> <body> p{color:red} 权重为:0001<br/> p[align]{color:blue} 权重为:0010<br/> .vip{color:green} 权重为:0010<br/> #myid{color:purple} 权重为:0100<br/>
<p>p{color:red} <p class="vip" id="myid">#myid{color:purple} <p align="left" class="vip" >.vip{color:green} 类和属性两者权重相同,但为什么会应用类样式而不是属性样式, </body> </html>
例子-2:
<!--权重可以累加-->
<html> <head> <style type="text/css"> <!-- p{color:red} body p{color:green} --> </style> </head>
<body> <p>body p{color:green}
    为什么会应用body p{color:green}样式,而不是p{color:red}样式呢? 因为body p{color:green}==body权重 + p权重 ==2 > p{color:red}==1 </body> </html>
例子-3:
<!--内联样式的权重为1000,大于内部样式和外部样式的权重,因此当样式冲突时,只会显示内联样式-->
<html> <head> <style type="text/css"> <!-- p{color:red} --> </style> </head> <body> <p style="color:green">It's green </body> </html>
<!--例子-4--> <!--!mportant--> <html> <head> <style type="text/css"> <!-- body{font-size:20pt; color:blue;} div{text-decoration:underline !important; font-size=:10pt; color:red !important;} .vip{text-decoration:overline; font-size:30pt; color:green} #other{color:black} p{color:yellow} --> </style> </head>
<body> body中的文字 <div class="vip"> class="vip",div中的文字 <p>p中的文字,p位于div中 <div id="other"> id="other",另一个div中的文字 <br/>虽然类型选择器div的权重要比类选择器.vip和.other要小,但如果在div的样式之后加上!important, 则表示在div标签文本(不包括div标签中的标签,因为它们具有可继承性),该样式具有最高权重。 </body> </html>
########################################################################
1、特殊性首先来看一下这个例子将会发生的情形:
.grape { color:Blue; } H1 { color: Red; } <h1 class="grape">Meerkat <em>Central</em></h1>
H1和.grape都匹配上面的H1元素,那么到底应该使用哪一个呢?实践证明.grape是正确答案,把句子显示为蓝色。根据规范,一般的HTML元素 选择符(H1,P 等)具有特殊性1,类选择符具有特殊性10,ID选择符具有特殊性100,值越大权重就越大,就优先选用。
H1 { color: Red; } /* 特殊性 = 1 */ P EM { color: Blue; } /* 特殊性 = 2 */ .grape { color: Fuchsia; } /* 特殊性 = 1 0 */ P.bright { color: Yellow; } /* 特殊性 = 11 */ P.bright EM.dark{ color: Gray; } /* 特殊性 = 12 */ #ID01 { color: Red; } /* 特殊性 = 100 */
2、继承
   
在特殊性的框架下,被继承的值具有特殊性0,也就是说任何显式声明的规则将会覆盖其继承样式,即便这条规则具有多高的权重。
H1#ID01 { color: Red; } /* 特殊性 = 101 */ EM{ color: Gray; } /* 特殊性 = 1 */ <H1 ID="ID01>Meerkat <EM><Central</EM></H1>
虽然ID选择符特殊性最高,但由于在特殊性的框架下,继承值只有特殊性0,因些Central会显示为Gray颜色。
3、STYLE元素
   
还有sytle元素在CSS下权值定义为100,尽管ID选择也一样,实际上style元素比ID具有更高的特殊性。
#ID01 EM{ color: Gray; } <H1 ID="ID01">Meerkat <EM style="color: red;">Central</EM>!</H1> 会显示为red颜色。
4、重要性(!important)
   
!important具最高特特性比如说1000,因此!important规则会覆盖内联STYLE属性的内容。
H1{ color: red !important; } <H1 style="color:black;">Meerkat Central!</H1> 将显示为RED颜色。
一种特殊情形
P#warn { color: Red !important; } EM { color: Black; } <p id="warn">This text is red, but <em>emphasized text is black.</em> 虽然定义!important最高特殊性,但句子并没有全部显示为RED红色,为什么呢?也许我们得回头看看前面的规则,在前面的第二点继承中提“在特殊 性的框架下,继承值只有特殊性0。”因此即便定义!important,继承里的特殊性也只有0,所以显示为特殊性为1的EM规则。
权重顺序为:继承 => HTML普通选择符 => 类选择符 =>style元素 => !important
5、层叠

    1) 若两条规则具有相同的权值、起源及特殊性,那在样式表中最后出现的规则优先。
    2) 任何位于文档中的规则都比引入的规则优先。


### CSS选择器优先级规则 CSS选择器的优先级决定了当多个样式规则应用于同一个HTML元素时,哪一个规则会被应用。理解这些规则对于编写可维护和高效的CSS至关重要。 #### 计算优先级的方法 每个选择器都有一定的权重,具体如下: - **内联样式**:`1000` - **ID选择器**:`100` - **类选择器、伪类和属性选择器**:`10` - **标签选择器和伪元素**:`1` 如果两个选择器的选择符数量相同,则更晚定义的那个会覆盖较早的一个[^2]。 #### 特殊情况处理 浏览器内置的用户代理(UA)样式表提供了默认样式的设定,在大多数情况下可以被开发者自定义的样式所覆盖。然而,某些特定场景下(比如按钮的颜色),UA样式可能拥有更高的优先权,除非明确指定了相反的指令。 #### 使用JavaScript获取优先级 通过编程手段也可以查询给定属性的实际优先级别。例如,利用DOM API中的`getPropertyPriority()`方法来返回指定CSS属性是否有!important标记[^4]: ```javascript ps.println("priority: " + styleDeclaration.getPropertyPriority(property)); ``` 此代码片段展示了如何打印出某个CSS属性是否带有高优先级标志! #### 实际案例分析 考虑一段简单的HTML结构及其对应的CSS: ```html <div id="main-content"> <p class="highlight">This paragraph has special styling.</p> </div> ``` ```css /* Example of different selectors */ #main-content p { color: blue; } /* Specificity value: 101 */ .highlight { font-weight: bold; } /* Specificity value: 10 */ p { text-decoration: underline; } /* Specificity value: 1 */ ``` 在这个例子中,尽管三个选择器都匹配到了相同的 `<p>` 元素,但由于它们各自的特异性不同,最终的效果将是字体加粗且文字颜色变为蓝色,而不会加上下划线效果.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值