CSS 中的父选择器

Avatar of Chris Coyier
Chris Coyier 发布

DigitalOcean 为您旅程的每个阶段提供云产品。立即开始使用 200 美元的免费额度!

让我们在此明确一点,以防有人通过搜索引擎找到此处:CSS 中没有父选择器,即使在 CSS3 中也没有。不过,这是一个有趣的讨论话题,并且最近又出现了一些新的讨论。

早在 2008 年,Shaun Inman 建议 使用以下语法

a < img { border: none; }

[更正以下句子]:在此示例中,它将选择 a 标签,但前提是它们包含 img 标签。(旁注:这将偏离典型的语法,在典型语法中,实际被选中的元素位于右侧,而这里则位于左侧)。

一定要阅读该帖子中的评论,这是一个非常有趣的讨论串,其中包含了父选择器至今不存在的一些相当重要的原因。David Hyatt 是 WebKit 中实施此类功能的前线开发人员,他评论道

使用父选择器,很容易意外地导致文档范围内的遍历。人们可以并且将会误用此选择器。支持它就是在给人们很多绳子让他们上吊。

Jonathan Snook 重新提出了这个话题,并为我们提供了有关 CSS 渲染工作原理的大量背景信息。我们都听说过通用选择器是最没有效率的 CSS 选择器。Jonathan 表示,如果存在父选择器,那么它将轻松成为新的效率最低的选择器。论点是,当元素动态地添加到页面或从页面中移除时,可能会导致需要重新渲染整个文档(主要的内存使用问题)。不过,Jonathan 仍然乐观

我描述的并非技术上不可能。事实上,恰恰相反。这仅仅意味着我们必须处理使用此类功能带来的性能影响。

Remy Sharp 也加入了这场有趣的讨论,并建议使用以下语法

a img:parent { background: none; }

关键区别在于,:parent 语法只会评估单个元素,即 DOM 中每个元素可用的 parentNode。这类似于强制 :has 选择器仅评估子元素,而不是所有后代元素。

到目前为止,每个人都达成一致

  • 存在巨大的性能问题
  • 这些问题可以被视为我们应该评估的权衡,而不是障碍。
  • 想要!