Упрощение верстки с помощью 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, поскольку вам не нужно беспокоиться о направленности текста.