【发布时间】:2020-10-07 14:05:16
【问题描述】:
我有一排任意宽度的项目。它们在容器内居中(注意红色容器左右两侧的空白区域):
有时容器变得小于所有项目的宽度:
发生这种情况时,我希望最后的项目像这样换行到下一行:
对我来说非常重要的是每一行的内容必须左对齐,但网格作为一个整体必须居中:
最初,我尝试使用 FlexBox 来实现它。在经历了很多挫折和拉扯之后,我了解到这在 FlexBox 是不可能的:https://stackoverflow.com/a/32811002/901944
同一页面上的另一个答案建议使用 CSS 网格而不是 flexbox。
CSS 网格产生的结果略有不同,但这也适合我:
下面是使它工作的代码:
.red-container {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(210px, max-content));
justify-content: center;
}
这段代码包含很多我看不懂的关键字:grid-template-columns、repeat、auto-fit、minmax 和max-content。我尝试阅读它们但失败了。没有任何指南和 API 文档明确解释这种特定组合的工作原理。 MDN 文档太短太神秘了。
我特别纠结的是这个210px 幻数。为什么有必要? (嗯,我知道这是必要的,因为规范是如何设计的,但这并不能帮助我理解。)
我的网格中项目的大小是任意的,所以我不能使用固定值。此外,设置这个固定值会使结果略微偏离:小项目增长,大项目溢出容器。
我真正想要的是:
grid-template-columns: repeat(auto-fit, minmax(min-content, max-content));
但该规则被浏览器识别为错误。
我偶然发现了this answer,它解释了在这种情况下,规范禁止同时使用min-content 和max-content。答案建议的解决方案是……使用 Flexbox!
循环已关闭。我回到了我开始的地方,期待我现在头上的头发又少了一轮。
如何在左对齐每行内容的同时将网格居中,并且项目具有任意宽度?
为了方便起见,这里有一个样板文件:https://jsbin.com/vuguhoj/edit?html,css,output
可以通过拖动右下角来调整容器的大小。
请不要display: inline 和float: left。
.page {
border: 1px solid black;
overflow: hidden;
resize: horizontal;
max-width: 500px;
}
.grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(max-content, 50px));
justify-content: center;
}
.item {
border: 1px solid black;
margin: 1px;
}
<div class="page">
<div class="grid">
<div class="item">
Foofoofoo
</div>
<div class="item">
Bar
</div>
<div class="item">
BazBaz
</div>
<div class="item">
QuuxQuuxQuux
</div>
</div>
</div>
【问题讨论】:
-
你会接受说这是不可能的答案吗?除非您愿意使用 JS,否则很可能是这种情况