该规范对于计算CSS具体规定:(粗体雷)
注:相同的简单选择的重复出现是允许的,不增加特异性。
因此,例如.class.class {}
具有两倍的特异性比.class {}
- DEMO
然而,关于术语“ 简单的选择 ” 的规范有这样一段话:(粗体雷)
一个简单的选择是任一种类型的选择器或通用选择紧接着零个或多个属性选择器,ID选择,或伪类,以任何顺序。
如此以来,规范说同样简单选择重复出现被允许-这将意味着你可以重复类型选择为好。
那么很明显这样的事情是行不通的: h1h1 { }
所以我想这: h1[]h1[] {}
-这也不管用,
所以我不知道是否有办法做到这一点?
所以能够提高使用的类型选择一个选择的特异性,但以往没有。 这样做的原因解释如下,但对于那些谁只是寻找一种替代,有两个。 您可以链:not()
包含在一个单一的化合物选择的类型选择伪类:
h1 {} /* 1 type -> specificity = 0-0-1 */
h1:not(_) {} /* 2 types -> specificity = 0-0-2 */
h1:not(_):not(_) {} /* 3 types -> specificity = 0-0-3 */
h1:not(_):not(_):not(_) {} /* 4 types -> specificity = 0-0-4 */
或者,如果你需要支持不支持旧版浏览器:not()
您可以添加冗余类型选择,如html
和body
的复杂选择的开始,虽然你远在这种情况下,你可能会比较有限不能够占到所有元素:
h1 {} /* 1 type -> specificity = 0-0-1 */
body h1 {} /* 2 types -> specificity = 0-0-2 */
html body h1 {} /* 3 types -> specificity = 0-0-3 */
html body tr > td {} /* 4 types -> specificity = 0-0-4, assumes every td is a child of tr */
不用说,这些被认为是特异性的黑客; 与其他所有CSS黑客,谨慎地使用他们,如果在所有。
的化合物,选择器可以仅具有所有其他简单的选择一前述至多只有一个类型选择器。 从选择器3 (此称之为简单选择的序列):
简单选择的一个序列是不是由一个组合子分隔的简单选择器的链。 它总是以一个类型选择或通用选择。 没有其他类型选择或通用选择是允许的顺序排列。
而选择器4 :
的化合物,选择的是,不通过组合子分隔的简单选择的序列。 如果它包含一个类型选择或通用选择,即选择至上的顺序排列。 仅一种类型的选择器或通用选择被允许的序列中
唯一的类型和通用选择要遵守这种规则; 你可以结合其他重复简单的选择,以增加特异性。 也许规范可能提醒一下这个读者在计算特异性的部分,但我不认为这是绝对必要的。
这样做的原因规则从来没有明确说明,但它是很容易推断出:
请记住,一个类型选择器由只是一个标识符,例如h1
。 这不像其它简单的选择器,其具有自己的识别码元的语法,例如ID( # #
类( .
,伪类)( : :
或属性选择器( []
你就不能有多个连续的类型选择没有办法单独解析。
而且,即使你可以链类型选择,例如,如果你有他们之间的另一种简单的选择,因为这是唯一可能的用途是作为特异性黑客,如问题,这意味着你将只能如果使用它描述所有的类型选择是相同的; 类型选择的任何其他组合可以工作。
这是因为选择器假定文档语言定义了每个元素都有一个元素类型。 例如,在HTML中,一个h1
始终是一个h1
; 它不可能是任何其它类型的元件。 化合物选择要求,既是一个元素h1
以及一个p
永远无法匹配任何内容,对于同样的原因,类似的[type=text][type=password]
不能匹配的文档的语言任何不支持重复的属性。
然而,在考虑上述各点,仍然有可能创建包含多于一种类型的选择器,用于特异性的化合物选择器-通过使用:not()
伪类:
一个的特异性:not()
伪类等于其自变量。 伪类本身不计算在内。 这是在第一个环节中提到。 这意味着的特异性:not(h1)
是相当于h1
-一种类型的选择器。
由于一个元件只能是恰好一个类型的,这意味着:not()
与任何其它类型的选择器将是有保证的匹配。
由于化合物的选择可以包括任何数量的伪类的,可以重复否定多次必要,即使否定所有使用相同类型的选择。
而且,由于如果选择在任何特定的文档语言的情况下才有意义选择器不关心,你可以使用这是保证它满足选择器语法提供了永不一个符合HTML文档中匹配的元素,只要一个类型选择类型选择器。 一个类型选择由只是一个CSS标识,所以任何CSS标识是公平的游戏 。 包括_
。