html - CSS 网格模板列重复不超过 X 次
问题描述
我有一个布局,其中多个项目将在网格中对齐。让我们使用以下示例:
.grid-container {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-gap: 20px;
}
.grid-item {
display: block;
width: 100%;
background-color: purple;
color: white;
text-align: center;
padding: 30px 5px;
}
<div class="grid-container">
<div class="grid-item">Item</div>
<div class="grid-item">Item</div>
<div class="grid-item">Item</div>
<div class="grid-item">Item</div>
<div class="grid-item">Item</div>
<div class="grid-item">Item</div>
<div class="grid-item">Item</div>
<div class="grid-item">Item</div>
<div class="grid-item">Item</div>
</div>
在上面的代码中,网格将每行重复 3 列,每个项目将扩展为行宽的 1/3。问题在于,在响应式情况下,网格将始终重复 3 列。
如果我将repeat
值更改为auto-fit
并调整要使用的列大小,minmax
我可以控制页面缩小的方式并将列宽和计数减少到某个合理的值。所以调整后的代码看起来像这样:
.grid-container {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px,1fr));
grid-gap: 20px;
}
.grid-item {
display: block;
width: 100%;
background-color: teal;
color: white;
text-align: center;
padding: 30px 5px;
}
<div class="grid-container">
<div class="grid-item">Item</div>
<div class="grid-item">Item</div>
<div class="grid-item">Item</div>
<div class="grid-item">Item</div>
<div class="grid-item">Item</div>
<div class="grid-item">Item</div>
<div class="grid-item">Item</div>
<div class="grid-item">Item</div>
<div class="grid-item">Item</div>
</div>
这在按比例缩小时效果很好,但这是我遇到问题的地方 - 我想在页面放大时将列数限制为 3。理想情况下,我想minmax
在这样的repeat
指令中使用:
grid-template-columns: repeat( minmax(1, 3), minmax(300px, 1fr) );
但这当然行不通。如何将重复限制为 3 列,同时仍保持我的缩小设置auto-fit
?
解决方案
我认为您不能使用auto-fit
or设置列数的最大限制auto-fill
。根据定义,它们将在容器中创建尽可能多的轨道而不会溢出:
§ 7.2.2.2。重复填充:
auto-fill
和auto-fit
重复当
auto-fill
[orauto-fit
] 被指定为重复次数时……那么重复次数是最大可能的正整数,不会导致网格溢出其网格容器。
而且您不能将函数的最大值minmax()
设置为 30%,因为这样您就会遇到与第一个示例相同的问题:
grid-template-columns: repeat(3, 1fr)
即,列轨道在所有屏幕尺寸上变得固定,并且布局没有响应。
我了解到您正在寻找不需要媒体查询的解决方案。但是如果你想使用网格布局,我认为媒体查询可能是你最好的选择。
否则,考虑弹性布局:
.grid-container {
display: flex;
flex-wrap: wrap;
}
.grid-item {
width: 30%;
min-width: 300px;
flex-grow: 1;
background-color: teal;
color: white;
text-align: center;
padding: 30px 5px;
border: 5px solid white;
}
* {
box-sizing: border-box;
}
<div class="grid-container">
<div class="grid-item">Item</div>
<div class="grid-item">Item</div>
<div class="grid-item">Item</div>
<div class="grid-item">Item</div>
<div class="grid-item">Item</div>
<div class="grid-item">Item</div>
<div class="grid-item">Item</div>
<div class="grid-item">Item</div>
<div class="grid-item">Item</div>
</div>
如果你走弹性路线,那么也请阅读这篇文章:
推荐阅读
- android - 设备不支持框架版本
- python - Django 发出信号,尽管一切都已到位
- c++ - Shadow Mapping OpenGL阴影并不总是绘制,而绘制的地方是光的位置
- flutter - 为什么当我向下滚动时我的颤动滚动监听器会多次调用
- javascript - 我正在尝试使用画布显示形状,但它们没有出现
- python - 无法在 Django 块中显示变量
- php - Symfony 通过表单处理 Api 请求
- java - JpaSystemException - 无法设置字段值 [auditEntity] 扩展扩展实体
- mongodb - 使用 addfield 计算平均值的聚合语句
- c++ - 为什么在 C++ 中我不能使用参数化构造函数声明对象的动态数组?