Code前端首页关于Code前端联系我们

理解和使用 CSS 选择器中的新选择器第 4 级

terry 2年前 (2023-09-27) 阅读数 68 #数据结构与算法

CSS 选择器在实践中经常使用,无论是用于编写样式还是在 JS 中选择 DOM 元素。在 CSS 选择器级别 4 中,工作组继续向选择器标准添加更丰富的选择器。让我们来看看。

:is()

:is 是一个用于匹配任何元素的伪类。使用方法非常简单。您只需要传递选择器列表即可,即:is()的结果是传入选择器列表中的选定元素。

那么这个选择器有什么意义呢?例如:我需要为不同级别的h1标签设置不同的字体大小:

/* Level 0 */
h1 {
  font-size: 30px;
}

/* Level 1 */
section h1, 
article h1, 
aside h1, 
nav h1 {
  font-size: 25px;
}

/* Level 2 */
section section h1, 
section article h1, 
section aside h1, 
section nav h1 {
  font-size: 20px;
}
复制代码

会发现我们要写一个很长的列表来区分不同级别的h1。 标签,然后 :is 就派上用场了。前面提到,:is表示参数中选择选择器列表选择的元素。那么我们可以把上面的代码简化一下:

/* Level 0 */
h1 {
  font-size: 30px;
}

/* Level 1 */
:is(section, article, aside, nav) h1 {
  font-size: 25px;
}

/* Level 2 */
section :is(section, article, aside, nav) h1 {
  font-size: 20px;
}
复制代码

是不是一下子就简单多了?是的。

:is也可以直接视为语法糖,类似于选择列表,简化了书写步骤。浏览器会自动将 :is 扩展为解析简化之前的形式。

使用时需要注意的事项:是

  1. 当遇到不支持的选择器时

    当遇到不支持的选择器时,浏览器通常会显示整行进行删除。例如,如果浏览器不支持:unsupported,则:supported将不会生效。

    :supported, :unsupported {
        font-size: 12px;
    }
    复制代码

    但是,如果:is 中出现不受支持的选择器,则这是相反的行为。 :支持 仍然正确应用。

    :is(:supported, :unsupported) {
        font-size: 12px;
    }
    复制代码
  2. 选择器的权重

    整个:是选择器的权重由传递的选择器列表中权重最高的选择器决定

    :is(span, #id) {
        font-size: 12px;
    }
    复制代码

    #id选择器拥有( 1 , 0,0) 权重,而 span 只有 (0, 0, 1),所以最终等于 ,

    均使用权重值(1,0,0)。
  3. 中不能使用伪元素:is
  4. 浏览器支持

    CSS Selectors Level 4 中新增选择器了解与使用

    此处检查的数据为:matches:match es 那个is,它是的前身:is。在 CSS 选择器级别 4 中,众所周知的 :not 也支持使用选择器列表作为参数,并且在功能上 :matches 是 相对于 :not,所以为了得到一对,:matches被重命名为:is

    :where()

    :where选择器是的未加权版本:是

    选择开关。如前所述,:is的权重由其中选择器列表的最高权重决定。 :其中不关心里面的权重,权重直接为0。

    .class:where(#id) {
        font-size: 12px;
    }
    复制代码

    如上例,整个样式规则的权重为(0, 1, 0),并且只.class 贡献重量值。

    将来,选择器:where可能支持指定权重值的选项

    :scope

    :scope选择器为后面的选择器提供参考点在 CSS 中,默认表示 :scope :root。当使用JavaScript来选择元素时,比如调用querySelector,可以用它来限制选择器的选择范围。

    <div class="outer">
      <div class="select">
        <div class="inner">
        </div>
      </div>
    </div>
    复制代码
    var select = document.querySelector('.select');
    var inner = select.querySelectorAll('.outer .inner');
    inner.length; // 1, 不是 0
    复制代码

    你会注意到,最初我只想检查.outer .innerinner .select。这显然不符合预期,所以使用:scope。解决这个问题。

    var select = document.querySelector('.select');
    var inner = select.querySelectorAll(':scope .outer .inner');
    inner.length; // 0
    复制代码

    :any-link

    此选择器用于选择包含属性 href 的所有链接。在 HTML5 中,这些链接包含 aarea 和标签 link

    :local-link

    :local-link:any-link 具有相同的效果,但 :local-link 有一个额外的限制。只能选择当前页面域名对应的链接的绝对地址。也就是说,如果某个链接的 href 是站外链接,则不 :local-link 选择此项。

    :target-within

    我们都知道,你可以在URL中使用#anchor的形式,让浏览器将id定位为#anch或 名称锚点 的锚点。当锚点被击中时,我们可以使用:target来选择当前击中的元素。

    现在有一种情况,当我的一个部分容器的边框需要在其中的锚点被击中时更改其边框颜色。此时我们可以使用 : target on this container -within 选择这个section,也就是说,这个section内的元素必须用来选择:目标

    :focus-within

    :focus-within:target-within 效果相同,但仅当容器元素内的元素获得焦点时才能选择。 ,也就是说,必须使用 :focus 选择此容器内的元素。

    :focus-visible

    当某个元素获得焦点时,可以使用 :focus 来选择该元素,并且浏览器应该在该元素上显示焦点效果(例如,编辑时默认显示) box 在浏览器中具有焦点框),可以通过此选择器选择该元素。

    使用此选择器,您可以用它来调整对焦方式。

    :dir()

    该选择器用于根据语言的书写方向进行选择。比如通常的从左到右的书写形式可以用 :dir(ltr) 来选择;对于从右到左的书写,您可以使用 :dir(rtl) 进行选择。如果指定值为 auto,则选择与顺序 ltrrlt 对应的元素。

    :blank

    该选择器用于选择输入框中值为空的元素。

    :用户无效

    该选择器用于选择验证失败的输入框,例如超出maxmin范围的输入框,用标记必填

    输入框为空值。

    :未确定

    该选择器用于选择状态未确定的元素。例如,在元素radiocheckbox中,它们的值可以是选中未选中 ,如果没有明确设置,它们的状态是不确定的。

    时间线相关选择器

    时间线相关选择器用于某些与时间进展相关的功能,例如文本阅读器的时间线,或者在播放视频、字幕等时使用视频时间显示WebVTT。

    :当前()

    当前阅读器正在阅读的元素或正在显示的字幕。

    article:current(p) {
        background: yellow;
    }
    复制代码

    :past()

    已读取或显示的元素。

    :future()

    正在读取或显示的元素。

    总结

    丰富选择器的语法可以让我们在实践中更轻松地选择元素和定义样式。同时,也可以防止一些不必要的黑客攻击。

    作者:NimitzDEV
    来源:掘金

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

热门
最新文章
标签列表