Вам просто нужно избавиться от grid-template-columns: repeat(12, 1fr);
1 .Нет необходимости определять шаблон столбца, так как ваш номер элемента неизвестен, пусть браузер обрабатывает это автоматически, определяя неявную сетку.
Вам может потребоваться определить grid-auto-columns
, чтобы установить ширину каждого столбца.
section {
width: 100%;
display: block;
box-sizing: border-box;
padding: 64px 48px;
background: green;
}
.container {
margin: 0 auto;
max-width: 1032px;
background: rgba(244, 244, 244, .25);
}
.grid {
display: grid;
grid-auto-flow: column;
overflow: auto;
grid-gap: 48px;
grid-auto-columns: minmax(40px, 1fr);
}
.element {
padding: 30px 0;
text-align: center;
background: papayawhip;
grid-column: span 4;
}
img {
max-width: 100%;
}
<section>
<div class="container">
<div class="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>
</div>
</section>
<section>
<div class="container">
<div class="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>
</section>
Снимите grid-auto-columns: minmax(40px,1fr);
сверху, и вы увидите это для верхней сетки:
Красные линии - это ваши столбцы с шириной 0, и, как вы можете видеть, каждый элемент просто равен 3 пробелам.Установив minmax()
, мы будем использовать 1fr
, когда нет переполнения и только несколько элементов (достаточно места для 1fr
).Когда будет много элементов, а 1fr
станет меньше, вы зафиксируете ширину на 40px
.
В основном каждый элемент будет иметь min-width
, равный 4*40px + 3*48px
в этом случае.и если вы удалите 1fr
и используете grid-auto-columns: 40px;
, то min-width
будет просто width
.
1 Проблема при определении столбцов шаблоначто вы сказали браузеру, что у вас есть 12
столбцы с 1fr
, и позже вы будете использовать больше, если у вас более 3 элементов, таким образом, неявная сетка будет содержать более 12
столбцов, и браузер может рассчитать их ширинуотличается от того, что вы установили.
Вот упрощенный пример для иллюстрации:
.grid {
display:grid;
grid-template-columns:repeat(4,1fr);
grid-auto-flow: column;
}
img {
grid-column:span 2;
border:2px solid green;
max-width:100%;
}
<div class="grid">
<img src="https://picsum.photos/200/200?image=0">
<img src="https://picsum.photos/200/200?image=0">
<img src="https://picsum.photos/200/200?image=0">
<img src="https://picsum.photos/200/200?image=0">
</div>
Обратите внимание на то, как ширина первых двух изображений отличается от последних 2. Первые находятся внутри определенной вами сетки, а другие - внутри созданной.браузерами.
Устанавливая только grid-auto-columns
, вы уверены, что все будут иметь одинаковую ширину:
.grid {
display:grid;
grid-auto-flow: column;
grid-auto-columns:minmax(40px,1fr);
}
img {
grid-column:span 2;
border:2px solid green;
max-width:100%;
}
<div class="grid">
<img src="https://picsum.photos/200/200?image=0">
<img src="https://picsum.photos/200/200?image=0">
<img src="https://picsum.photos/200/200?image=0">
<img src="https://picsum.photos/200/200?image=0">
</div>