此bounty已结束,回答此问题可获得+500声望奖励,奖励宽限期14小时后结束,Jawad希望引起更多关注此问题。
为什么下面例子中的input[type=number]
选择器覆盖了.num
类选择器?两者的特异性不都应该是1吗?
我的期望是,无论后来宣布的是哪一个,都会压倒前者。
input {
width: 100px;
}
input[type=number] {
border: 2px solid green;
}
.num {
border: 2px solid red;
}
个字符
7条答案
按热度按时间bksxznpy1#
属性选择器与CSS类选择器共享相同级别的特异性。在您的示例中,您有
input[type=number]
和.num
。input[type=number]
具有0 0 1 1
的特性,它有两个选择器,一个 * 元素 *input
和 * 属性 *[type=number]
。.num
,具有0 0 1 0
的特异性,并且只有一个选择器,一个 class。由于
input[type=number]
比.num
具有更高的特异性,因此无论放置位置如何,它的风格都会胜出。如果将input[type=number]
更改为[type=number]
,则放置位置将发挥作用,因为它们都具有0 0 1 0
的特异性,后者将胜出。个字符
*注:为了演示的目的,我只使用了两次相同的CSS选择器。 请注意哪一个
border-style
胜出。虽然在dotted
之后尝试应用dashed
和solid
,但由于特异性,这两个都没有应用。级联规则(规则一个接一个)在特异性值相同时应用。6qqygrtg2#
为什么属性选择器比类有更高的特异性?
属性和类选择器都有0,0,1,0的特异性。
为什么下面例子中的
input[type=number]
选择器覆盖了.num
类选择器?两者的特异性不都应该是1吗?一个类型选择器(
input
)+一个属性选择器([type=number]
)的特异性为0,0,1,1。bihw5rsg3#
为了理解特异性,让我们首先了解3列特异性顺序
1.内联样式(* 优先于低于三列的样式,但一般来说,它不属于3列特性 *)
#example
*)1.类选择器(*class,attributes & pseudo-classes. ex.
.myClass
,[type="radio"]
,:hover
)1.类型选择器( 元素和伪元素.例如
p
,h1
,::before
*)!important
异常:如果样式具有!important
标志,则无论具体性如何,重要声明都适用在您的示例中,属性选择器
input[type='number']
比类选择器.num
具有更高的特异性。让我们分解每个选择器的特异性:属性为
input[type='number']
的元素:字符串
类别
.num
:型
虽然两个选择器在第二列(表示类、属性或伪类)中的特异性都是
1
,但属性选择器还具有类型选择器特异性1
,使其特异性更高。因此,input[type='number']
定义的样式将优先于类选择器.num
定义的样式。这里有一篇很好的文章来更好地理解特异性:link
jei2mxaa4#
默认案例
在“浮游生物、鱼类和鲨鱼的CSS特异性”示例中,number-number-number-number-number分类表示特异性值,表示CSS选择器的强度。这些数字的解释如下:
-第三个数字(位数):浮游生物等级-0-0-1 = 1(最小影响)
-第二个数字(十位数):鱼等级-0-1-0 = 10(比前一个更强)
-第一个数字(百):鲨鱼等级-1-0-0 = 100(比前一个更强)
特殊情况
在下一个示例中,内联
style
和!important
是两种特殊情况,分别以“ship”和“atomic bomb”为隐喻进行说明:-船(千):1-0-0-0 = 1.000(比前一个更强)
-原子弹(万枚):1-0- 0 - 0-0 = 10.000(比前一次更强)
!important
的特异性级别是用“原子弹”的比喻来描绘的,它是在属性之后添加到样式规则中的一个特殊标志,这个标志意味着这个规则覆盖了所有的东西,绕过了通常的特异性规则。!important
是最高的特异性标志,覆盖了所有其他的样式,包括直接应用于元素的样式。因此,“原子弹”是操纵特异性值的最有力的工具。“x1c 0d1x的数据
如图所示,如果我们将这些元素连接起来,我们需要对每个级别的点进行求和。如果一个元素以多种方式进行样式化,则最高级别的样式化将优先。
总结
在这个问题的具体例子中,
input[type=number]
被证明比.num
更强,因为它表示两个水平的识别:input
和[type=number]
。它们单独是有效的选择子,但结合在一起,它们具有更高的特异性。如果我们在
[type=number]
和.num
之间举一个更简单的例子,就可以理解,由于它们具有相同的特殊性,最后一个声明将占上风。个字符
如果再次将这两种方法应用于输入,它们将具有相等的强度,因此,最后一种方法将再次生效。
的字符串
但是在这个问题中,只有
[type=number]
收到了更强的定义,因此,单独使用.num
可能不足以进行重写。的字符串
ulydmbyx5#
简而言之,这是因为你的CSS更具体的输入类型。
input
或.num
或[type="input"]
的样式本身具有相同的权重,因为它们只是在寻找一个选择器-一个标识属性。input[type=number]
用于 * 两个 * 选择器的组合,因此它最终更具体。polkgigr6#
类型选择器(input、div等)的特异性低于属性选择器(input[type=number])。类选择器(.num)的特异性低于属性选择器(input[type=number])。
在您的案例中:input[type=number]选择器比.num类选择器具有更高的特异性,因为属性选择器([type=number])比类选择器具有更大的权重。尽管两个选择器在选择器数量方面的特异性都为1,类型属性选择器(input[type=number])优先于类选择器(.num),因为属性选择器比类选择器具有更高的特异性。因此,即使.num类选择器稍后在CSS中声明,input[type=number]选择器将优先,因为它基于属性选择具有更高的特异性。
如果你想让.num类选择器覆盖**input[type=number]**样式,你需要增加它的特异性,或者通过添加更多的类选择器,或者使用一个更具体的选择器,目标是.num类的输入元素:
字符串
通过组合input和.num类选择器,可以增加规则的特殊性,允许它覆盖**input[type=number]**选择器。
nkhmeac67#
属性选择器与CSS类选择器共享相同级别的特异性
这取决于属性和类是否由元素限定。
考虑
属性
[data-foo="underline"]
特异性:[0,1,0]类
.underline
特异性:[0,1,0]属性(用元素限定)
u[data-foo="underline"]
特异性:[0,2,0]类(用元素限定)
u.underline
特异性:[0,2,0]因此,基本上,属性(不使用元素选择器限定)将与类(不使用元素选择器限定)具有相同的特异性。
属性(用元素选择器限定)将具有与类(用元素选择器限定)相同的特异性
但是,如果属性“属性”或类“属性”由元素“属性”限定,则它们将不具有相同的特异性