Сервис развивается: тестируем формат, собираем идеи, улучшаем сервис. Есть идеи?

Написать
Войти
Дайджесты
Сравнение waterfall и brick раскладки CSS Grid Lanes

display: grid-lanes — нативная CSS-альтернатива JavaScript-сеткам masonry

В браузере Safari реализована нативная поддержка раскладки display: grid-lanes, позволяющая создавать сложные адаптивные сетки типа masonry без использования JavaScript-библиотек. Карточка подробно разбирает синтаксис grid-template-columns, управление порядком элементов и прогрессивное улучшение.

display: grid-lanes — нативная CSS-альтернатива JavaScript-сеткам masonry

Создание макетов в стиле «водопада» (masonry) долгое время оставалось сложной задачей веб-верстки. В то время как стандартная сетка CSS Grid выравнивает элементы по строкам и колонкам, образуя пустые зазоры при разной высоте блоков, masonry-раскладка стремится упаковать элементы максимально плотно, подтягивая нижние блоки к верхним. Популярные галереи изображений, блоги с карточками рецептов или новостные порталы сделали этот визуальный паттерн индустриальным стандартом.

Однако для реализации такой раскладки разработчикам приходилось использовать JavaScript-библиотеки вроде Masonry.js. Это влекло за собой накладные расходы: задержки при рендеринге, постоянный пересчет размеров при изменении ширины экрана, просадки производительности и непроизвольные сдвиги макета (Layout Shift). Браузерная инициатива WebKit решает эту проблему, представляя нативную альтернативу в CSS — спецификацию display: grid-lanes.

Как работает native masonry в CSS

Основная идея display: grid-lanes заключается в переносе расчетов позиционирования разновысоких элементов непосредственно в графический движок браузера. Вместо вычисления координат каждого блока через JavaScript разработчик может использовать принципы CSS Grid, но с динамическим заполнением дорожек (lanes).

Когда контейнеру задается свойство display: grid-lanes, браузер перестает выравнивать элементы по жесткой сетке строк. Он распределяет дочерние элементы по колонкам или строкам, минимизируя пустое пространство.

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

  1. Вертикальный «водопад» (Waterfall): Активируется при определении колонок через grid-template-columns. Элементы автоматически помещаются в ту колонку, где свободное пространство ближе всего к верхнему краю. По мере прокрутки новые элементы могут подгружаться (lazy-load) в освобождающиеся дорожки.
  2. Горизонтальная кирпичная раскладка (Brick): Активируется при определении строк через grid-template-rows. Элементы укладываются слева направо (или справа налево), при этом порядок обхода (tab order) идет сверху вниз. Новые блоки прижимаются к началу строки.

Для определения структуры дорожек доступны стандартные инструменты CSS Grid: доли свободного пространства (fr), фиксированные величины (пиксели, проценты, em), адаптивные функции minmax(), а также автоматическое заполнение repeat(auto-fill, ...) и repeat(auto-fit, ...).

Пример кода для создания гибкой адаптивной сетки:

.masonry-container {
  display: grid-lanes;
  grid-template-columns: repeat(auto-fit, minmax(min(120px, 100%), 1fr));
  gap: 16px;
}

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

Свойства span и явное позиционирование

Хотя элементы распределяются по дорожкам автоматически, display: grid-lanes сохраняет гибкость настройки для отдельных блоков с помощью стандартных свойств позиционирования CSS Grid.

  • Объединение дорожек (Spanning): Если необходимо выделить важный блок (например, баннер или крупное изображение в галерее), ему можно задать свойство grid-column: span 2. Браузер автоматически выделит под него две соседние колонки и перестроит окружающий контент так, чтобы заполнить оставшиеся пустоты.
  • Явное позиционирование (Explicit placement): Свойство grid-column: 3 позволяет принудительно закрепить элемент в третьей колонке. Это полезно для создания асимметричных дизайнерских макетов, где определенные типы контента должны находиться в строго заданных вертикальных зонах.

Благодаря встроенному алгоритму разрешения конфликтов, браузер корректно обрабатывает как элементы с фиксированными координатами, так и свободно плавающие блоки, распределяя их вокруг статичных объектов.

Тонкая настройка с помощью flow-tolerance

При автоматической укладке элементов разной высоты алгоритм стремится упаковать их как можно плотнее. Из-за этого визуальный порядок элементов на экране может сильно отличаться от их исходного порядка в HTML-документе. Если элемент №3 имеет большую высоту, элемент №4 может оказаться выше него во второй колонке. Это создает проблемы для восприятия текста или хронологических лент.

Свойство flow-tolerance позволяет установить баланс между плотностью упаковки и сохранением логической последовательности чтения. Оно определяет максимальную разницу в высоте между дорожками, при которой браузер все еще обязан соблюдать исходный порядок элементов.

Если разница высот укладывается в рамки flow-tolerance, браузер отдает приоритет порядку написания (writing mode order), а не плотности прилегания. В качестве единиц измерения свойства могут выступать любые CSS-единицы: em и rem (для привязки к размеру шрифта), px (абсолютный контроль), ch (ширина символа «0») или lh (высота строки текста, например, flow-tolerance: 4lh позволяет отклоняться от порядка не более чем на 4 строки текста). Значение по умолчанию составляет 1em. Тонкая настройка этого параметра позволяет создавать гармоничные текстовые макеты, в которых пользователь не теряет нить повествования при чтении слева направо.

Доступность и особенности клавиатурной навигации

Любая раскладка, которая визуально переупорядочивает элементы на экране, несет в себе скрытые риски для доступности сайта (Accessibility / A11y). В CSS Grid Lanes визуальный порядок элементов может отличаться от их физического расположения в DOM-дереве документа.

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

Поэтому при проектировании макетов на основе Grid Lanes необходимо соблюдать строгие правила:

  1. Семантический порядок в DOM: Исходный код HTML должен быть написан в той последовательности, в которой пользователь должен воспринимать информацию логически.
  2. Ограничение явного позиционирования: Избыточное использование свойств span и принудительного закрепления блоков в дорожках усиливает разрыв между визуальным и DOM-порядком.
  3. Тестирование фокуса: Разработчик должен вручную пройтись по макету с помощью клавиши Tab, убедившись, что перемещение фокуса выглядит естественным и предсказуемым.

Прогрессивное улучшение и фолбеки

Поскольку спецификация display: grid-lanes является относительно новой и изначально внедряется в движке WebKit (Safari), ее поддержка в других браузерах может отсутствовать. Внедрение технологии в коммерческие проекты требует обязательного использования стратегии прогрессивного улучшения (Progressive Enhancement).

Разработчикам необходимо спроектировать резервный макет (fallback) для старых браузеров или альтернативных движков, а затем переопределить стили для браузеров, поддерживающих Grid Lanes, с помощью CSS-директивы @supports.

Схема реализации выглядит следующим образом:

/* Базовые стили для всех браузеров (фолбек) */
.masonry-container {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
  gap: 16px;
}

/* Стили для браузеров с поддержкой Grid Lanes */
@supports (display: grid-lanes) {
  .masonry-container {
    display: grid-lanes;
    grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
    flow-tolerance: 1.5em;
  }
}

В качестве альтернативного фолбека можно использовать многоколоночную раскладку CSS Multi-column (column-count), которая также позволяет размещать элементы в виде колонок без JavaScript. Однако Multi-column распределяет элементы сверху вниз по колонкам, а не слева направо. Простой CSS Grid с автоподстройкой строк также является надежным решением, хотя и оставляет пустые вертикальные зазоры между строками.