:has 与 :matches - 选择器级别 4

2024-01-03

只是想知道CSS(选择器4)伪选择器之间有什么区别:has and :matches

规格http://dev.w3.org/csswg/selectors-4/#overview http://dev.w3.org/csswg/selectors-4/#overview says:

E:匹配(s1,s2)
与复合选择器 s1 和/或复合选择器 s2 匹配的 E 元素
§4.2 匹配任何伪类::matches()

E:有(rs1,rs2)
一个 E 元素,如果相对选择器 rs1 或 rs2 之一,当使用 E 作为 :scope 元素进行计算时,匹配一个元素
§4.4 关系伪类::has()


简而言之:

  • E:has(rs1, rs2)匹配 E 时不同的元素F匹配任何选择器参数与 E 相关。如果你了解 jQuery:has()选择器 http://api.jquery.com/has-selector,这完全是同一件事。

  • E:matches(s1, s2) matches E when E itself matches any of the selector arguments. Think of :matches() as the direct opposite of :not(), which matches E if E itself does not match any of the arguments.1 You can also think of :matches() as a pseudo-class version of jQuery's .filter() method http://api.jquery.com/filter.

    这种表示法相当于将每个选择器参数与 E 连接起来(前提是您实际上可以连接它们),这样您就有一个选择器列表(E)(s1), (E)(s2)。例如,div:matches(.foo, .bar)相当于div.foo, div.bar.

这种根本区别通过选择器得到了最直接的体现div:matches(p) and div:has(p):

  • div:has(p)匹配任何div元素那个has a p后裔。 这非常类似于div p,除了前者的目标是div后者的目标是p.

  • Since a div永远不能be a p, div:matches(p)永远不会匹配 任何事物。 (同样地,div:not(p)将匹配所有div元素。)


这是一个更复杂的示例,其中的选择器稍微不那么荒谬:

div:has(.foo, .bar)
div:matches(.foo, .bar)

使用以下标记:

<div class="foo"></div> <!-- [1] -->
<div class="bar"></div> <!-- [1] -->

<div class="foo bar">   <!-- [2] -->
  <p></p>
</div>

<div>                   <!-- [3] -->
  <p class="foo"></p>
</div>

<div>                   <!-- [3] -->
  <div>                 <!-- [3] -->
    <p class="bar"></p>
  </div>
</div>

<div>                   <!-- [4] -->
  <div class="foo">     <!-- [5] -->
    <p class="bar"></p>
  </div>
</div>

哪些元素由哪些选择器匹配?

  1. 匹配者div:matches(.foo, .bar)
    首先div元素具有“foo”类,第二个div元素具有“bar”类,因此每个元素都满足其各自的选择器参数:matches()伪类。

  2. 匹配者div:matches(.foo, .bar)
    第三div元素有both类,因此它匹配两个选择器参数。

    关于特异性的注释:这两个参数都具有相同的特异性,使得总特异性(0, 1, 1),但是当一个元素与具有不同特异性值的多个选择器参数匹配时,规范表示特异性是匹配的最具体参数的特异性 http://dev.w3.org/csswg/selectors-4/#specificity.

  3. 匹配者div:has(.foo, .bar)
    这些中的每一个div元素has后代元素(在本例中为p)与一个与其各自的选择器参数相匹配的类:has()伪类。

  4. 匹配者div:has(.foo, .bar)
    This div元素有一个div.foo后代和一个p.bar后代,因此它满足两个相对选择器参数。

    关于特殊性的注释:因为:has()尚未在快速配置文件 http://dev.w3.org/csswg/selectors-4/#profiles因此暂时被排除在 CSS 之外,特异性的概念根本不适用。有计划在 CSS 中使用的快速配置文件中包含此功能的有限版本,但目前还没有具体的消息。任何新的进展将在适当的时候添加。

  5. 匹配者div:matches(.foo, .bar) and div:has(.foo, .bar)
    This div元素匹配两个伪类:

    • it is .foo(因为它有“foo”类),并且
    • it has“bar”阶级的后代。

    该元素也将匹配div:matches(.foo, .bar):has(.foo, .bar),这将是一个有效的 4 级选择器,因为复合选择器可以具有伪类的任意组合。

之间的另一个区别:matches() and :has()就是它:has()接受所谓的相对选择器 http://dev.w3.org/csswg/selectors-4/#relative-selector。相对选择器有一个scope;选择器范围本身就是一个完整的主题,但出于以下目的:has(),范围元素始终是您附加的元素:has()伪类到.但是,更重要的是,相对选择器可以具有隐式后代组合器,或者显式地以组合器开始,例如>, + or ~— 该组合器将相对选择器的其余部分链接到其作用域元素。

例如,虽然:has()默认为祖先-后代关系,您可以传递以以下开头的相对选择器+然后就变成了邻接兄弟关系:ul:has(+ p)匹配任何ul直接跟在后面的元素p(并且不一定是contains a p后裔)。

As for :matches(),虽然概述表说它接受复合选择器列表,但据我所知,它还没有确定是否会接受复合选择器列表或复杂选择器,以及在哪个配置文件中(快速或完整)。但复合选择器只是 Selectors 3 目前所称的新名称简单选择器序列 http://www.w3.org/TR/css3-selectors/#sequence复合选择器是一整系列的复合选择器和组合器。从这方面来说,相对选择器更像是一个复杂的选择器。看这个答案 https://stackoverflow.com/questions/9848556/correct-terms-and-words-for-sections-and-parts-of-selectors/9849403#9849403选择器中使用的各种术语的非详尽列表。


1 Yes, that's "arguments" in plural — in Selectors 4, :not() can now accept a list of selectors http://dev.w3.org/csswg/selectors-4/#negation as opposed to a single simple selector. A much-needed enhancement, but it's also to make it consistent with the other new functional pseudo-classes.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

:has 与 :matches - 选择器级别 4 的相关文章

  • jQuery 相当于 YUI StyleSheet Utility?

    jQuery 或其插件之一 是否具有与YUI 样式表实用程序 http developer yahoo com yui 3 stylesheet StyleSheet Utility 能够从头开始创建新的样式表 以及修改作为来自同一域的元素
  • HTML 文本下方的白点

    我在网站上的输出在文本下方有点 为什么会出现以及如何删除它 HTML p align center font size 4 5 color 979C91 a href customer html span class fa fa penci
  • 子 div 超出父 div 范围

    目前我正在使用 CSS 和 HTML 等设计一个网站 但是我遇到了一个问题 当我向子级添加浮动时 我的子级 div 超出了父级 div 的范围 该网站位于此处我的网页设计 http 7sisters in test mintbite 更加详
  • 带有 selectInputs 的 DT 数据表在选择后重置回左侧

    我在 Shiny 应用程序的 DT 数据表的列中使用 selectInputs 感谢一些帮助here https stackoverflow com questions 74620665 vertically center selectin
  • 使用 jQuery 禁用 CSS 继承

    有没有办法使用 jQuery 或通用 javascript 在块级别禁用 CSS 继承 例如 如果我通过 javascript 拉入外部资源 例如 Pastie org 它们将拥有自己的 CSS 而我的 CSS 会覆盖它们 我想将嵌入代码放
  • Bootstrap 页脚不在底部

    我试图强制我的页脚位于网站底部 我不希望它在滚动时粘住 只是在向下滚动网页时出现在底部 目前 网页显示时页脚位于内容下方 我添加了这样的代码bottom 0 并发现它粘住了并且不适合我的网站 我还添加了这样的代码html body heig
  • mat-table 自动调整列宽以适应更大的内容

    我有一个垫表 我想自动调整列宽 任何人都将与最长的列内容一样长
  • Javascript - HTML Canvas 上的 Gecko 边框半径自适应(CSS border-radius)

    我试图弄清楚如何将 border radius css 属性的行为重现到 HTML 画布中 所以我已经在 J avascript 中做了一些事情 以便使用特定的半径 对于每个角 来计算给定形状的正确边界 如果需要的话 这是上一个问题 Gec
  • 如何防止 Bootstrap Navbar Toggle 下推内容?

    我将 Bootstrap 与静态顶部导航栏一起使用 如下所示
  • 带有蓝图 css 的 HTML5 样板

    我正在考虑将这两种技术结合起来用于一个新项目 这是坏主意吗 有没有推荐的替代网格系统与 html5 样板一起使用 实际上 我将它们混合在一起并且它们一起工作得很好 http shikiryu com html5 我所要做的就是修改 div
  • HTML5 输入类型范围,带有最小值滑块、最大值滑块和刻度

    我必须实现 HTML5 输入类型 Range
  • 如何使用角度在垫选择嵌套值中包含过滤器

    我正在使用带有嵌套下拉菜单的有角材料 下拉值以父级和子级为基础嵌套 我面临两个问题 自动建议不起作用 如果我输入父名称或其关联的子名称 则必须以展开模式过滤并显示特定的父视图 如果我展开第一个父视图并尝试展开第二个父视图 则第一个父视图应在
  • Chrome - 儿童剪辑CSS3圆形边框?

    请参阅以下 JSFiddle http jsfiddle net zScKW http jsfiddle net zScKW 请注意 子 div 剪裁了其父 div 的边框 如果我删除边框 但保留圆角 该项目将按照我们的预期进行剪辑 Fir
  • CSS 粘性位置在移动设备上无法正常工作

    我的 OpenCart 2 3 0 2 网站上有一个带有粘性购物车按钮的按钮 这个想法是只有一个页面可以订购 只有几个三明治 不需要类别和产品页面 所以我添加了一个位于页面右上角的购物车按钮 cart position fixed top
  • 我们可以为 border-bottom 属性设置渐变颜色吗? [复制]

    这个问题在这里已经有答案了 我们可以添加渐变颜色吗border bottomhtml块元素的属性 边框应该与此类似 谁能告诉我这在 CSS3 中是可能的吗 我像这样尝试过 但无法让它工作 border gradient border bot
  • CSS水平导航间距

    我正在尝试用 css 创建一个水平导航栏 其中包含 5 个均匀间隔的链接 html 希望保持这样 div ul li a href one html One a li li a href two html Two a li li a hre
  • Twitter Bootstrap:按钮下拉列表中的图标

    Here http jsfiddle net DjHyQ 是 jsfiddle 上的链接 其中包含一些演示 它在 Chrome 甚至 IE 中运行良好 但在 FF 中图标会下降 我怎样才能解决这个问题而不用负边距或类似的东西来提升它们 我不
  • 右侧对齐不浮动

    我有一个聊天小部件 我正在向其中添加一些样式 但是 我很难使 用户 聊天气泡与屏幕右侧对齐 当我使用向右浮动和向左浮动 另一侧 时 div 不再正确定位 因为它们似乎只是转到相对 div 的右侧 我希望它也能够附加 div 这将导致溢出 y
  • 删除 twitter bootstrap 中的行

    我正在使用 twitter bootstrap 来执行一些我被迫执行的网络应用程序 我不是网络开发人员 但我找不到一种方法来禁用表的行线 正如你可以看到引导文档 http getbootstrap com components panels
  • 如何水平和垂直对齐内联块

    什么是最好 最干净的使用CSS对齐 dates div位于标题的右侧 垂直于中间 I tried float right 但这不允许vertical align 我想避免使用浮动 所以我使用inline block 并使用相对定位 有没有更

随机推荐