Ванильный код
April 20, 2022

Упрощение верстки с помощью Gap

До CSS grid единственным жизнеспособным вариантом для создания динамических макетов был flexbox. Но у него было одно серьезное ограничение: отсутствие поддержки gap.

В то время как инструменты проектирования дизайна поддерживают понятие пробелов, CSS этого не делает, и большинство таблиц стилей полагаются на margin и padding для разделения дочерних элементов flex. Обычно это включало неудобные хаки для исключения последнего элемента flex из списка селекторов:

.flex-item:not(:last-of-type) {
  margin-right: 8px;
  margin-bottom: 8px;
}

Но не было никакого способа исключить последнюю строку flex контейнера из получения margin-bottom, что означало, что ваш flex макет имел ненужный интервал под ним.

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

Вообще говоря, мне также нравится избегать использования margins на дочернем уровне. Причина этого в том, что дети не должны диктовать, как их братья и сестры расположены — это работа лейаута! Вы можете узнать больше об этом в статье Макса Штайнера о том, почему margin считается вредной практикой. Однако стоит отметить, что из этого правила есть хорошие исключения, например, для размещения элементов в макете статьи. gaps обеспечивают равномерное расстояние, что не всегда является тем, что вы хотите.

В настоящее время это больше не проблема, потому что пробелы flexbox поддерживаются во всех основных браузерах. Safari раньше был странным и некоторое время сдерживал веб, но он поддерживает flexbox gaps начиная с версии 14.1. Это означает, что, если вам не нужно поддерживать старые браузеры, вы можете легко обойтись написанием простого и декларативного CSS, подобного этому:

.flex-layout {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
}

В качестве альтернативы вы можете использовать grid, который также поддерживает пробелы и автоматическое перенос столбцов:

.grid-layout {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(some-min, 1fr));
  gap: 8px;
}

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

Более того, поскольку макеты flex и grid автоматически переворачиваются для RTL, это делает их идеальными для создания макетов, безопасных для RTL, поскольку вам не нужно беспокоиться о направленности текста.