Как центрировать элементы в последней строке в CSS Grid?
Я использую CSS-сетку для компоновки некоторых элементов, таких как...
#container {
display: grid;
grid-template-columns: 16.666% 16.666% 16.666% 16.666% 16.666% 16.666%;
}
.item {
background: teal;
color: white;
padding: 20px;
margin: 10px;
}
<div id="container">
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
</div>
Ответы
Ответ 1
Я думаю, что самым простым решением было бы использовать flexbox с justify-content: center
.
Это упаковывает все элементы в горизонтальном центре строки. Тогда ваши поля раздвигают их.
В полностью заполненных строках justify-content
не будет иметь никакого эффекта, поскольку там нет свободного места для работы.
В строках со свободным пространством (в вашем случае только с последней строкой) происходит центрирование.
#container {
display: flex;
flex-wrap: wrap;
justify-content: center;
}
.item {
flex: 0 0 calc(16.66% - 20px);
background: teal;
color: white;
padding: 20px;
margin: 10px;
}
* {
box-sizing: border-box;
}
<div id="container">
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
</div>
Ответ 2
Это побеждает цель системы сетки. Сетка - это двумерный массив, в котором все имеет значения X и Y, как в электронной таблице.
Да, вы хотите систему, в которой элементы обертываются. Flexbox отвечает всем требованиям благодаря flex-wrap
.
#container {
padding: 10px;
width: calc((100px + (10px * 2)) * 4); /* item width + padding on either side times number of items */
display: flex;
flex-wrap: wrap;
background: blue;
margin: 10px;
}
#container div {
width: 100px;
height: 100px;
flex-grow: 1;
background: red;
margin: 10px;
}
https://jsfiddle.net/0c0hzh8t/
Это заставляет детей занимать все доступное пространство, которое, если строка заполнена, будет нулевым и будет иметь стандартный размер.
Если вы хотите, чтобы размер контейнера определялся автоматически, удалите свойство width
и размер контейнера и его элементов будет изменен автоматически. Это так же хорошо, но я предполагаю, что вы хотите определить количество элементов в строке.
Ответ 3
Нет никакого конкретного свойства для того, чтобы последняя строка вела себя иначе, чем предыдущая.
Тем не менее, исходя из того, что вы определяете ширину набора, которая соответствует n элементам в ширине окна просмотра, вы можете использовать Flexbox и ее свойство justify-content
.
Установите его на center
, и он будет центрировать последнюю строку для любого количества элементов.
Фрагмент стопки
html, body {
margin: 0;
}
#container {
display: flex;
flex-wrap: wrap; /* allow items to wrap */
justify-content: center; /* horizontally center items */
}
.item {
flex-basis: calc(16.666% - 20px); /* subtract the margin from the width */
background: teal;
color: white;
padding: 20px;
margin: 10px;
box-sizing: border-box; /* make padding be included in the set width */
}
<div id="container">
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
</div>
Ответ 4
Это должно центрировать любой элемент внутри строки без использования flex
.center-item {
grid-column: 1 / -1;
}
Ответ 5
Это мое решение (по состоянию на 23 апреля 2018 года):
#wrapper {
display: grid;
grid-template-columns: repeat(2, 1fr);
grid-row-gap: 0;
grid-column-gap: 15px;
padding: 15px 15px 0 15px;
}
.item {
border: 1px solid #000;
height: 200px;
margin-bottom: 15px;
}
<div style="width: 100%; margin: 0 auto; text-align: center; vertical-align: middle;">
<div style="overflow: auto; height: 400px; margin-top: 15px;">
<div style="position: relative">
<div id="wrapper">
<div class="item"><div>Item 1</div></div>
<div class="item"><div>Item 2</div></div>
<div class="item"><div>Item 3</div></div>
<div class="item"><div>Item 4</div></div>
<div class="item"><div>Item 5</div></div>
<div class="item"><div>Item 6</div></div>
<div class="item"><div>Item 7</div></div>
<div class="item"><div>Item 8</div></div>
</div>
<div style="position: absolute; bottom: -30px; text-align: center; margin: 0 auto; width: 100%;">
<div style="background-color: #defabc; width: 300px; margin: 0 auto; text-align: center; cursor: pointer;">
<span style="color: #000;">See all items</span>
</div>
</div>
</div>
</div>
</div>
Ответ 6
Я не много работал на сетках, но насколько я знаю, если вы хотите использовать Flex-box, используйте этот код.
#container {
display: flex;
flex-wrap: wrap;
flex-direction: row;
}
.item {
flex: 1;
flex-basis: 16.66%;
background: teal;
color: white;
padding: 20px;
margin: 10px;
}
<div id="container">
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
<div class="item">Item</div>
</div>