如何使用CSS Grid设计一个网格,以使“旋转木马”的网格项能够响应固定数量的网格列,而每个列会有所不同?
问题: 网格项无法在响应的断点上按预期缩放。网格项达到最高峰,不符合规范。
请查看video 我希望网格项目如何按断点缩放的https://imgur.com/070Zwve
背景
我问了一个先前的问题,关于如何使用CSS网格使网格项目水平流动:
Grid CSS container that scrolls horizontally when children use grid-column?
最后,我得到了适用于台式机但不适用于任何其他断点的代码:
CSS:
.section {
width: 100%;
display: block;
background: red;
box-sizing: border-box;
padding: 40px 24px;
@media screen and (min-width: 600px) and (max-width: 1139px) {
background: orange;
padding: 56px 48px;
}
@media screen and (min-width: 1140px) {
padding: 64px 48px;
background: green;
}
}
.container {
margin: 0 auto;
background: rgba(244,244,244, .25);
max-width: 599px;
@media screen and (min-width: 600px) and (max-width: 1139px) {
max-width: 1039px;
background: rgba(244,244,244, .25);
}
@media screen and (min-width: 1140px) {
max-width: 1032px;
background: rgba(244,244,244, .25);
}
}
.samba-grid {
display: grid;
background: inherit;
width: 100%;
overflow-x: auto;
overflow-y: hidden;
grid-auto-columns: minmax(55px, 1fr);
grid-gap: 24px;
@media screen and (min-width: 600px) and (max-width: 1139px) {
grid-auto-columns: minmax(44px, 1fr);
grid-gap: 48px;
}
@media screen and (min-width: 1140px) {
grid-auto-columns: minmax(42px, 1fr);
grid-gap: 48px;
}
}
.element {
display: grid;
background: rgba(0,0,0,.3);
grid-column: span 3;
grid-row-start: 2; // REMOVE THIS
@media screen and (min-width: 600px) and (max-width: 1139px) {
grid-column: span 3;
}
@media screen and (min-width: 1140px) {
grid-column: span 4;
}
}
.element img {
width: 100%;
}
HTML:
<section class="section">
<div class="container">
<div class="samba-grid">
<div class="element">
<img src="https://placebear.com/400/500" alt="">
<div class="copy">
Lorem, ipsum dolor sit amet consectetur adipisicing elit. Sint, eveniet commodi?
</div>
</div>
<div class="element">
<img src="https://placebear.com/400/500" alt="">
<div class="copy">
Lorem, ipsum dolor sit amet consectetur adipisicing elit. Sint, eveniet commodi?
</div>
</div>
<div class="element">
<img src="https://placebear.com/400/500" alt="">
<div class="copy">
Lorem, ipsum dolor sit amet consectetur adipisicing elit. Sint, eveniet commodi?
</div>
</div>
<div class="element">
<img src="https://placebear.com/400/500" alt="">
<div class="copy">
Lorem, ipsum dolor sit amet consectetur adipisicing elit. Sint, eveniet commodi?
</div>
</div>
<div class="element">
<img src="https://placebear.com/400/500" alt="">
<div class="copy">
Lorem, ipsum dolor sit amet consectetur adipisicing elit. Sint, eveniet commodi?
</div>
</div>
<div class="element">
<img src="https://placebear.com/400/500" alt="">
<div class="copy">
Lorem, ipsum dolor sit amet consectetur adipisicing elit. Sint, eveniet commodi?
</div>
</div>
<div class="element">
<img src="https://placebear.com/400/500" alt="">
<div class="copy">
Lorem, ipsum dolor sit amet consectetur adipisicing elit. Sint, eveniet commodi?
</div>
</div>
<div class="element">
<img src="https://placebear.com/400/500" alt="">
<div class="copy">
Lorem, ipsum dolor sit amet consectetur adipisicing elit. Sint, eveniet commodi?
</div>
</div>
</div>
</div>
</section>
^请注意,该视频显示了网格项目的行堆叠没有水平滚动。
答案 0 :(得分:1)
您可以将grid-auto-columns
定义为百分比以进行控制。公式应为(100% - (N-1)*Gap)/N
,其中N
是要显示的元素数:
这是一个带有3个断点的简化示例:
.grid {
display:grid;
grid-auto-flow: column;
grid-auto-columns:calc((100% - 2*10px)/3); /*3 items visible*/
grid-gap:10px;
margin:10px;
max-width:800px;
overflow:auto;
}
img {
max-width:100%;
}
@media all and (max-width:800px) {
.grid {
grid-auto-columns:calc((100% - 5px)/2); /*two items visible*/
grid-gap:5px;
}
}
@media all and (max-width:400px) {
.grid {
grid-auto-columns:100%; /*one item visible*/
grid-gap:5px;
}
}
<div class="grid">
<img src="https://picsum.photos/500/500?image=0">
<img src="https://picsum.photos/500/500?image=0">
<img src="https://picsum.photos/500/500?image=0">
<img src="https://picsum.photos/500/500?image=0">
<img src="https://picsum.photos/500/500?image=0">
<img src="https://picsum.photos/500/500?image=0">
<img src="https://picsum.photos/500/500?image=0">
<img src="https://picsum.photos/500/500?image=0">
<img src="https://picsum.photos/500/500?image=0">
</div>