容器查询一直是 CSS 改进要求清单的首位。普遍观点是,如果我们有了容器查询,就不会再写那么多基于页面大小的全局媒体查询。这是因为我们实际上想要控制一个更局部的容器,而现在我们之所以使用媒体查询来实现这一点,只是因为它是 CSS 中最好的工具。我绝对相信这一点。
偶尔会有人说:“你们开发者以为需要容器查询,其实并不需要。” 我不喜欢这种说法。我认为,如果容器查询可用,我们会用它做很多好事,至少可以写出更干净、可移植、易于理解的代码。如今,大家似乎都认为用组件构建 UI 是最佳实践,这使得容器查询的必要性更加明显。
今天,我们有一些现代 JavaScript 概念可以帮助我们使用容器查询,但这并不意味着这项技术就应该停留在 JavaScript 中。它更适合放在 CSS 中。
这是我在 2019 年底关于这个主题的一些想法。
- Philip Walton 的 “响应式组件:解决容器查询问题的方案” 文章很好地介绍了如何使用 JavaScript 的
ResizeObserver
来解决今天的问题。它的性能很好,而且可以在任何地方工作。 演示网站 是目前最好的演示,因为它突出了响应式组件的必要性(尽管还有其他 已记录的使用案例)。Philip 也说过,纯 CSS 解决方案会更理想。 - CSS 嵌套大约一年前获得了 一阵热潮。讨论似乎表明嵌套是可行的。我支持这一点,因为我一直 喜欢合理的 Sass 嵌套。这让我不禁想,容器查询的语法是否可以利用类似的东西。也许嵌套查询是限定在父选择器范围内的?或者,你可以像当前规范中使用后代选择器那样,在媒体语句前加上一个与号?
- 其他建议的语法通常涉及某种冒号的使用,例如
.container:media(max-width: 400px) { }
。我也喜欢这个。单冒号选择器(伪选择器)在哲学上来说是“在这些条件下选择元素”——比如:hover
、:nth-child
等等——所以媒体范围是有道理的。 - 我认为语法不是这个特性的最大障碍,而是实现方式的性能。我上次了解到的情况是,问题甚至不在于性能,而在于它会影响浏览器的整个渲染流程。这似乎是一个巨大的障碍。但我还是不想放弃它。网络上正在发生很多创新,即使今天还不知道如何实现它,并不意味着明天就没有人能找到一条切实可行的路径。
我认为,我们会看到人们使用 CSS 和基于 JavaScript 的观察者,比如 Resize Observer,以及 Mutation Observer 和 Intersection Observer,以一种协同的方式,让你自然地定义元素的自定义属性作为断点,并使用观察页面的 JavaScript 代码,使元素能够在其不同的断点状态下被定位。
我在写这篇文章的时候就想到了一个具体的演示,它正等着时机成熟,展现在世人面前,但我认为,如果我们想以这种方式将 CSS 和 JavaScript 结合起来,那么所有的要素都已经具备了。“元素查询”和“容器查询”可能不是 CSS 特性,而可能是 CSS 技术,或者说是将 CSS 和 JavaScript 结合起来的一种特定方式,自然而然地结合起来。密切关注如何像朋友一样将基于 JS 的观察者和 CSS 结合起来使用!
如果一个特定模式在现实世界中重复出现足够多次,最终就会被原生添加。Web 组件、CSS 变量、JavaScript“类”、querySelector,甚至圆角都被原生化了,因为“强行塞进”它们很常见,通常是通过其他一些技术来实现。
容器查询有点奇怪,因为最终的解决方案获得了高度共识,很少有项目愿意实现 polyfil。这种缺乏采用,对于一个偶然的观察者来说,被误解为缺乏兴趣。
我们需要首先拥抱一个 JS 解决方案。当它变得足够普遍,被认为是一个伪标准时,我们就会得到我们的 CSS 解决方案。
说得很好。我觉得需要有一个非官方但紧密联系的开发者社区,他们致力于为非官方特性开发各种库和 polyfil,这些特性运行良好,可以投入生产,但目标是最终,如果使用的人足够多,浏览器供应商就会注意到并实现一个原生版本。没有理由坐等他们。这个 polyfil 社区也可以对包含的内容制定非常宽松的规则:这些特性会经历的考验是它们是否会变得流行,因此它更加民主,也更少官僚主义。
我每周都会谈论这件事,要么是和队友一起谈论,当我们对使用过时的网格系统感到沮丧时,要么是和设计师一起谈论,当他们对我们无法很好地实现他们的精美网格系统感到沮丧时。
这绝对是我最想要的 CSS 特性,超过了 subgrid 或者他们正在开发的任何其他东西。元素可以根据它们所放置的空间大小进行视觉上的调整?快来报名吧。
我希望有一种方法可以告诉那些有权势的人我们最想要什么。如果我们能将 CSS 的“几乎完美”部分进行分类并优先排序,也许就能让更多人关注它们?感觉这些东西不是由真正使用它们的人设计的。我们中的一些人写了大量的 CSS——如果我们能有一个切入点来进行压力测试,也许就能发现一些有用的边缘情况。
听起来你不知道 CSS 工作组。看看 Rachel Andrew 的文章,然后参与进来吧 :)
https://rachelandrew.co.uk/archives/2019/05/07/getting-involved-with-the-web-platform/
工作组的 Github 可以在此处找到
https://github.com/w3c/csswg-drafts/issues