Выравнивание элементов сетки по всей строке / столбцу (например, гибкие элементы)

С гибким контейнером и набором flex-wrap: wrap вы можете выровнять переполненные элементы по центру с помощью justify-content: center.

Есть ли способ добиться такого же поведения для переполненных элементов сетки с помощью сетки CSS?

Я создал перо, показывающее желаемое поведение при изгибе.

.container-flex {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
}

.container-flex .item {
  width: 33.33%;
  background: green;
  border: 1px solid;
}

.container-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
}

.container-grid .item {
  background: red;
  border: 1px solid;
}

* {
  box-sizing: border-box;
}
<h3>Flex</h3>
<div class = "container-flex">
  <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>

<h3>Grid</h3>
<div class = "container-grid">
  <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>

https://codepen.io/JoeHastings/pen/PeEjjR

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

Temani Afif 08.05.2018 15:09

Возможный дубликат Центрирование в CSS Grid

johnny 08.05.2018 16:07

@johnny Я не думаю, что это дубликат, этот вопрос касается центрирования текста / элементов внутри ячеек сетки, что сильно отличается от обработки переноса и центрирования самих элементов сетки

HastingsDirect 08.05.2018 17:00

Я отозвал это.

johnny 08.05.2018 17:02

Что заставляет вас думать, что Flexbox и Grid могут делать то же самое? Если, то зачем нам и то, и другое, с одним было бы хорошо. Это две совершенно разные вещи, хотя некоторые имеют общие черты, а некоторые нет. И нам нужны оба, поскольку не существует единого решения, которое могло бы справиться со всем.

Ason 08.05.2018 19:27

@LGSon Я знаю, что они разные, но поскольку они оба являются свойствами, основанными на отображении, во многих случаях они могут достичь очень похожих результатов. Я задавался вопросом, не упустил ли я свойство или что-то очевидное, поскольку это больше походило на макет сетки, поскольку мое желаемое поведение было по двум осям, а не только по одной строке или столбцу. Установка процентной ширины в разных точках разрыва и наличие гибкого обтекания мне не кажется, что именно для этого был разработан гибкость.

HastingsDirect 15.05.2018 18:12

@JoeHastings Проблема, при которой требуется "использовать процентную ширину в разных точках разрыва", больше связана с самой блочной моделью, чем с проблемой Flexbox. Для некоторых из этих функций в CSS Grid были добавлены функции, которые также могут быть обновлением будущей версии Flexbox v.2.

Ason 15.05.2018 19:00
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
CSS: FlexBox
CSS: FlexBox
Ранее разработчики использовали макеты с помощью Position и Float. После появления flexbox сценарий полностью изменился.
7
7
4 049
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Не так, как вы хотите, с гибкостью. Вы должны быть точными с CSS-Grid,

<h3>Grid</h3>
<div class = "container-grid">
    <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-mid">item</div>
</div>
.container-grid {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
}
    .item {
        background: red;
        border: 1px solid;
    }
    .item-mid{
        background:purple;
        grid-column:2/1;
    }

Также посмотрите сюда,

Центрирование в CSS Grid

(однако это не упаковка)

Меня удивляет, что сетка не может справиться с этим, это немного раздражает, когда вы не знаете, сколько элементов будет, но вы хотите, чтобы любые переполняющиеся элементы были центрированы (без добавления классов javascript) кажется гибким и процентная ширина - лучший вариант для этого случая

HastingsDirect 08.05.2018 17:06

Вы можете использовать гибкость в сетке или создать вложенную сетку. Я думаю, что намерение состоит в том, чтобы использовать для этого flex из-за единой оси и justify-content.

johnny 08.05.2018 17:12
Ответ принят как подходящий

Flex и Grid - это разные животные, поэтому простое поведение flex может не очень хорошо переноситься на сетку.

Гибкий элемент может располагаться по центру контейнера, поскольку гибкий макет работает с гибкие линии. Гибкая линия - это строка или столбец.

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

В макете сетки, однако, строки и столбцы должны иметь дело с чем-то, чего нет у гибких линий: путевые стены (линии сетки a / k / a). Например, в вашем коде три столбца. Эти столбцы делят дорожку на три отдельных участка, а элементы сетки ограничены одним участком.

Следовательно, элемент сетки не может быть автоматически центрирован в строке с использованием свойств выравнивания по ключевым словам (например, justify-content или justify-self), потому что путевые стенки ограничивают движение.

Можно сделать область сетки охватывающей всю строку / столбец, которая затем расчищает путь по всей дорожке, позволяя центрировать элемент сетки по горизонтали (justify-content: center) или по вертикали (align-self: center), но это поведение должно быть явно определено.

Чтобы элемент сетки располагался по центру строки в динамическом макете, в контейнере должен быть только один столбец (т. Е. Без разделителей), или элемент нужно будет явно переместить в центр, используя что-то вроде линейное размещение. В противном случае используйте flexbox.

Под «путевыми стенами» вы просто подразумеваете направляющие решетки или их желоба? Я не припомню, чтобы в спецификации когда-либо использовался этот термин.

TylerH 15.06.2018 18:19

@TylerH, я как можно чаще использую простой английский в своих ответах. «Путевые стены» - это именно то, что я вижу. Дело в том, что в flexbox единственное препятствие для выравнивания - это элементы-братья. Но в сетке есть дополнительное препятствие: непроходимые дорожки, пересекающие сетку.

Michael Benjamin 15.06.2018 18:27

Вот что я получаю за то, что мало читал спецификацию последние 15 месяцев или около того :-)

TylerH 15.06.2018 18:31

Таким образом, мы все еще обречены, когда хотим центрировать элементы, но каждая строка должна иметь одинаковую высоту, которая является высотой самого высокого элемента в сетке - поскольку flex может хорошо центрировать, но он делает высоту строки, сетка может делать высоту строки но не могу сделать центрирование

Huangism 06.11.2020 01:51

Другие вопросы по теме