Какие области Flexbox трудно или невозможно достичь с помощью Grid? - PullRequest
4 голосов
/ 08 марта 2019

Дико подчеркивается, что Flexbox предназначен для 1-D, а Grid для 2-D, но я не нашел четкого объяснения, почему Grid нельзя использовать для 1-D и заменить Flexbox. ближайший к , к которому я пришел, это

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

Я использую Grid и Flexbox для базовой компоновки: общее расположение блоков на странице и некоторыединамические, как правило, сложены.Эстетические (тостеры, модалы, ...) управляются через структуру. Я еще не нашел случая, когда Grid не мог бы заменить Flexbox из коробки (то есть без продвинутой CSS-гимнастики или большого количества кода).

Чтобы взять пример цитатывыше, все упомянутые «ходы» непосредственно доступны в Grid, обычно с той же семантикой, что и во Flexbox.

Какие основные области, охватываемые Flexbox, трудно или невозможно управлять с помощью Grid?

РЕДАКТИРОВАТЬ: поддержка браузера не важна (я использую только вечнозеленые браузеры и могу переключаться при необходимости)

Ответы [ 3 ]

9 голосов
/ 09 марта 2019

Преимущество Flexbox

Вот 9 областей, где flexbox выходит впереди Grid (Level 1) :

  1. Центрирование обернутых предметов. Представьте себе пять изгибаемых предметов. Только четыре в ряду. Пятый оборачивает. Этот пятый можно легко выровнять по всему ряду с помощью justify-content. Попробуйте центрировать этот пятый элемент в сетке контейнера. Не простой вопрос.

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

    Как центрировать элементы в последнем ряду в CSS Grid?


  1. Упаковка. Гибкие элементы переменной длины не имеют проблем с переносом. Попробуйте получить элементы сетки переменной длины для переноса. Не возможно.

    Как получить элементы сетки разной длины для упаковки?


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

    Могут ли автоматические поля работать в CSS Grid так же, как во Flexbox?


  1. Мин., Макс., По умолчанию & ndash; все в одном. Настроить min-width, max-width и значение по умолчанию width гибкого элемента очень просто. Как можно установить все три длины в столбце или строке сетки? Они не могут.

    Установка минимальной, максимальной и длины по умолчанию столбца / строки сетки


  1. Липкий нижний колонтитул / заголовок. Намного проще и проще закрепить нижний колонтитул или верхний колонтитул с помощью flexbox.

    Как получить липкий нижний колонтитул с моим макетом CSS Grid?


  1. Занимает оставшееся пространство. Гибкий элемент может занимать оставшееся пространство с flex-grow. Элементы сетки не имеют такой функции.

    Заставить элемент сетки использовать оставшееся пространство, как элемент flex с flex-grow: 1

    Как заставить элементы в последнем ряду занимать оставшееся пространство в CSS Grid?

    Как сделать CSS Grid последней строкой, чтобы занять оставшееся место


  1. Сокращение. Flex имеет flex-shrink. Сетка не имеет ... ничего.

    Сжатие элементов сетки, как сгибание элементов в CSS


  1. Ограничение числа столбцов в динамическом макете. В flexbox создание переносящей двухколоночной сетки, которая остается фиксированной на двух столбцах для размеров экрана, не составляет проблем. В Grid, несмотря на наличие всех этих замечательных функций, таких как repeat(), auto-fill и minmax(), это невозможно сделать.

    Сделать CSS Grid автоматически заполненным только 2 столбца

    Макс. Колонки CSS-сетки без медиазапросов


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

    Добавить пробел до и после первого и последнего элементов сетки

4 голосов
/ 08 марта 2019

Flexbox и CSS-сетка - это две разные функции, и я не согласен с тем, чтобы сказать, что один может заменить другой, или что CSS-сетка - это расширенный набор 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-сетка больше относится к сетке.с строкой и столбцами .Конечно, когда речь идет только об одной строке, 2D-сетка может рассматриваться как 1D, поэтому flexbox и CSS-сетка могут достичь одного и того же.

Это похоже на сравнение таблицы только с одной tr и несколькими td с набором inline-block элементов внутри одной строки, НО, когда дело доходит до переноса, и несколькими tr ясно, что таблица и inline-block различны.


Стоит отметить, что вы можете достичьчто вы хотите, используя любые методы в целом.В прошлом Flexbox не было, и разработчики могли создавать макеты, используя float (Boostrap - лучший пример).Тогда Flexbox поставляется с более мощными функциями, чтобы сделать вещи проще.То же самое для CSS-сетки и для будущих функций.

Вот пример: https://drafts.csswg.org/css-align-3/

Этот проект говорит о будущем улучшении выравнивания, где мы можем рассмотреть jutify-content, align-items и т. д. даже без использования flexbox или CSS-сетки, а непосредственно с элементами блока.

Если это будет реализовано, сделает ли это Flexbox и CSS Grid бесполезными?Я так не думаю.

1 голос
/ 08 марта 2019

Я, вероятно, должен указать, что Grid НАМНОГО новее, чем Flexbox, и, следовательно, может на самом деле быть заменой в некоторой степени. Так же, как Flexbox заменил типичный вариант использования float (не по назначению).

Я собираюсь предварить это словами, мне редко НУЖНЫ сложности / возможности Grid, поэтому я все еще использую Flexbox для большинства вещей.

Однако, по моему опыту, возможности flex-wrap, особенно с переменным размером экрана, - это то место, которое, как мне кажется, Grid не является хорошей заменой.

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