CSS 特殊性(CSS Specificity)
首先看下面这个例子:
1 | <!-- HTML --> |
1 | /* CSS */ |
以上CSS属性声明那个规则更强?
答案如下:
body h1
>h1
h2.grape
>h2
li#answer
>html > body table tr[id="totals"] td ul > li
CSS 特殊性值
选择器的特殊性值表述为4个部分,如:0, 0, 0, 0
选择器的具体特殊性值如下:
- 选择器中的ID属性值: 0, 1, 0, 0; 例:
#id
- 选择器中类属性值、属性选择、伪类: 0, 1, 0, 0; 例:
.className
、*[attribute]
、:hover
- 选择器中的元素、伪元素:0, 0, 0, 1; 例:
div
、div::before
、div::after
- 结合符、通配选择器:0, 0, 0, 0; 例:
*
、>
- HTML元素中的内联样式特殊性都是:1,0,0,0; 例:
<div style="color: black; font-size: 20px">test</div>
例子如下:
1 | <!-- HTML --> |
1 | /* CSS */ |
需要注意的地方:
0, 0, 1, 0 要大于0, 0, 0, 13
特殊性是从左向右排序的,特殊性值1, 0, 0, 0大于以0开头的所有特殊性值,不论后面的数字是什么
CSS 声明和特殊性
1、确定一个选择器的特殊性,这个值将会授予其所有相关声明,如下所示:
1 | <!-- HTML --> |
1 | /* CSS */ |
2、多条规则会被用户代理“解组”为单独的规则,如下所示:
1 | <!-- HTML --> |
1 | /* CSS */ |
3、分组选择器会被用户代理“解组”为单独的规则,如下所示:
1 | <!-- HTML --> |
1 | /* CSS */ |
4、“解组”完后,单独选择器的单独规则开始根据计算出来的最高特殊性值来显示元素
通配选择器特殊性
1、通配选择器*
的特殊性值为:0, 0, 0, 0,但需要注意的是通配选择器不等于没有特殊性(设置了要比没有设置强)
例子如下:
1 | <!-- HTML --> |
1 | /* CSS */ |
2、如果一个选择器中包含通配选择器和其他选择器,选择器的特殊性不会因为通配选择器的出现发生改变,如下所示:
1 | <!-- HTML --> |
1 | /* CSS */ |
ID和属性选择器的特殊性
ID选择器和指定ID属性的属性选择器在特殊性上有所不同,如下所示:
1 | <!-- HTML --> |
1 | /* CSS */ |
内联样式特殊性
通常,特殊性的第一个0是为内联样式声明保留,它要比所有其他声明的特殊性都要高
内联样式声明的特殊性为:1, 0, 0, 0
例子如下:
1 | <!-- HTML --> |
1 | /* CSS */ |
CSS 重要性(CSS !Important)
- 重要性标识:在样式的声明分号前插入:
!important;
- 标志为
!important;
的声明规则,没有特殊性的特殊性值,优先级是最高的
例子如下:
1 | <!-- HTML --> |
1 | /* CSS */ |
CSS 继承(CSS Inheritance)
继承的值没有特殊性,甚至连0都没有;也就是说,0特殊性要比无特殊性更强(特殊性为0高于继承)
1、0特殊性比无特殊性要强,例子如下:
1 | <!-- HTML --> |
1 | /* CSS */ |
2、不加区别地使用通配选择器(*
)可能存在一些问题,需谨慎使用通配选择器(*
)
通配选择器(
*
)能匹配任何元素,又是0特殊性,优先于继承值,所以有一种短路继承的效果
为了避免这个问题,避免不加区别地使用通配选择器(*
),从根本上解决这个问题
3、子元素是<a>
标签,<a>
标签会使用浏览器用户代理样式表中的伪类样式(a:link
),需要单独为<a>
定义样式规则
例子如下:
1 | <!-- HTML --> |
1 | /* CSS */ |
CSS可继承属性与不可继承属性
思考一个问题:CSS中所有的属性都可以继承吗?
答案显然是否定的,在CSS中有些属性可以继承,有些不行。
那么,那些CSS属性可以继承,那些CSS属性不能继承?
简单列举一部分例子如下:
CSS 可继承属性
1 | /* CSS 字体系列属性 */ |
所有元素可以继承的属性
元素可见性:
visibility
光标属性:cursor
内联元素可以继承的属性
字体系列属性
除text-indent
、text-align
之外的文本系列属性
块级元素可以继承的属性
text-indent
、text-align
CSS 不可继承属性
1 | displey |
CSS 层叠(CSS Cascading)
层叠规则
以下样式中,那条样式的声明会起作用?
1 | <!-- HTML --> |
1 | /* CSS */ |
!important;
重要性标识优先- 按来源对应用到给定元素的所有声明排序有3种来源:创作人员 > 读者 > 用户代理(
user agent
)- 按特殊性对应用到给定元素的所有声明排序,高特殊性 > 低特殊性
- 按出现顺序对应用到给定元素的所有声明排序,在样式表或文档中越后出现,权重越大
如果两个规则的权重、来源、特殊性完全相同,则样式表中后出现的一个规则会被使用
按权重和来源排序
1、!important;
重要性标识优先
例子如下:
1 | <!-- HTML --> |
1 | /* CSS */ |