TL;DR 答案
第一条规则比第二条更具体,因为它同时具有选择器的类型和属性部分,因此具有优先级:
input[type="text"] { } /* type + attribute for specificity */
.top_bar_login_form_input { } /* only class for specificity, so *less* specificity */
更长的答案
根据MDN page on specificity,您会认为type="text"
属性选择器位比类选择器更具体:
以下选择器列表是通过增加特异性:
- 通用选择器
- 类型选择器
- 类选择器
- 属性选择器
- 伪类
- ID 选择器
- 内联样式
在撰写此答案时,上面的引用在 MDN 文章中。
为什么这是误导:
(感谢@BoltClock 的见解。)
以上似乎是正确的,但那是因为您通常input[type="text"]
在执行属性选择器时将元素包含在选择器中(例如 )。然而,偷偷摸摸的是:input
位很重要。
假设我们有以下标记:
<input class="my-class" type="text" value="some value" />
在以下场景中,输入呈现红色:
[type="text"] { color: green; }
.my-class { color: red; } /* last rule matched */
如果我们在场景中反转规则,输入将呈现绿色:
.my-class { color: red; }
[type="text"] { color: green; } /* last rule matched */
这是因为两个选择器具有相同的特异性。现在将input
选择器引入属性规则将使其中一个更具体,可以在这个场景中看到:
input[type="text"] { color: green; } /* most _specific_ rule matched */
.my-class { color: red; }
W3 规范让我头疼,但它确实详细说明了上述工作的原因。另请参阅@BoltClock 的答案和这些代码示例中的注释,以获取有关如何计算特异性的信息。