Элементы равной высоты: Flexbox vs. Grid

Элементы равной высоты: Flexbox vs. Grid

От автора: когда-то давно (примерно 7 лет назад) я написала плагин jQuery для вычисления столбцов одинаковой высоты. Это гарантировало, что очень специфический сценарий строки с тремя столбцами будет поддерживать поля содержимого равными по высоте, независимо от длины контента, которое они содержат. Доминирующий метод размещения в то время – float — не справлялся с этой проблемой.

Решение Flexbox

Когда на сцену вышел flexbox, это стало возможным благодаря следующему:

.flexbox { display: flex;
}

Удивительно! По умолчанию прямые дочерние элементы выстраиваются в ряд и растягиваются по высоте одинаково.

Но затем вы добавляете два дива .column в качестве дочерних и… содержимое столбцов снова выглядит неодинаковым по высоте.

Исправление:

.flexbox { display: flex; // Ensure content elements fill up the .column .element { height: 100%; }
}

Теперь столбцы будут выглядеть равными по высоте и растягиваться вместе с содержимым .element.

Сетка

В сетке мы сталкиваемся с похожим поведением:

.grid { display: grid; // Essentially switch the default axis grid-auto-flow: column;
}

Подобно flexbox, прямые потомки будут иметь одинаковую высоту, но для их дочерних элементов нужно добавлять определение высоты, как в решении flexbox:

.grid { display: grid; grid-auto-flow: column; // Ensure content elements fill up the .column .element { height: 100%; }
}

Вот демонстрация обоих решений, а также дополнительные демонстрации для определения установленного количества столбцов в строке, как описано ниже:

Что лучше?

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

Преимущество сетки заключается в создании элементов равной ширины, если это желательно. Дополнительным преимуществом является то, что вам не нужен автоматический поток, а вместо этого вы можете задать максимальное количество столбцов в «строке». В этом случае компоновка сетки легко обрабатывает математику для распределения столбцов по сравнению с решением flexbox, требующим определения вычисления для ограничения количества столбцов.

Обновить решение .grid для определения максимального числа .column 3 на строку так же просто:

&.col-3 { grid-gap: $col_gap; grid-template-columns: repeat(3, 1fr);
}

Принимая во внимание, что один (очень простой) вариант для flexbox был бы:

$col_gap: 1rem; .flexbox.col-3 { // Explicitly needs to be defined to wrap // overflow items to the next virtual row flex-wrap: wrap; .column { // "hack" for no gap property margin: $col_gap/2; // define calculation for browser to use on the width max-width: calc((100% / 3) - #{$col_gap}); }
}

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

Автор: Stephanie Eckles

Источник: https://dev.to

Редакция: Команда webformyself.