Media-запросы в CSS позволяют применять стили в зависимости от характеристик устройства: ширины экрана, типа дисплея, разрешения и других параметров. Это ключевой инструмент для адаптивной вёрстки, обеспечивающий корректное отображение интерфейсов на различных устройствах – от смартфонов до телевизоров с высоким разрешением.
Базовый синтаксис media-запроса начинается с ключевого слова @media, за которым следует условие, определяющее, когда должны применяться стили. Пример: @media (max-width: 768px) позволяет задать стили для экранов шириной до 768 пикселей. Условия можно комбинировать с помощью логических операторов and, or и not, что делает запросы гибкими и точными.
На практике рекомендуется использовать mobile-first подход, при котором базовые стили ориентированы на мобильные устройства, а с увеличением размеров экрана подключаются дополнительные стили. Это упрощает поддержку кода и улучшает производительность. Например:
@media (min-width: 1024px) – подключает стили только для экранов шириной от 1024 пикселей и выше. Таким образом, можно избежать избыточной нагрузки на устройства с небольшими экранами.
Media-запросы также позволяют учитывать не только размеры экрана, но и его тип. Условие print применяет стили при печати страницы, а screen – при отображении на дисплее. Это важно для создания оптимального представления контента в разных средах.
Как задать стили только для мобильных устройств
Media-запросы позволяют применять CSS только при определённых характеристиках устройства. Чтобы нацелиться исключительно на мобильные устройства, используют правило @media с условием максимальной ширины экрана.
Пример:
@media (max-width: 767px) {
body {
background-color: #f2f2f2;
}
.menu {
display: none;
}
.mobile-nav {
display: block;
}
}
max-width: 767px – стандартная граница для большинства смартфонов. Все стили внутри применяются только при ширине экрана до 767 пикселей включительно.
Избегайте жесткой привязки к конкретным устройствам. Вместо этого ориентируйтесь на характеристики: orientation (ориентация экрана), resolution (разрешение), hover (наличие курсора), pointer (тип указателя).
Пример для портретной ориентации:
@media (max-width: 767px) and (orientation: portrait) {
.sidebar {
display: none;
}
}
Всегда размещайте mobile-стили в конце файла, чтобы они переопределяли общие правила. Используйте мобильный first-подход: пишите базовые стили для мобильных устройств, а остальные – через min-width.
Чем отличается min-width от max-width в медиазапросах
min-width активирует медиазапрос, когда ширина экрана становится больше или равна указанному значению. Такой подход называют mobile-first, поскольку стили по умолчанию пишутся для мобильных устройств, а более широкие экраны получают дополнительные стили при необходимости.
max-width срабатывает, когда ширина окна меньше или равна заданному значению. Это desktop-first стратегия: основной стиль рассчитан на десктоп, а узкие экраны адаптируются с помощью медиазапросов.
Пример использования min-width:
@media (min-width: 768px) {
.menu {
display: flex;
}
}
Пример использования max-width:
@media (max-width: 767px) {
.menu {
display: none;
}
}
При конфликте медиазапросов приоритет имеет тот, который подключён позже в CSS. Чтобы избежать путаницы, следует выбрать единую стратегию: min-width упрощает масштабирование от малого к большому, снижая дублирование кода.
Как применять медиазапросы для ориентации экрана
Свойство orientation в медиазапросах позволяет точно определить текущую ориентацию устройства: portrait (портретная) или landscape (альбомная). Это критично при разработке интерфейсов для мобильных и планшетных устройств, где доступное пространство существенно меняется при повороте экрана.
Для применения медиазапроса к портретной ориентации:
@media (orientation: portrait) {
/* Стили для вертикального экрана */
.sidebar {
display: none;
}
.content {
padding: 16px;
}
}
Аналогично, для альбомной ориентации:
@media (orientation: landscape) {
/* Стили для горизонтального экрана */
.sidebar {
display: block;
}
.content {
padding: 32px;
}
}
Медиазапросы с orientation полезно комбинировать с условиями по ширине экрана для более точного таргетирования:
@media (max-width: 768px) and (orientation: landscape) {
nav {
flex-direction: row;
}
}
Следует учитывать, что ориентация определяется физическим положением устройства, а не размерами окна. На настольных устройствах значение orientation может быть некорректным или не иметь смысла, поэтому проверку стоит применять только к мобильным или гибридным интерфейсам.
Как скрывать и отображать элементы в зависимости от размера экрана
Для адаптивного управления отображением элементов в CSS применяются медиа-запросы. Они позволяют задавать стили, действующие при определённых условиях, например, при заданной ширине экрана.
Наиболее часто используемый синтаксис:
@media (max-width: 768px) {
.menu {
display: none;
}
}
Это правило скроет элемент с классом .menu
, если ширина экрана не превышает 768 пикселей. Обратный пример:
@media (min-width: 769px) {
.menu {
display: block;
}
}
Рекомендуемые подходы:
- Использовать классы для управления видимостью, чтобы избежать дублирования стилей.
- Применять
display: none
только при необходимости: скрытые элементы всё равно загружаются браузером. - Минимизировать вложенность медиа-запросов – они должны быть предсказуемыми и легко поддерживаемыми.
Примеры типовых брейкпоинтов для адаптивной вёрстки:
max-width: 480px
– мобильные устройстваmax-width: 768px
– планшетыmin-width: 1024px
– десктопы
Для сложных интерфейсов рекомендуется использовать утилиты или фреймворки, в которых брейкпоинты уже оптимизированы, например, Tailwind или Bootstrap. Однако, при кастомной вёрстке – задавайте только необходимые размеры, опираясь на содержимое.
Как использовать медиазапросы внутри Flex и Grid макетов
Медиазапросы позволяют адаптировать поведение Flex и Grid контейнеров под разные размеры экранов. Это особенно важно при создании интерфейсов с динамически изменяемым числом элементов, например, карточек товаров или блоков с контентом.
Для Flex-контейнеров ключевой параметр – flex-direction
. Например, при ширине экрана более 768px элементы могут располагаться в строку, а при меньшей – переходить в колонку:
.flex-container {
display: flex;
flex-direction: row;
}
@media (max-width: 768px) {
.flex-container {
flex-direction: column;
}
}
Grid-макеты позволяют менять количество колонок с помощью grid-template-columns
. Часто используют repeat(auto-fit, minmax())
, но при необходимости жёсткого контроля – медиазапросы:
.grid-container {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 16px;
}
@media (max-width: 1024px) {
.grid-container {
grid-template-columns: repeat(2, 1fr);
}
}
@media (max-width: 600px) {
.grid-container {
grid-template-columns: 1fr;
}
}
Для адаптивности важно учитывать не только ширину экрана, но и внутренние отступы, например, при использовании gap
в Grid и justify-content
в Flex. Ниже представлены ключевые свойства, которые чаще всего адаптируют через media:
Контекст | Свойства |
---|---|
Flex | flex-direction , flex-wrap , justify-content , align-items |
Grid | grid-template-columns , grid-template-rows , gap , justify-items |
Комбинируя медиазапросы с возможностями Flex и Grid, можно добиться полной адаптивности без необходимости использовать JavaScript. Это повышает производительность и упрощает поддержку кода.
Как организовать CSS-файл с множеством медиазапросов
Распределяйте медиазапросы в конце CSS-файла. Это упрощает поиск адаптивных стилей и предотвращает дублирование правил. Основные стили должны быть написаны без условий, а модификации – через @media
.
Группируйте медиазапросы по типу устройств или по брейкпоинтам. Например, сначала десктопные модификации, затем планшетные и мобильные. Еще один подход – группировать по компонентам: кнопки, формы, карточки – каждый блок со своими медиазапросами.
Используйте одинаковую структуру брейкпоинтов во всем проекте. Например: min-width: 768px
, min-width: 1024px
, min-width: 1280px
. Это упрощает масштабирование дизайна и уменьшает количество конфликтов.
Избегайте вложенности медиазапросов в препроцессорах (Sass, Less), если это усложняет чтение кода. Лучше использовать плоскую структуру: основной стиль, затем медиазапросы ниже.
Добавляйте комментарии перед каждой группой медиазапросов. Указывайте брейкпоинт и цель изменения: /* >=768px: Увеличиваем отступы в карточках */
. Это ускоряет навигацию и ревью кода.
Регулярно удаляйте неиспользуемые медиазапросы. Используйте инструменты анализа кода (например, Stylelint с плагинами), чтобы избежать мертвых стилей и сохранить файл компактным.
Вопрос-ответ:
Что такое media в CSS и для чего оно нужно?
В CSS, медиазапросы (или media queries) — это техника, которая позволяет применять различные стили в зависимости от характеристик устройства, на котором просматривается веб-страница. Например, с помощью медиазапросов можно адаптировать внешний вид сайта под мобильные устройства, планшеты или десктопы. Медиазапросы помогают улучшить отзывчивость дизайна и сделать интерфейс удобным на разных устройствах.