CSS选择器-具有给定子元素的元素[重复]

Posted

技术标签:

【中文标题】CSS选择器-具有给定子元素的元素[重复]【英文标题】:CSS selector - element with a given child [duplicate] 【发布时间】:2011-05-12 08:14:36 【问题描述】:

我正在寻找一个选择器,如果它们具有特定的子元素,它将选择所有元素。例如,选择所有<div> 和一个子<span>

可能吗?

【问题讨论】:

鉴于 Jeff 的 recent comments on dupes,我不会投票关闭作为副本,但值得指出的是,discuss the much-desired parent-selectors 上还有很多其他问题。 为什么谷歌总是把我带到结果排名顶部的“重复”答案,而不是他们都提到的那个?搜索:'css select parent with specific child' 产生 SO 结果:1:4220327 2:14509590 3:11547535;给定的现有答案 1014861 不在第一页上。 【参考方案1】:

如果元素包含特定的子元素,是否可以选择它?

很遗憾还没有。

CSS2 和 CSS3 选择器规范不允许任何类型的父选择。


关于规格变更的说明

这是关于从现在开始这篇文章的准确性的免责声明。 CSS 中的父选择器已经讨论了很多年。由于尚未达成共识,因此不断发生变化。我会尽量保持这个答案是最新的,但是请注意,由于规范的变化,可能会有不准确的地方


较早的"Selectors Level 4 Working Draft" 描述了一项功能,即能够指定"subject" of a selector。 此功能已被删除,将无法用于 CSS 实现

主题将是选择器链中应用样式的元素。

示例 html
<p><span>lorem</span> ipsum dolor sit amet</p>
<p>consecteture edipsing elit</p>

此选择器将设置 span 元素的样式

p span 
    color: red;

此选择器将设置 p 元素的样式

!p span 
    color: red;


最近的"Selectors Level 4 Editor’s Draft" 包括“关系伪类::has()

:has() 将允许作者根据其内容选择元素。我的理解是选择它是为了提供与jQuery's custom :has() pseudo-selector* 的兼容性。

无论如何,继续上面的示例,选择包含spanp 元素,可以使用:

p:has(span) 
    color: red;


* 这让我想知道 jQuery 是否已经实现了选择器主题,主题是否会保留在规范中。

【讨论】:

很好的答案...也可以考虑阅读css-tricks.com/child-and-sibling-selectors CSS 是一个很棒的工具,出于这些目的应该避免使用 javascript。然而,这是一个很好的例子,为什么开发人员为了达到他们想要的目的而接受其他手段。太糟糕了... :has 很棒但得到很好的支持caniuse.com/#search=%3Ahas @PaulLedger 你的意思是很好但没有得到很好的支持?我会说在 CSS 中根本不支持。【参考方案2】:

2021 年 10 月更新 - 未来功能。尚不支持任何浏览器

:has() pseudo-selector 是在 CSS 选择器 4 规范中提出的,一旦实施就会解决这个用例。

要使用它,我们将编写如下内容:

.foo > .bar:has(> .baz)  /* style here */ 

在这样的结构中:

<div class="foo">
  <div class="bar">
    <div class="baz">Baz!</div>
  </div>
</div>

此 CSS 将针对 .bar div - 因为它两者都有一个 .foo 并且从它在 DOM 中的位置来看,&gt; .baz 解析为有效的元素目标。


原始答案(留作历史用途)-这部分不再准确

为了完整起见,我想指出,在Selectors 4 规范(目前正在提议中)中,这将成为可能。具体来说,我们将获得Subject Selectors,其使用格式如下:

!div > span  /* style here */

div 选择器之前的! 表示它是要设置样式的元素,而不是span。不幸的是,没有现代浏览器(截至本文发布时)将其作为其 CSS 支持的一部分实现。但是,如果您想进一步探索,请通过a JavaScript library called Sel 提供支持。

【讨论】:

截至 2021 年 4 月,尚不支持任何浏览器 caniuse.com/css-has【参考方案3】:

我同意一般情况下这是不可能的。

CSS3 唯一能做的(在我的例子中很有帮助)是选择没有子元素的元素:

table td:empty

   background-color: white;

或者有任何孩子(包括文字):

table td:not(:empty)

   background-color: white;

【讨论】:

只有 :not(:empty) 对我有用。仅 :empty 不工作

以上是关于CSS选择器-具有给定子元素的元素[重复]的主要内容,如果未能解决你的问题,请参考以下文章

带有输入元素的td的css选择器[重复]

带有输入元素的td的css选择器[重复]

css选择器详解

css选择器选择包含img的表格单元格[重复]

选择器

如何选择具有相同css选择器的元素