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

Написать
Войти
Дайджесты
Реконструкция сетки FIFA на CSS Subgrid: чистый DOM и адаптивная вёрстка

Реконструкция сетки FIFA на CSS Subgrid: чистый DOM и адаптивная вёрстка

Оригинальная турнирная сетка FIFA сверстана с искусственным разрывом DOM на левую и правую части, что приводило к дублированию HTML. Использование CSS Grid и Subgrid позволяет сохранить логическую структуру раундов, наследовать направляющие линии родителя и адаптировать макет без изменения разметки.

Реконструкция сетки FIFA на CSS Subgrid: чистый DOM и адаптивная вёрстка

При проектировании сложных многоколоночных макетов веб-разработчики постоянно сталкиваются с тяжелым компромиссом: либо жертвовать семантической чистотой HTML-разметки ради удобства визуального выравнивания блоков, либо плодить глубокие вложенные обертки DOM. Ярким наглядным примером этой инженерной проблемы выступает официальная турнирная сетка чемпионата мира на сайте FIFA.

В исходной реализации макета сайта FIFA разметка турнирной таблицы разрывалась на две отдельные визуальные группы: левую часть сетки и правую часть сетки. Чтобы визуально отобразить раунды соревнований с финалом по центру, разработчикам пришлось продублировать HTML-структуру этапов и разнести матчи одного и того же раунда по разным веткам дерева DOM. Инженер по дизайну Ахмад Шадид (Ahmad Shadeed) провел подробный рефакторинг этого макета, показав, как применение технологии CSS Subgrid позволяет построить семантичную разметку и адаптивный интерфейс.

Анализ проблемы и ограничений традиционной HTML-структуры

В традиционной верстке на базе базового модуля CSS Grid элементы, находящиеся внутри дочерних контейнеров, полностью изолированы от направляющих линий родительской сетки. Дочерний элемент формирует собственную независимую сетку, из-за чего выровнять элементы из разных контейнеров друг относительно друга становится крайне сложной задачей.

В случае турнирной таблицы FIFA логическая структура в HTML должна последовательно отражать этапы турнира: 1/8 финала, четвертьфинал, полуфинал и финал. Однако из-за стремления расположить финал в центре экрана, а предшествующие раунды по бокам, в оригинальном сайте разметка 1/8 финала оказалась разбита на два независящих блока. Это существенно затрудняет навигацию с помощью скринридеров и ассистивных технологий, а также требует громоздких скриптов при адаптации под мобильные экраны.

Построение базовой родительской сетки на 8 колонок

В обновленном архитектурном решении внешняя обертка турнирного дерева организуется как единый родительский контейнер CSS Grid, состоящий из 8 вертикальных колонок. Колонки точно соответствуют визуальным столбцам раундов: четыре столбца с левой стороны, центральный столбец финала и три столбца с правой стороны.

.bracket-wrapper {
  display: grid;
  grid-template-columns: repeat(8, 1fr);
  gap: 1.5rem;
  align-items: center;
}

Благодаря такой организации каждый раунд турнира в HTML представляет собой естественный семантический список матчей. Все матчи 1/8 финала находятся в единой секции разметки, независимо от того, в какой части экрана они отрисовываются визуально.

Наследование направляющих линий через CSS Subgrid

Ключевым инструментом увязки карточек матчей с единым родительским макетом выступает свойство grid-template-columns: subgrid и grid-template-rows: subgrid. Технология подсеток (Subgrid) заставляет дочерний элемент использовать сетку своего родителя вместо создания собственного изолированного контекста форматирования.

Для раунда, охватывающего несколько колонок родителя, задаются следующие CSS-правила:

.round-section {
  display: grid;
  grid-template-columns: subgrid;
  grid-template-rows: subgrid;
  grid-column: span 8;
}

Благодаря этому дочерние карточки матчей выравниваются строго по колонкам и строкам родительской сетки. Наследование строк через grid-template-rows: subgrid гарантирует, что заголовки раундов, плашки со счетом и блоки с именами команд на всех этапах турнира выравниваются по единым горизонтальным базовым линиям без вычисления фиксированных пиксельных высот.

Симметричное выравнивание правого крыла сетки

Особый интерес в рефакторинге представляет выравнивание матчей правой половины турнирного дерева. Чтобы карточки правой стороны зеркально отражали левую часть и примыкали к соответствующим линиям финала, используется отсчет линий от правого края родительской сетки с помощью отрицательных индексов:

.round-right-side {
  grid-column: 5 / -1;
}

.match-card-reverse {
  grid-column: -2;
}

Значение grid-column: -2 указывает браузеру выравнивать элемент по предпоследней вертикальной линии родительской сетки. Это полностью исключает необходимость создавать специальные зеркальные классы в HTML или дублировать стили для левых и правых элементов.

Адаптивность под мобильные устройства и контейнерные выражения

На небольших экранах мобильных устройств 8-колоночный горизонтальный макет физически не помещается по ширине. В традиционной верстке это потребовало бы полной перестройки дерева DOM с помощью манипуляций JavaScript.

Благодаря использованию CSS Subgrid и контейнерных выражений (@container) адаптация под мобильные экраны выполняется исключительно средствами CSS. При уменьшении ширины экрана родительский контейнер переключается в одноколоночную или 4-колоночную последовательную структуру, где раунды выставляются друг за другом по вертикали:

@container (max-width: 768px) {
  .bracket-wrapper {
    grid-template-columns: 1fr;
  }
  
  .round-section {
    grid-column: 1;
    grid-template-columns: 1fr;
  }
}

Карточки команд внутри каждого матча выравниваются через флекс-модель (display: flex), обеспечивая плавную подгонку названий команд и счетчиков голов под любую ширину экрана.

Безопасная поддержка и фолбэки для старых движков

Хотя спецификация CSS Subgrid поддерживается всеми современными браузерами, в продакшен-коде рекомендуется предусматривать безопасные фолбэки через директиву @supports. Для устаревших браузеров можно задать базовый Flexbox-макет:

@supports not (grid-template-columns: subgrid) {
  .round-section {
    display: flex;
    flex-direction: column;
    gap: 1rem;
  }
}

Это предотвращает развал интерфейса у пользователей со старыми устройствами, одновременно предоставляя современным браузерам идеально выровненную сетку.

Практическая ценность для современной фронтенд-разработки

Реконструкция сетки FIFA на CSS Subgrid демонстрирует возможности современного CSS. Веб-разработчикам больше не нужно выбирать между семантической чистотой HTML и сложностью графического представления макета. Применение подсеток сокращает количество лишних тегов-оберток в разметке, уменьшает объем стилей, упрощает поддержку кода и обеспечивает естественную доступность интерфейсов для экранных дикторов. На сегодняшний день технология CSS Subgrid является одним из лучших инструментов для верстки сложных адаптивных интерфейсов.