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, браузер перестает выравнивать элементы по жесткой сетке строк. Он распределяет дочерние элементы по колонкам или строкам, минимизируя пустое пространство.
Выделяют два основных направления раскладки:
- Вертикальный «водопад» (Waterfall): Активируется при определении колонок через
grid-template-columns. Элементы автоматически помещаются в ту колонку, где свободное пространство ближе всего к верхнему краю. По мере прокрутки новые элементы могут подгружаться (lazy-load) в освобождающиеся дорожки. - Горизонтальная кирпичная раскладка (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 необходимо соблюдать строгие правила:
- Семантический порядок в DOM: Исходный код HTML должен быть написан в той последовательности, в которой пользователь должен воспринимать информацию логически.
- Ограничение явного позиционирования: Избыточное использование свойств
spanи принудительного закрепления блоков в дорожках усиливает разрыв между визуальным и DOM-порядком. - Тестирование фокуса: Разработчик должен вручную пройтись по макету с помощью клавиши 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 с автоподстройкой строк также является надежным решением, хотя и оставляет пустые вертикальные зазоры между строками.

