当你在样式表中需要选中根元素时,你通常是怎么做的呢?相信多数大佬们都是使用 html 元素选择器,或者是 :root 伪类选择器。
尽管这些都完全足够,也是大鹅最常使用的方法。但是,除此之外,你还知道哪些捏?今天大鹅就来搞点花哨的。
为方便演示,就以 0x2:相对单位【CSS in Depth】 文中使用过的简单案例。其基本结构如下
:root {
font-weight: bold;
color: #0288d1;
}
body{
padding: 20px 20%;
line-height: 1.5;
}
p{
font-size: 2em;
}
<p>
当一个元素的值定义为长度(px、em、rem,等等)时,子元素会继承它的计算值。当使用em等单位定义行高时,它们的值是计算值,传递到了任何继承子元素上。如果子元素有不同的字号,并且继承了line-height属性,就会造成意想不到的结果,比如文字重叠。
</p>
效果如下
下面我就提供几个其它花哨的选择器代替品
1. 根据后备行为依赖
在许多的替代选择器中,一种简单的就是依赖后备行为来选中根元素。
1.1 & 选择器
众所周知:& 在选择器中代表的是父元素,但是在非嵌套的规则内时,它就是选中的 html
我们稍加修改
& {
font-weight: bold;
color: #0288d1;
}
打开控制台,我们可以轻松查看其继承结构

页面表现完全一致。
1.2 :scope 伪类
[!note] MDN解释
:scopeCSS 伪类表示作为选择器要匹配的作为参考点或作用域的元素。
:scope 所匹配的元素是根据其作用域上下文来决定的:
- 当在样式表的根级别使用时,:scope 等效于 :root
- 当在 @scope 块中使用时,:scope 匹配块所定义的作用域的根。
这里我们就使用了它的第一种:根级别。所以单独使用时,它与 :root 等同。
:scope {
font-weight: bold;
color: #0288d1;
}
在控制台可以查看到,其继承自 html,页面表现完全一致。
[!tip] 上述两种方法都是依赖于它们的后备行为。 嵌套选取器
&在不用于嵌套规则内部时会表现得和:scope相同,而:scope在没有作用域根时代表文档的根。
2. 根据html特性
根据文档特性,我们可以轻松知道 html 拥有下面几个特性:
html是唯一一个拥有head和body作为子元素的元素html是唯一一个没有父元素的元素
根据以上特性,我们也可以衍生出一些其它替代品。
2.1 :has 妙用
根据特性一,我们可以使用 :has 来配合,选出其子元素来筛选即可
:has(head) {
font-weight: bold;
color: #0288d1;
}
或者
:has(body) {
font-weight: bold;
color: #0288d1;
}
与之前的方法一样,我们可以在控制台查看到,其继承自 html,页面表现亦完全一致。
2.2 :not 大法
根据特性二,我们也可以使用 :not 选择器来进行排除,从而筛选使其匹配根元素
:not(* *) {
font-weight: bold;
color: #0288d1;
}
有些大佬初次看到 * *可能有点懵逼,这里大鹅简单做个说明:
其实它与我们之前使用的类似 ul li等是一个意思,无非使用了通配符选择器而已,* * 就表示了任意元素内的任意后代元素 ,即 所有有祖先的元素,那么在文档中,html 可以视为所有元素的祖先元素。当我们使用 :not 排除之后,就只剩下 html 本身了。
当然,你觉得这样不好看,加个子元素选择器也不是不可以
:not(* > *) {
font-weight: bold;
color: #0288d1;
}
两种表现方式一致,均继承自 html
3. 邪修 
我们知道,有些选择器是可以利用重复书写,因此我们也可以搞点邪修,例如上述方法中的 &
&& {}
&&& {}
&&&& {}
&&&&& {}
/* 你可以写任意多个,只要你愿意 */
除此之外,我们也可以使用 :is 或者 :where 来筛选
:is(&) {
font-weight: bold;
color: #0288d1;
}
或者
:where(&) {
font-weight: bold;
color: #0288d1;
}
其表现也完全一致。当然,里面的 & 你也可以写任意多个。
好啦,以上就是本期分享的全部内容了。最近水太多了,有点不务正业了,今天就补上一点小内容啦!如果对你有用,点点赞、点点认可,距离专家又进一步
爱你哦!
你可以在这里找到大鹅所有CSS知识分享哦
![]()
![]()
![]()
![]()
![]()
【冷门知识】鹅のCSS大合集!长期追更~ 收藏 ≈ 学会










