css - Какие области Flexbox трудно или невозможно достичь с помощью Grid?
css-grid (2)
Преимущество Flexbox
Вот 9 областей, где flexbox выходит впереди Grid (уровень 1) :
-
Центрирование обернутых предметов. Представьте себе пять гибких предметов. Только четыре в ряду. Пятый оборачивает. Этот пятый может быть легко выровнен по всему ряду с помощью
justify-content
. Попробуйте центрировать этот пятый элемент в сетке контейнера. Не простой вопрос.Выравнивание элементов сетки по всей строке / столбцу (как в случае с гибкими элементами)
Как центрировать элементы в последнем ряду в CSS Grid?
-
Упаковка. Гибкие элементы переменной длины не имеют проблем с переносом. Попробуйте получить элементы сетки переменной длины для переноса. Невозможно.
Как получить элементы сетки разной длины для упаковки?
-
Авто наценки. Гибкие элементы могут быть размещены, упакованы и разнесены по всему контейнеру с
auto
полями. Тем не менее, элементы сетки ограничены их дорожками, что значительно снижает полезностьauto
полей.Могут ли автоматические поля работать в CSS Grid, как во Flexbox?
-
Мин, Макс, По умолчанию - все в одном. Задать
min-width
,max-width
иwidth
по умолчанию для гибкого элемента очень просто. Как можно установить все три длины в столбце или строке сетки? Они не могут.Установка минимальной, максимальной и длины по умолчанию столбца / строки сетки
-
Липкий нижний колонтитул / заголовок. Намного проще и проще прикрепить нижний колонтитул или заголовок с помощью flexbox.
Как получить липкий нижний колонтитул с моим макетом CSS Grid?
-
Занимая оставшееся пространство. Flex-элемент может занимать оставшееся пространство с помощью
flex-grow
. Элементы сетки не имеют такой функции.Заставьте элемент сетки использовать оставшееся пространство, как элемент flex с flex-grow: 1
Как сделать так, чтобы элементы в последнем ряду занимали оставшееся место в CSS Grid?
Как сделать CSS Grid последней строкой, чтобы занять оставшееся место
-
Уменьшая. Флекс имеет
flex-shrink
. Сетка не имеет ... ничего.Сжатие элементов сетки, как сгибать элементы в CSS
-
Ограничение количества столбцов в динамическом макете. С помощью flexbox создание переносящей сетки из двух столбцов, которая остается фиксированной на двух столбцах для разных размеров экрана, не составляет проблем. В Grid, несмотря на наличие всех этих замечательных функций, таких как
repeat()
,auto-fill
иminmax()
, это невозможно сделать.Сделать CSS Grid автоматически заполнить только 2 столбца
CSS столбцы макс столбцы без медиа-запросов
-
Создание пространства между первым и последним элементами. В сетчатом контейнере с переменным числом столбцов нелегко добавить пустой первый и последний столбец. Поля, отступы, столбцы и псевдоэлементы имеют свои ограничения. Это просто и легко с flexbox.
Добавьте пробел до и после первого и последнего элементов сетки
Общеизвестно, что Flexbox предназначен для 1-D, а Grid для 2-D, но я не нашел четкого объяснения, почему Grid нельзя использовать для 1-D и заменить Flexbox. Ближайший, к которому я пришел, это
Но вы также можете утверждать, что подобная схема 1D более эффективна во Flexbox, потому что Flexbox позволяет нам легче перемещать эти элементы (например, перемещать их все в одну или другую сторону, изменять их порядок, равномерно распределять их и т. Д.).
Я использую Grid и Flexbox для базового макета: общее расположение блоков на странице и некоторые динамические, обычно сложенные. Эстетические (тостеры, модалы, ...) управляются через структуру. Я еще не нашел случая, когда Grid не мог бы заменить Flexbox из коробки (то есть без продвинутой CSS-гимнастики или большого количества кода).
Чтобы взять пример приведенной выше цитаты, все упомянутые «ходы» непосредственно доступны в Grid, обычно с той же семантикой, что и во Flexbox.
Какие основные области, охватываемые Flexbox, трудно или невозможно управлять с помощью Grid?
РЕДАКТИРОВАТЬ: поддержка браузера не важна (я использую только вечнозеленые браузеры и могу переключаться при необходимости)
Flexbox и CSS grid - это две разные функции, и я не согласен с тем, чтобы сказать, что один может заменить другой или что CSS grid - это расширенный набор flexbox.
Вы сказали:
Я не нашел четкого объяснения, почему Grid нельзя использовать для 1-D и заменить Flexbox.
Вот базовый пример flexbox, который включает в себя перенос, который вы не можете достичь (или, вероятно, трудно достичь) с помощью CSS-сетки. Уменьшите размер окна и посмотрите, как будут вести себя элементы.
.box {
display: flex;
flex-wrap: wrap;
}
.box>span {
border: 1px solid;
padding: 10px;
flex-grow: 1;
}
<div class="box">
<span>some text very long here some text very long here </span>
<span>text here</span>
<span>A</span>
<span>B</span>
</div>
Это 1-D макет, где каждая строка может иметь размеры, изменяемые по-разному в зависимости от свободного пространства, без нахождения в 2-D сетке. Будет сложно добиться того же результата с помощью CSS-сетки.
По сути, flexbox больше подходит для многострочного / многострочного контента в одном направлении, тогда как CSS-сетка больше похожа на Grid со строками и столбцами . Конечно, когда речь идет только об одной строке, 2D-сетка может рассматриваться как 1D, поэтому flexbox и CSS-сетка могут достичь одного и того же.
Это похоже на сравнение таблицы только с одним
tr
и множественным
td
с набором элементов
inline-block
внутри одной строки, НО, когда дело доходит до переноса и множественного
tr
, ясно, что table и
inline-block
различны.
Стоит отметить, что вы можете достичь того, что вы хотите, используя любые методы в целом.
В прошлом Flexbox не было, и разработчики могли создавать макеты с помощью
float
(Boostrap - лучший пример).
Тогда Flexbox поставляется с более мощными функциями, чтобы сделать вещи проще.
То же самое для CSS-сетки и для будущих функций.
Вот пример: https://drafts.csswg.org/css-align-3/
В этом проекте говорится о будущем улучшении выравнивания, в котором мы можем рассмотреть
jutify-content
,
align-items
и т. Д. Даже без использования flexbox или CSS-сетки, а непосредственно с блочными элементами.
Если это будет реализовано, сделает ли это Flexbox и CSS Grid бесполезными? Я так не думаю.