it-swarm.com.ru

Как центрировать элементы в последнем ряду в 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>

Как я могу получить последний ряд по центру, а не по левому краю? Я не могу гарантировать количество элементов, поэтому хочу, чтобы макет выглядел правильно для любого количества элементов.

Это то, что я должен использовать flexbox вместо? Или CSS-сетки подходят для использования?

10
fightstarr20

Я думаю, что самым простым решением было бы использовать 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>

7
Michael_B

Не существует конкретного свойства, позволяющего заставить последний ряд вести себя иначе, чем предыдущий.

Тем не менее, основываясь на том факте, что вы определяете ширину набора, которая соответствует элементам 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
LGSon

Это должно центрировать любой элемент внутри строки без использования flex

.center-item {
    grid-column: 1 / -1;
}
4
Jalal

Это побеждает цель системы сетки. Сетка - это двумерный массив, в котором все имеет значения 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
JackHasaKeyboard

Это мое решение (по состоянию на 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>

Что он делает, так это то, что вы можете расположить элементы в центре в самом низу обертки сетки. Опять же, как и во всех других решениях, вы не можете поместить что-либо в оболочку сетки для выравнивания по центру в самом последнем ряду. 

Но, по крайней мере, это хорошее альтернативное решение в качестве обходного пути.

0
tom_mai78101