@media запросы CSS — адаптивная вёрстка сайта

@media — правило CSS, которое применяет стили только при выполнении условия: определённой ширине экрана, ориентации, цветовой схеме. Это основа адаптивной вёрстки.

Вся рубрика CSS: уроки, примеры и справочник по стилям

Синтаксис @media

@media условие {
  /* CSS применяется только когда условие = true */
}

/* max-width — для экранов ДО указанной ширины (включительно) */
@media (max-width: 768px) {
  .sidebar { display: none; }   /* скрыть на мобильных */
}

/* min-width — для экранов ОТ указанной ширины */
@media (min-width: 768px) {
  .container { display: grid; grid-template-columns: 250px 1fr; }
}

/* Диапазон — от и до */
@media (min-width: 480px) and (max-width: 767px) {
  .grid { grid-template-columns: repeat(2, 1fr); }
}

/* Логическое ИЛИ */
@media (max-width: 480px), (orientation: landscape) {
  .hero { height: auto; }
}

/* Медиатип (screen, print, all) */
@media screen and (min-width: 768px) { ... }
@media print { ... }
Синтаксис CSS @media: max-width min-width диапазон and и условие true false
Основная логика @media: max-width ограничивает стили сверху, min-width включает стили с указанной ширины и выше.

meta viewport — обязательный тег

Без этого тега мобильный браузер имитирует широкий экран и медиазапросы не работают как ожидается.

<!-- Добавь в <head> — без этого @media на мобильных не работает -->
<meta name="viewport" content="width=device-width, initial-scale=1">
meta viewport в HTML: без него мобильный браузер использует виртуальную ширину 980px
Тег meta viewport нужен, чтобы медиазапросы считали реальную ширину устройства, а не виртуальный широкий экран.

Breakpoints — стандартные точки перелома

BreakpointШиринаУстройства
xs (mobile)< 480pxМаленькие телефоны
sm480px – 639pxБольшие телефоны
md640px – 767pxПланшеты (Portrait)
lg768px – 1023pxПланшеты (Landscape), нетбуки
xl1024px – 1279pxНебольшие десктопы
2xl1280px+Десктопы и большие мониторы
/* Стандартные breakpoints (Tailwind CSS подход) */
/* По умолчанию — мобильные (< 640px) */

@media (min-width: 640px) { /* sm */ }
@media (min-width: 768px) { /* md */ }
@media (min-width: 1024px){ /* lg */ }
@media (min-width: 1280px){ /* xl */ }
@media (min-width: 1536px){ /* 2xl */ }

/* Bootstrap подход */
@media (min-width: 576px)  { /* sm */ }
@media (min-width: 768px)  { /* md */ }
@media (min-width: 992px)  { /* lg */ }
@media (min-width: 1200px) { /* xl */ }
@media (min-width: 1400px) { /* xxl */ }

/* Совет: используй CSS переменные для breakpoints */
/* Хотя в условии @media var() не работает,
   можно хранить их в :root как документацию */
Карта CSS breakpoints: 480 640 768 1024 1280 1536 пикселей и типы устройств
Breakpoints — это точки, где интерфейс меняет раскладку: обычно хватает нескольких ключевых ширин.

Mobile First — современный подход

Mobile First: базовые стили пишутся для мобильных, потом добавляются стили для больших экранов через min-width. Это лучше для производительности на мобильных — браузер не загружает лишние правила.

/* ❌ Desktop-first (устаревший подход) */
.grid {
  grid-template-columns: repeat(3, 1fr);  /* начали с десктопа */
}
@media (max-width: 1024px) {
  .grid { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 768px) {
  .grid { grid-template-columns: 1fr; }   /* переопределяем для мобильных */
}

/* ✅ Mobile-first (современный подход) */
.grid {
  grid-template-columns: 1fr;  /* начинаем с мобильных */
}
@media (min-width: 640px) {
  .grid { grid-template-columns: repeat(2, 1fr); }
}
@media (min-width: 1024px) {
  .grid { grid-template-columns: repeat(3, 1fr); }  /* добавляем для больших */
}

/* Пример: типографика */
h1 {
  font-size: 1.75rem;  /* мобильные */
}
@media (min-width: 768px) {
  h1 { font-size: 2.5rem; }  /* планшеты и выше */
}
@media (min-width: 1024px) {
  h1 { font-size: 3rem; }    /* десктопы */
}
Mobile first подход в CSS: одна колонка на телефоне, две на планшете, три на десктопе
Mobile First начинает с мобильной версии и постепенно расширяет макет через min-width.

Другие медиа-условия

/* Ориентация устройства */
@media (orientation: portrait) {
  /* Вертикальная ориентация */
  .photo-grid { grid-template-columns: 1fr; }
}
@media (orientation: landscape) {
  /* Горизонтальная */
  .photo-grid { grid-template-columns: repeat(2, 1fr); }
}

/* Тёмная тема ОС */
@media (prefers-color-scheme: dark) {
  :root {
    --bg:   #111827;
    --text: #f9fafb;
  }
}

/* Светлая тема ОС */
@media (prefers-color-scheme: light) {
  :root {
    --bg:   #ffffff;
    --text: #111827;
  }
}

/* Анимации отключены в ОС (accessibility) */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    transition-duration: 0.01ms !important;
  }
}

/* Стили для печати */
@media print {
  nav, .sidebar, .ads, footer { display: none; }
  body { font-size: 12pt; color: black; background: white; }
  a { color: black; text-decoration: underline; }
  a[href]::after { content: " (" attr(href) ")"; }  /* показать URL */
  img { max-width: 100%; }
}

/* Retina / высокое разрешение */
@media (-webkit-min-device-pixel-ratio: 2),
       (min-resolution: 2dppx) {
  .logo {
    background-image: url('logo@2x.png');
    background-size: contain;
  }
}

/* Hover поддержка (есть ли мышь) */
@media (hover: hover) {
  .card:hover { transform: translateY(-4px); }
  /* Только на устройствах с мышью — не срабатывает на тачскрине */
}
CSS media features: orientation, prefers color scheme, reduced motion, print, retina, hover
Медиазапросы могут учитывать ориентацию, тему ОС, печать, плотность пикселей и поддержку hover.

Практический пример — адаптивный макет страницы

/* Мобильные (по умолчанию) */
.page {
  display: grid;
  grid-template-areas:
    "header"
    "main"
    "sidebar"
    "footer";
  gap: 16px;
  padding: 16px;
}

.header  { grid-area: header; }
.main    { grid-area: main; }
.sidebar { grid-area: sidebar; }
.footer  { grid-area: footer; }

/* Планшеты */
@media (min-width: 768px) {
  .page {
    grid-template-columns: 240px 1fr;
    grid-template-rows: auto 1fr auto;
    grid-template-areas:
      "header  header"
      "sidebar main  "
      "footer  footer";
    gap: 24px;
    padding: 24px;
  }
}

/* Десктоп */
@media (min-width: 1024px) {
  .page {
    max-width: 1200px;
    margin: 0 auto;
    gap: 32px;
  }
}

/* Навигация: гамбургер на мобильных, горизонтальная на десктопе */
.nav-links { display: none; }
.hamburger { display: block; }

@media (min-width: 768px) {
  .nav-links {
    display: flex;
    gap: 24px;
    list-style: none;
  }
  .hamburger { display: none; }
}
Адаптивный макет страницы на CSS Grid: phone tablet desktop header main sidebar footer
Практический паттерн: grid-areas перестраивают страницу от мобильной колонки к полноценному layout с sidebar.

Адаптивность без @media — Grid и Flexbox

/* CSS Grid auto-fill — адаптивные колонки без медиазапросов */
.cards {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
  gap: 20px;
}
/* Сам считает сколько колонок влезет, без @media */

/* Flexbox с wrap */
.flex-cards {
  display: flex;
  flex-wrap: wrap;
  gap: 16px;
}

.flex-cards > * {
  flex: 1 1 280px;  /* grow shrink base */
  /* Минимум 280px, дальше тянется */
}

/* clamp() для адаптивной типографики */
h1 {
  font-size: clamp(1.5rem, 4vw, 3rem);
  /* Мин 1.5rem, идеально 4vw, макс 3rem */
  /* Без медиазапросов! */
}
Адаптивность CSS без медиазапросов: grid auto-fill minmax flex-wrap и clamp
Часть адаптивности можно сделать без @media: через auto-fill/minmax, flex-wrap и clamp().

Часто задаваемые вопросы о медиазапросах

Почему @media не работает на мобильных?

Скорее всего отсутствует тег <meta name="viewport">. Без него мобильные браузеры масштабируют страницу под «виртуальную» ширину 980px и медиазапросы не срабатывают при реальной ширине экрана. Добавь в <head>: <meta name="viewport" content="width=device-width, initial-scale=1">.

Какие breakpoints использовать в 2025 году?

Нет жёстких стандартов, но де-факто стандарт — Tailwind CSS breakpoints: 640px, 768px, 1024px, 1280px. Практический совет: не привязывайся к конкретным устройствам, а добавляй breakpoint там, где верстка «ломается». Открой сайт и плавно уменьшай окно — видишь что-то некрасивое? Вот и breakpoint. Обычно хватает 2-3 breakpoints для большинства сайтов.

Можно ли обойтись без медиазапросов?

Частично — да. CSS Grid + auto-fill + minmax() делает сетки адаптивными без медиазапросов. clamp() — адаптивная типографика. flex-wrap + flex-basis — гибкие карточки. Но для скрытия целых блоков, смены раскладки (2 колонки → 1), адаптации навигации — медиазапросы нужны. Лучший подход: сначала используй intrinsic design (Grid, clamp, flexbox), добавляй @media только когда без них не обойтись.

Оцените статью
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x