你不知道的根元素选择方法,含邪修宝典 😈

当你在样式表中需要选中根元素时,你通常是怎么做的呢?相信多数大佬们都是使用 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;
    }

打开控制台,我们可以轻松查看其继承结构

image

页面表现完全一致。

1.2 :scope 伪类

[!note] MDN解释
:scope CSS 伪类表示作为选择器要匹配的作为参考点或作用域的元素。

:scope 所匹配的元素是根据其作用域上下文来决定的:

  • 当在样式表的根级别使用时,:scope 等效于 :root
  • 当在 @scope 块中使用时,:scope 匹配块所定义的作用域的根。

这里我们就使用了它的第一种:根级别。所以单独使用时,它与 :root 等同。

:scope {
  font-weight: bold;
  color: #0288d1;
}

在控制台可以查看到,其继承自 html,页面表现完全一致。


[!tip] 上述两种方法都是依赖于它们的后备行为。 嵌套选取器 & 在不用于嵌套规则内部时会表现得和 :scope 相同,而 :scope 在没有作用域根时代表文档的根。


2. 根据html特性

根据文档特性,我们可以轻松知道 html 拥有下面几个特性:

  • html 是唯一一个拥有 headbody 作为子元素的元素
  • 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. 邪修 :smiling_face_with_horns:

我们知道,有些选择器是可以利用重复书写,因此我们也可以搞点邪修,例如上述方法中的 &

&& {}
&&& {}
&&&& {}
&&&&& {}

/* 你可以写任意多个,只要你愿意 */

除此之外,我们也可以使用 :is 或者 :where 来筛选

:is(&) {
  font-weight: bold;
  color: #0288d1;
}

或者

:where(&) {
  font-weight: bold;
  color: #0288d1;
}

其表现也完全一致。当然,里面的 & 你也可以写任意多个。


好啦,以上就是本期分享的全部内容了。最近水太多了,有点不务正业了,今天就补上一点小内容啦!如果对你有用,点点赞、点点认可,距离专家又进一步 :innocent: 爱你哦!


你可以在这里找到大鹅所有CSS知识分享哦
:red_triangle_pointed_down::red_triangle_pointed_down::red_triangle_pointed_down::red_triangle_pointed_down::red_triangle_pointed_down:
:fire:【冷门知识】鹅のCSS大合集!长期追更~ 收藏 ≈ 学会

24 个赞

大鹅老师开课啦!太强了!

3 个赞

不愧是瓜瓜桑!

3 个赞

又学到了

1 个赞

等一个领域专家,直接领域展开 :innocent:

2 个赞

大鹅佬终于又开课了 :+1:

2 个赞

2 个赞

没明白,在什么场景下会需要这样使用?

如果是开发阶段,直接在css里定义就可以了

如果是操作别人开发好的网页,xpath就好了

没理解什么场景下会有这种需求 :thinking:

1 个赞

邪修大鹅!

2 个赞

还没学会!但大鹅的cos教程合集必看

2 个赞

新手问下,有什么好用的元素选择器的插件,可以在页面显示全部适配的规则,还有上一层下一层等功能的。

1 个赞

又学到了神奇的奇淫技巧 :tieba_003:,不过实际开发中不常用这些,不过第一次了解到还有 :scope 这玩意。

2 个赞

邪修大鹅!邪鹅! :tieba_025:

2 个赞

请教一下有没有办法设置shadow dom下的文字的css,比如自定义:selection
github首页:

2 个赞

root完全够用了,这篇只是一个举一反三案例的拓展

1 个赞

呃,没太明白啥意思捏

1 个赞

:face_without_mouth:阿巴阿巴

2 个赞

看完我才发现我完全不会CSS 这真是天书了

1 个赞

学习到了新知识,谢谢大鹅。


正常开发我应该不会这样用这些选择器,感觉使用方法背离了这些选择器设计的初衷,而且可读性比较差。不过作为了解选择器和标签运作原理的例子,那可真是太棒了!

2 个赞

那不就是chrome的dev tool?

2 个赞