这是 Firefox 首席工程师 David Baron 在一篇公开文章中表达的对容器查询的想法。我知道很多人一直在屏息等待大卫的想法,因为他极少数能够理解这些问题内情并谈论实施可能性的专家之一。
我们仍处于容器查询的早期阶段。每个网页设计师和开发者都想要它们,浏览器也明白这一点,但这是一个非常复杂的情况。2020年2月听到有关 可能采用 switch 语法 的积极信号令人鼓舞,这将让我们可以使用 available-inline-size
来有条件地设置单个值。
现在我们看到 第二个想法,它也在可行范围之内。
这个想法在语法上使用 @rule。来自该文档
@container <selector> (<container-media-query>)? {
// ... rules ...
}
所以,我想象它会像这样
.parent {
contain: layout inline-size;
display: grid;
grid-template-columns: 100%;
gap: 1rem;
}
@container .parent (min-width: 400px) {
grid-template-columns: 1fr 1fr;
.child::before {
content: "Hello from container query land!";
}
}
但是…
- 我不确定是否需要在里面重复选择器?或者是否将属性/值对放在里面会自动应用于 @rule 中的选择器。
- 大卫说,“规则只能匹配该容器的后代。可能我们需要支持一些属性应用于容器本身,但其他属性绝对不能。”我希望网格属性是您可以更改内容的有力竞争者,但我一无所知。否则,我认为我们会看到人们用
<div class="container-query">
包裹元素来绕过“仅后代”限制。
包含似乎是其中非常重要的部分。例如,如果元素没有被正确包含,容器查询将无法工作。我对包含了解不多,但 Rachel 有一个关于 去年晚些时候深入的介绍。
再说一次,这还处于非常早期的阶段,我只是很享受观看这个过程,我们没有人真正知道哪些会真正进入浏览器。
我一直在使用 Mark J Schmidt 的 CSS Element Queries polyfill (http://marcj.github.io/css-element-queries/) 对元素查询进行了一些尝试……语法与您的文章相同。
为了回答您提到的第二点:可以使用 :self 来定位包含元素。
我不太确定语法是否完全面向未来,并且您可以在浏览器最终支持元素查询时直接移除 polyfill,但它确实是一个非常实用的工具,可以让我们了解将来可能实现的功能。
现在关于容器查询的讨论越来越热烈,我对此也越来越关注。我个人非常喜欢它们——它们肯定会让我的模块更加模块化。我使用传统的媒体查询断点来编写嵌套的 SASS。我希望能够将特定模块的 SASS 拆分为特定模块的文件。