0

基于 CSS4 规范的初始草案,父选择器最终将在 CSS 中可用。我的问题是,为什么 W3C 没有在早期的 CSS 规范中包含这个?为什么它没有与 CSS 的其他选择器一起发布?

4

2 回答 2

4

首先:您在 Selectors 4 中所指的不仅仅是“父选择器”。这是一个主题选择器。这意味着它不仅仅涉及一个组合器,它从一个选择器指向另一个选择器并说“这是那是父”,类似于子组合器>。它需要说“这个特定元素是接收样式的元素”的语法,即选择器的主题。这就是为什么您会看到使用诸如前缀或后缀之类的东西,而不是组合符。您只是碰巧能够使用它来选择元素的父级;但它的设计并不仅仅考虑到该功能。这就是为什么称它为“父选择器”是不合适的。

主题选择器的语法很难正确。请注意,他们已经在这方面工作了 10 多年;只需在公共邮件列表档案中搜索“主题选择器”,您就会发现可以追溯到 1999 年(!)的东西,当时 CSS 2.0 刚刚成为 W3C 推荐标准。即使在当前的 Selectors 4 草案中,他们还没有决定最终的语法:2011 年的 FPWD 使用$符号,而在 2012 年的 WD 中,它现在是!.

至于一般的父选择器:从历史上看,这主要是我所看到的重绘性能的问题。浏览器在页面下载时按顺序构建 DOM,并在页面加载时立即实时应用 CSS 。使用父选择器,浏览器必须等到知道它的子选择器后才能决定是否应用它的规则。这可能会导致重新绘制问题,尤其是在页面加载缓慢时,从而进一步损害用户体验。

这对于后代选择器、子选择器或跟随兄弟选择器来说不是问题,因为它们遵循文档的自然源顺序,尤其是在像 HTML 这样的声明性标记语言中。

我想,这是阻止父选择器晋级的几个问题中最大的问题之一。事实上,在一开始,CSS1 甚至没有子选择器或兄弟选择器。它只有一个后代选择器,它本身甚至没有被称为;它被简单地称为上下文选择,这是一个非常原始的概念,当时 CSS 刚刚从表现性标记的开发地狱中衍生出来。


1 既然 Selectors 4 引入了一种将规则应用于复杂选择器中表示的任何单个元素的方法,您会想知道这些性能问题是否已得到解决或以其他方式变得无关紧要,因为选择器作为一个整体仍然必须依赖在一个完整的结构上,以便浏览器确定匹配,这意味着页面加载仍然是一个主要因素。不幸的是,这对我来说是禁区。我没有实现 CSS,所以我不能谈论实现问题。

于 2012-12-30T03:50:32.910 回答
2

CSS 被设计为以只进的方式应用,因此一旦下载了该元素的源,就知道适用于该元素的样式。

父选择器破坏了该设计,因为在从服务器下载所有子元素之前,渲染器无法知道它是否适用于元素。

于 2012-12-30T03:52:14.407 回答