是否可以使用纯 CSS 选择出现在另一个 HTML 元素之后任何位置的 HTML 元素?

Is it possible to select HTML elements which appear anywhere after another HTML element using pure CSS?

提问人:soycharliente 提问时间:6/16/2022 最后编辑:soycharliente 更新时间:12/16/2022 访问量:142

问:

是否可以使用纯 CSS 选择出现在元素之后的任何/所有元素?<h1><h2>

我已经梳理了所有CSS选择器和伪类的文档页面,并且无法确定是否可以选择某些元素之后出现的某些元素,无论是在HTML标记的同一分支中还是在不同的分支中。

似乎选择器和伪类被设计为仅定位以下元素:

  • 同胞
  • 孩子
  • 后代

我需要寻找其他关系:

  • 侄女
  • 侄子
  • 堂兄弟
  • 三表兄弟两次被移除
  • 爷爷

从逻辑上讲,它们在树中的某个元素之后。我从来不知道:

  • 确切的关系
  • 我想选择的元素有多少。

Example 1 - Niece
<div>
  <h2>2</h2>
  <div>
    <h1>1</h1>
  </div>
</div>

Example 2 - Cousin
<div>
  <div>
    <h2>2</h2>
  </div>
  <div>
    <h1>1</h1>
  </div>
</div>

Example 3 - Granduncle
<div>
  <div>
    <div>
      <h2>2</h2>
    </div>
  </div>
  <h1>1</h1>
</div>

HTML CSS CSS-SELECTORS XHTML 伪类

评论

0赞 Andy 6/16/2022
永远不应该有一个之后的,这可能是你想强调的,对吧?当然,也不应该有几个。<h1><h2><h1>
0赞 Andy 6/16/2022
否则,不,据我所知,没有选择器可以允许这样做。
0赞 soycharliente 6/16/2022
@Andy,您关于选择/突出显示动机的问题是肯定的。感谢您确认我不是完全密集的,无法想出我正在寻找的语法。我可能不得不尝试以另一种方式执行此操作(Javascript 不是一种选择),但也许有人会附和一些我们忽略的新信息。
0赞 Andy 6/16/2022
我记得有人创建了一个样式表,该样式表仅基于 CSS 突出显示可访问性错误和警告。现在我可以找到Checka11y。也许你会在那里找到一些方向?
1赞 Zach Jensz 6/17/2022
在大多数浏览器中只有 Neice 是可能的。表弟和爷爷将需要 :has 伪类在 Safari 和很快的 Chrome 中可用

答:

1赞 Zach Jensz 6/17/2022 #1

是否可以使用纯 CSS 选择出现在元素之后的任何/所有元素?

纯CSS?
是浏览器支持?仅限 Safari 和较新版本的 Chrome

使用 :has() 伪类,我们可以检查后代,而无需直接定位它们:

:root {
  --good-browser-support: skyblue;
  --emerging-browser-support: coral;
}

.example :has(h2)+ :is(h1, * h1) {
  /* Ancestor to sibling */
  color: var(--emerging-browser-support);
}

.example :has(h2)+* h1 {
  /* Ancestor to descendant */
  color: var(--emerging-browser-support);
}

.example h2+h1 {
  /* Subsequent siblings */
  color: var(--good-browser-support);
}

.example h2+* h1 {
  /* Nieces */
  color: var(--good-browser-support);
}
Example 1 - Niece
<div class="example">
  <h2>2</h2>
  <div>
    <h1>1</h1>
  </div>
</div>
Example 2 - Cousin
<div class="example">
  <div>
    <h2>2</h2>
  </div>
  <div>
    <h1>1</h1>
  </div>
</div>
Example 3 - Granduncle
<div class="example">
  <div>
    <div>
      <h2>2</h2>
    </div>
  </div>
  <h1>1</h1>
</div>
Example 4 - Uncle
<div class="example">
  <div>
    <h2>2</h2>
  </div>
  <h1>1</h1>
</div>
Example 5 - Non-target: Prior Siblings
<div class="example">
  <h1>1</h1>
  <h2>2</h2>
</div>
Example 6 - Subsequent Siblings
<div class="example">
  <h2>2</h2>
  <h1>1</h1>
</div>
Example 7 - Non-target: Prior Niece
<div class="example">
  <div>
    <h1>1</h1>
  </div>
  <h2>2</h2>
</div>
Example 5 - Non-target: Prior Siblings shared parent
<div class="example">
  <div>
    <h1>1</h1>
    <h2>2</h2>
  </div>
</div>

精简版:

:is(.example :has(h2)+ :is(h1, * h1), .example :has(h2)+* h1, .example h2 + h1, .example h2 + * h1) {
  color: magenta;
}
Example 1 - Niece
<div class="example">
  <h2>2</h2>
  <div>
    <h1>1</h1>
  </div>
</div>
Example 2 - Cousin
<div class="example">
  <div>
    <h2>2</h2>
  </div>
  <div>
    <h1>1</h1>
  </div>
</div>
Example 3 - Granduncle
<div class="example">
  <div>
    <div>
      <h2>2</h2>
    </div>
  </div>
  <h1>1</h1>
</div>
Example 4 - Uncle
<div class="example">
  <div>
    <h2>2</h2>
  </div>
  <h1>1</h1>
</div>
Example 5 - Non-target: Prior Siblings
<div class="example">
  <h1>1</h1>
  <h2>2</h2>
</div>
Example 6 - Subsequent Siblings
<div class="example">
  <h2>2</h2>
  <h1>1</h1>
</div>
Example 7 - Non-target: Prior Niece
<div class="example">
  <div>
    <h1>1</h1>
  </div>
  <h2>2</h2>
</div>
Example 5 - Non-target: Prior Siblings shared parent
<div class="example">
  <div>
    <h1>1</h1>
    <h2>2</h2>
  </div>
</div>

评论

0赞 Alohci 6/19/2022
你能只针对后面的第 n 个表亲,其中 n 是任意的吗?
0赞 Zach Jensz 6/19/2022
@Alohci应该可以,但我认为这不符合 OP 的问题。如果您认为它适合这个问题,请将示例添加到我的列表中,如果需要,我会修复选择器。如果您认为这不合适,我很乐意回答您自己的问题