Урок 15

День 15 | Медиа-запросы и адаптивность

55 мин

Что такое адаптивный дизайн?

Адаптивный дизайн (responsive design) — это подход, при котором сайт автоматически подстраивается под размер экрана устройства. Один и тот же сайт хорошо выглядит и на компьютере, и на планшете, и на телефоне.

Зачем это нужно?

  • Больше половины пользователей заходят с мобильных устройств
  • Google отдаёт предпочтение адаптивным сайтам в поиске
  • Лучший пользовательский опыт на всех устройствах

Медиа-запросы (@media)

Медиа-запросы позволяют применять стили в зависимости от характеристик устройства (ширина экрана, тип устройства и т.д.).

Базовый синтаксис

@media (max-width: 768px) {
  /* Стили для экранов меньше 768px */
  .container {
    padding: 10px;
  }
}

Разберём:

  • @media — начало медиа-запроса
  • (max-width: 768px) — условие (ширина экрана меньше или равна 768px)
  • Внутри фигурных скобок — стили, которые применяются при выполнении условия

Типы условий

/* Ширина меньше или равна */
@media (max-width: 768px) { }

/* Ширина больше или равна */
@media (min-width: 768px) { }

/* Диапазон ширины */
@media (min-width: 768px) and (max-width: 1024px) { }

/* Высота экрана */
@media (max-height: 600px) { }

/* Ориентация */
@media (orientation: landscape) { } /* Альбомная */
@media (orientation: portrait) { }   /* Портретная */

Breakpoints (точки перелома)

Breakpoints — это стандартные размеры экранов, при которых меняется макет. Обычно используют:

// В _variables.scss
$breakpoint-mobile: 768px;   // Мобильные
$breakpoint-tablet: 1024px;  // Планшеты
$breakpoint-desktop: 1280px; // Десктопы

Использование:

@media (max-width: $breakpoint-mobile) {
  /* Стили для мобильных */
}

@media (min-width: $breakpoint-tablet) {
  /* Стили для планшетов и больше */
}

Mobile-first подход

Mobile-first означает, что мы сначала пишем стили для мобильных устройств, а затем расширяем их для больших экранов.

/* Базовые стили (для мобильных) */
.container {
  padding: 15px;
  font-size: 14px;
}

/* Планшеты и больше */
@media (min-width: 768px) {
  .container {
    padding: 30px;
    font-size: 16px;
  }
}

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

Преимущества mobile-first:

  • Меньше CSS для мобильных (быстрее загрузка)
  • Проще расширять, чем сжимать
  • Соответствует реальности (большинство пользователей на мобильных)

Desktop-first подход

Desktop-first — противоположный подход: сначала стили для десктопов, потом уменьшаем для мобильных.

/* Базовые стили (для десктопов) */
.container {
  padding: 40px;
  max-width: 1200px;
}

/* Планшеты и меньше */
@media (max-width: 1024px) {
  .container {
    padding: 30px;
  }
}

/* Мобильные */
@media (max-width: 768px) {
  .container {
    padding: 15px;
  }
}

Когда использовать: Если дизайн создавался сначала для десктопа, проще адаптировать desktop-first.

Адаптация навигации

На мобильных обычно используют бургер-меню вместо обычного горизонтального меню:

Адаптация Grid и Flexbox

Flexbox

.cards {
  display: flex;
  gap: 20px;
  flex-wrap: wrap;
}

.card {
  flex: 1 1 300px; /* Минимум 300px, растягивается */
}

/* Мобильные */
@media (max-width: 768px) {
  .card {
    flex: 1 1 100%; /* Полная ширина на мобильных */
  }
}

CSS Grid

.grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 20px;
}

/* Планшеты */
@media (max-width: 1024px) {
  .grid {
    grid-template-columns: repeat(2, 1fr);
  }
}

/* Мобильные */
@media (max-width: 768px) {
  .grid {
    grid-template-columns: 1fr; /* Одна колонка */
  }
}

Адаптивная типографика

Размеры шрифтов тоже нужно адаптировать:

h1 {
  font-size: 28px; /* Мобильные */
}

@media (min-width: 768px) {
  h1 {
    font-size: 36px; /* Планшеты */
  }
}

@media (min-width: 1024px) {
  h1 {
    font-size: 48px; /* Десктопы */
  }
}

Или используя clamp() (современный способ):

h1 {
  font-size: clamp(28px, 5vw, 48px);
  /* Минимум 28px, идеал 5vw, максимум 48px */
}

Viewport meta tag

Важно! В <head> должен быть правильный viewport meta tag:

<meta name="viewport" content="width=device-width, initial-scale=1.0">

Без этого тега медиа-запросы могут работать неправильно на мобильных!

Практическое задание

  1. Создайте адаптивную навигацию (бургер-меню на мобильных)
  2. Адаптируйте Grid или Flexbox сетку (3 колонки → 2 → 1)
  3. Измените размеры шрифтов для разных экранов
  4. Адаптируйте отступы (padding, margin)
  5. Протестируйте на разных размерах экрана (DevTools в браузере)

Container Queries (современный подход)

Container Queries — это революционная фича CSS, которая позволяет применять стили в зависимости от размера контейнера, а не всего экрана. Это стандарт 2024-2026 годов!

Проблема с Media Queries

Media Queries реагируют на размер всего экрана. Но что если компонент должен адаптироваться к размеру своего контейнера, а не экрана?

Пример проблемы: У вас есть карточка товара. На десктопе она в сайдбаре (узкая), на мобильном — в основной колонке (широкая). С Media Queries сложно сделать так, чтобы карточка адаптировалась к ширине контейнера, а не экрана.

Решение: Container Queries

Container Queries позволяют применять стили в зависимости от размера родительского контейнера!

/* 1. Объявляем контейнер */
.card-container {
  container-type: inline-size;
  /* или container-type: size; (для ширины и высоты) */
}

/* 2. Используем @container вместо @media */
.card {
  padding: 20px;
  font-size: 16px;
}

/* Если контейнер уже 400px */
@container (max-width: 400px) {
  .card {
    padding: 15px;
    font-size: 14px;
  }
}

/* Если контейнер уже 300px */
@container (max-width: 300px) {
  .card {
    padding: 10px;
    font-size: 12px;
  }
}

Именованные контейнеры

/* Объявление именованного контейнера */
.sidebar {
  container-type: inline-size;
  container-name: sidebar;
}

/* Использование с именем */
@container sidebar (max-width: 300px) {
  .card {
    /* Стили для карточек в sidebar */
  }
}

Поддержка браузерами

Container Queries поддерживаются в:

  • ✅ Chrome 105+ (с 2022 года)
  • ✅ Firefox 110+ (с 2023 года)
  • ✅ Safari 16.0+ (с 2022 года)
  • ✅ Edge 105+

Вывод: Container Queries — это будущее адаптивности! Используйте их для адаптации компонентов к размеру контейнера, а Media Queries — для адаптации к размеру экрана.

Когда использовать что?

  • Media Queries — для адаптации к размеру экрана (навигация, общий макет)
  • Container Queries — для адаптации компонентов к размеру контейнера (карточки, виджеты)

Что дальше?

Отлично! Теперь вы знаете и Media Queries, и Container Queries. В следующих уроках мы будем верстать реальные блоки, применяя все изученные техники.

Мы используем файлы cookie для улучшения работы сайта и персонализации контента. Продолжая использовать сайт, вы соглашаетесь с использованием cookies в соответствии с нашей Политикой конфиденциальности.