现在,我们有能力编写仅在浏览器窗口本身处于特定宽度或高度时才适用的 CSS。 可以说是断点。超级有用。我们没有(原生)根据任何特定元素(或“容器”)的属性编写条件 CSS 的能力。
自从 RICG 决定 处理这个问题 已经快两年了。我不确定现在的情况。似乎有点暂停,但这并不意味着整个讨论都暂停了。
据我所知,前端开发人员的呼声是:**如果我拥有容器查询,我写的 90% 的媒体查询将是容器查询。** 想法是,你通常试图调整一些特定元素的属性,这些属性与整个浏览器窗口范围之外的某些内容相关。
Ethan Marcotte 最近写道
我并不想暗示 指定容器查询的技术挑战 非常容易。但任何形式的推动都将受到整个响应式设计社区的热烈欢迎。就我个人而言,我知道容器查询将彻底改变我的设计实践,并更好地为移动设备、桌面设备、平板电脑以及即将到来的任何设备做好响应式设计的准备。
说的好。
他指出了他的一些作品,这些作品中的模块处于完全不同的情况下,这些情况与视窗无关,而是与父容器更直接相关。
但最近,在一个**奇怪的意外转折**中,出现了不少“嗯,也许我们并不像我们想象的那么需要这些”的言论。
例如,Dave Rupert 在玩 CSS 网格布局时发现他能够 完全放弃一些媒体查询
我 重构了一个大约 50 行的 Flexbox 网格,只需大约 5 行 CSS 代码就能用 CSS 网格实现。……最棒的是,我们不需要媒体查询!这将在将来节省大量代码。在这个特定的项目中,我们实际上有三个 Flexbox 网格,它们的断点略有不同。
auto-fill
关键字在有空间时自动生成列。
查看 CodePen 上 Dave Rupert (@davatron5000) 的 Flexbox 网格与 CSS 网格。
Flexbox 可以通过其包裹能力、能够被告知是否可以增长以及增长多少以及增长到什么程度的能力来进行一些非常花哨的舞蹈,这让我们在没有显式媒体查询的情况下能够获得很大的控制权。
网格为我们提供了更多工具,例如自动布局、minmax()
以及 min-content
和 auto-fill
等关键字。您可以以任何方式嵌套 Flex 容器和网格容器,这带来了一些强大的可能性。
例如,看看 Jonathan Snook 玩耍(他自认只是开始理解这些类型的布局)在容器查询控制的一些模块方面取得了很大的成功。
Paul Robert Lloyd 明确质疑了对容器查询的需求
在我看来,容器查询似乎是昨天对今天问题的答案。我更希望我们使用现有的强大工具,并拥抱终于到来的未来。
即使是使用仅影响页面布局的媒体查询重建 Ethan 的示例
查看 CodePen 上 Paul Lloyd (@paulrobertlloyd) 的 重建 The Toast 的再循环模块。
Jeremy Keith 补充道,就像小熊一样
……这是一篇关于容器查询可能不是我们响应式设计问题的万能解决方案的经过深思熟虑的好文章。问题是,我认为容器查询并不是要成为一个包罗万象的解决方案,而是一个针对特定问题类别非常有用的解决方案。
所以,我认为容器查询并没有与网格布局竞争(就像网格布局没有与 flexbox 竞争一样),而是一个我们能够拥有并且非常有用的工具。
当然,即使是容器查询也无法解决所有 RWD 问题。正如 Paul 所说
我质疑容器查询需求的最后一个原因是,布局的变化有时也需要行为的变化。如果实现这一点涉及到重新构建 DOM,我们实际上是在用一个组件替换另一个组件。
所以,是的,新奇的布局工具可能会在许多情况下帮助我们避免专门针对布局变化使用容器查询。但布局并不是唯一可能因容器情况而发生变化的东西。Ethan 回应道
根据模块的位置、高度和宽度,我可能希望更改其设计的几个不同方面。这些更改将包括但不限于
- **视觉权重。** 根据模块的位置,我经常希望更改其视觉突出的程度。这可能包括更改其颜色、背景颜色或其内部单个元素的大小,所有这些都取决于分配给模块的空间。
- **排版。** 与最后一点相关,我经常需要更改元素的排版,根据其容器的大小。不幸的是,网格布局和 flexbox 在这里无能为力;虽然我非常喜欢 灵活的排版——Trent 可以为我作证——我们可用的工具仍然非常以视窗为中心。
- **内容层次结构。** 我经常需要更改元素的优先级,具体取决于其容器的大小。也许我会根据设计的需要有条件地将元素定位得更高(或更低)以使其更(或更不)可见。在更像 flexbox 的布局中,我可能希望更改给定元素的
order
,或者可能更改模块的flex-direction
——同样,所有这些都取决于容器的尺寸。
Brad Frost 做出了 一个简单而合理的论点
……拥有一个机制,它可以这样说:“如果此组件位于一个至少为 X 宽度容器中,请执行以下样式更改”,感觉上是合理的。
这有点像响应式图像。您可以使用 srcset
和 sizes
做很多事情,但是当您需要非常明确地指定如何行为时,也可以使用 <picture>
。
就我个人而言,我希望能看到大约 100 个不同的 用例 被详细阐述。如果事实证明其中一些用例可以在没有容器查询的情况下完成,那就太好了,但对我来说,拥有容器查询似乎仍然非常方便。
值得一提的是,我偶然发现了这个 JavaScript 插件,它允许在 CSS 中编写元素查询。我自己从未尝试过,但我赞赏这种提供解决方案的尝试
http://elementqueries.com/
嘿,你抢先了。:)
我一直使用这个,它从 2013 年就存在了
http://marcj.github.io/css-element-queries/
我一直认为我会使用容器查询,当更高层组件的大小变得太小的时候,就显示或隐藏某些 UI 组件。例如,如果我有一个按钮工具栏,我可以将其替换为一个节省空间的下拉菜单,因为没有足够的空间容纳它们。在确定何时进行切换方面,仍然需要相当多的魔术,(而且公认地,像 resizeObserver 可能更适合这种情况),但就目前而言,据我所知,完全无法用 CSS 编写这样的可复用工具栏。
也就是说,EQCSS 可能是测试水域并弄清楚容器查询规范的最低限度组件的绝佳方法。我还没有机会亲自尝试它,但如果有人想知道他们是否需要容器查询来解决问题,那就值得一试。
也值得探索/支持/关注:ELQ 和 @ausi 的 cq-prolyfill 项目。他们都对元素/容器查询采用了不同的方法。
关于 resizeObserver 的讨论从这里开始
我觉得容器查询随着 Web 组件和 Angular 和 React 等框架支持范围 CSS 而变得更加必要。它可以让你创建真正灵活的组件,这些组件可以更容易地重复使用和共享。
我一直将媒体查询作为最后的手段,尤其是在布局方面。根据我的经验,一个写得好的界面,如果它不是非常特立独行,默认情况下应该有 80%-90% 是移动设备优化的,因为它的元素天生就能对周围环境做出响应。这并不是说媒体查询本身不好——对于一小部分东西来说,确实没有其他解决方案——但人们很容易过度使用它们,到了那个时候,它们就会变得不好。我认为拥有容器查询既可以提供以前不可能做到的功能,又可以放大这个问题。所以,嗯,我认为我支持添加它们,但我认为我们也需要更好地了解它们的用法。
我昨天看到的一篇文章很好地总结了我的感受
我整理了一个 Pen,演示了 Mat Marquis 在他的 ALA 文章 中的容器/元素查询示例。我还添加了一些使用 Grid 和 Element Queries(使用 element-query.js EQCSS)的组合的功能查询。
我认为 Element Queries 将成为一个非常有用的工具,可以与 Flexbox、Grid 和我们将在不久的将来看到其他布局方法一起使用。我感谢 Paul 的文章,但我认为我们不仅需要 Grid 或 Flexbox 来创建不依赖视窗而是依赖内容的布局。
我赞同几乎所有人的想法,我真的很希望有元素/容器查询。我认为这对 Web 组件来说是绝对必要的。
想象一下,像 Spotify/Google Play 这样的服务提供的音频播放器组件。
你可以将这个音频播放器嵌入到页面中,而不需要选择一个特殊的播放器来适应你拥有的空间,而是服务本身可以根据大小控制它的外观。
例如,如果你只有 50px x 50px 的空间,它可以只显示一个播放按钮。如果你有 300px x 100px 的空间,你可以显示一个播放按钮、品牌名称(Google Play... Spotify 等)以及歌曲名称和时间。
如果你有 800px x 600px 的空间,它可以显示播放列表、时间和品牌。
我认为你明白了,你可能在想——好吧,你可以通过使用 iframe 来实现同样的效果,没错,但你基本上只是在欺骗元素查询。使用元素查询,你可以使用 JavaScript 将嵌入直接渲染到页面中。
从设计角度来看,我们的团队正是以 Ethan 上面概述的方式思考的——我们还没有找到一个很好的解决方案。为什么 EQCSS/css-element-queries 没有更普遍地使用——使用它是否存在权衡?