Нужны ли нам всё ещё breakpoints в адаптивном дизайне?
Этот вопрос регулярно возникает в обсуждениях среди frontend-разработчиков: устарели ли viewport breakpoints? Короткий ответ — нет, но то, как мы их используем, фундаментально изменилось. Современный адаптивный CSS меньше полагается на специфичные для устройств значения в пикселях и больше — на решения, основанные на содержимом, гибкие макеты и container queries, работающие вместе с традиционными media queries.
Эта статья разъясняет, что именно изменилось, когда использовать каждую технику и как создавать макеты, которые адаптируются изящно, не утопая в объявлениях breakpoints.
Ключевые выводы
- Breakpoints остаются актуальными, но должны основываться на содержимом, а не на специфике устройств
- Media queries управляют изменениями макета на уровне страницы, в то время как container queries управляют адаптивностью на уровне компонентов
- Гибкие техники с использованием
clamp(), Flexbox и Grid снижают потребность в множественных breakpoints - Современный адаптивный дизайн обычно требует всего два или три значимых breakpoint вместо пяти или шести
Что изменилось в breakpoints адаптивного дизайна
Сами breakpoints не устарели. Уходит в прошлое практика таргетирования на конкретные устройства — проектирование под размеры «iPhone» или «iPad». Ландшафт устройств теперь включает складные телефоны, ультраширокие мониторы и планшеты, которые соперничают с экранами ноутбуков. Гнаться за отдельными устройствами непрактично.
Современный подход рассматривает breakpoints как пороговые значения, основанные на содержимом. Вы добавляете breakpoint там, где ваш макет действительно «ломается», а не там, где начинается категория устройств. Этот сдвиг означает меньше, но более осмысленных breakpoints в сочетании с техниками, которые обрабатывают промежутки между ними.
Media Queries всё ещё важны для макета на уровне страницы
Media queries остаются необходимыми для решений, которые зависят от самого viewport. Паттерны навигации, общая структура страницы и элементы вроде фиксированных заголовков должны знать полный контекст экрана.
Синтаксис улучшился. Современный синтаксис диапазонов media query делает условия более читаемыми:
@media (width >= 48rem) {
.sidebar { display: block; }
}
Это заменяет старую формулировку с min-width, выполняя ту же работу. Media queries отлично справляются с оркестровкой того, как основные области страницы реорганизуются — переход от одноколоночных мобильных макетов к многоколоночным десктопным компоновкам.
Container Queries решают другую проблему
Container queries адресуют адаптивные компоненты — элементы, которые должны адаптироваться на основе размера родительского контейнера, а не viewport. Компонент карточки может появляться в узком сайдбаре, средней области контента или широкой hero-секции. Media queries здесь не помогут, потому что viewport остаётся постоянным, в то время как контейнер меняется.
Container queries теперь имеют широкую поддержку браузеров и элегантно решают эту проблему:
.card-container {
container-type: inline-size;
}
@container (width >= 300px) {
.card { flex-direction: row; }
}
Карточка реагирует на свой непосредственный контекст. Это делает компоненты действительно переносимыми в разных контекстах макета без переопределений, специфичных для viewport.
Discover how at OpenReplay.com.
Container Queries vs Media Queries: когда использовать каждый
Используйте media queries для:
- Общих изменений макета страницы
- Трансформаций навигации
- Отступов или типографики на уровне страницы, зависящих от viewport
Используйте container queries для:
- Переиспользуемых компонентов в различных контекстах
- Виджетоподобных элементов (карточки, панели, встроенные модули)
- Компонентов дизайн-системы, которые должны работать везде
Эти инструменты дополняют друг друга. Страница может использовать media queries для переключения между макетами с сайдбаром и стековыми макетами, в то время как отдельные компоненты внутри используют container queries для адаптации к выделенному им пространству.
Гибкие макеты снижают зависимость от breakpoints
Гибкие техники CSS-макетов обрабатывают многое из того, что ранее требовало множественных breakpoints. Flexbox и Grid предоставляют внутреннее изменение размеров, которое реагирует на доступное пространство без явных breakpoints.
Функция clamp() создаёт плавно масштабируемые значения:
h1 {
font-size: clamp(1.5rem, 4vw, 3rem);
}
Типографика, отступы и даже колонки grid могут плавно масштабироваться между минимальными и максимальными границами. Это устраняет breakpoints для постепенных корректировок, резервируя их для настоящих изменений макета.
Современные viewport-единицы, такие как svh, lvh и dvh, улучшают поведение на мобильных устройствах, где интерфейс браузера влияет на доступную высоту. Subgrid позволяет вложенным элементам выравниваться с треками родительской сетки, снижая сложность макета.
Практический подход к современному адаптивному CSS
Начните с гибких техник в качестве основы. Позвольте Flexbox, Grid и clamp() обрабатывать непрерывное масштабирование. Добавьте container queries к компонентам, которые появляются в нескольких контекстах. Зарезервируйте media queries для структурных изменений на уровне страницы.
Это обычно приводит к двум или трём значимым viewport breakpoints, а не к пяти или шести, ориентированным на устройства. Макет остаётся устойчивым, потому что он построен на пропорциональных отношениях, а не на фиксированных предположениях.
Тестируйте, изменяя размер контейнеров, а не только viewport. Инструменты разработчика браузеров теперь поддерживают отладку container queries, что делает проверку поведения компонентов в разных контекстах простой задачей.
Заключение
Breakpoints не исчезли — они созрели. Современный адаптивный дизайн сочетает меньшее количество viewport breakpoints с container queries для компонентов и гибкими техниками для всего промежуточного. Media queries управляют структурой страницы, container queries управляют переносимыми компонентами, а гибкие макеты управляют постепенными корректировками.
Результат — CSS, который адаптируется к потребностям содержимого, а не к каталогам устройств, создавая макеты, которые остаются стабильными по мере дальнейшего расширения ландшафта устройств.
Часто задаваемые вопросы
Не обязательно. Хотя breakpoints на основе rem обеспечивают лучшую доступность, поскольку они масштабируются в соответствии с пользовательскими настройками шрифта, пиксельные значения всё ещё работают. Более важный сдвиг — выбирать breakpoints на основе того, где ваш контент «ломается», а не таргетировать на конкретные ширины устройств. Используете ли вы пиксели или rem, имеет меньшее значение, чем обоснование ваших выборов breakpoints.
Спросите себя, какой контекст важен для элемента. Если элемент должен реагировать на общую ширину страницы, например навигация или макет страницы, используйте media query. Если элемент является переиспользуемым компонентом, который может появляться в контейнерах разного размера на вашем сайте, используйте container query. Многие проекты используют оба для разных целей.
Container queries имеют сильную поддержку браузеров во всех основных браузерах, включая Chrome, Firefox, Safari и Edge. Они стабильны с конца 2023 года. Для поддержки старых браузеров вы можете использовать feature queries с @supports для предоставления резервных стилей, хотя это становится всё менее необходимым для большинства аудиторий.
Для большинства типографских нужд — да. Функция clamp() эффективно обрабатывает плавное масштабирование между минимальными и максимальными размерами. Однако вам всё ещё могут понадобиться breakpoints для драматических типографских изменений, таких как переключение иерархий заголовков или значительная корректировка длины строк между мобильными и десктопными макетами.
Truly understand users experience
See every user interaction, feel every frustration and track all hesitations with OpenReplay — the open-source digital experience platform. It can be self-hosted in minutes, giving you complete control over your customer data. . Check our GitHub repo and join the thousands of developers in our community..