edubun
Русский

Адаптивный дизайн и медиазапросы

Без одного метатега многие телефоны раскладывают страницу так, будто экран намного шире (MDN приводит в пример 980 пикселей), а потом уменьшают её, и медиазапрос для телефонов никогда не срабатывает.

Одна страница, любой экран

Адаптивный дизайн означает, что ты делаешь одну страницу, которая подстраивается под любой экран, от узкого телефона до широкого монитора, вместо отдельного мобильного сайта. Он держится на трёх идеях: раскладка из гибких ширин вместо фиксированных, медиафайлы, которые масштабируются внутри контейнеров, и медиазапросы, которые поправляют раскладку там, где она перестаёт работать. Flexbox и grid уже делают большую часть работы, как показали два последних урока с переносом карточек и столбцами auto-fill.

Метатег viewport

Многие телефоны отрисовывают страницы в виртуальной области просмотра шире экрана, MDN приводит в пример 980 пикселей, а затем уменьшают результат, потому что старые сайты делались для компьютеров. Странице, задуманной как адаптивная, это мешает: медиазапрос, который должен включаться при ширине меньше 600 пикселей, никогда не срабатывает, потому что браузер считает, что ширина экрана 980 пикселей. <meta name="viewport" content="width=device-width"> в head велит браузеру использовать настоящую ширину устройства в CSS-пикселях. Никогда не добавляй user-scalable=no или маленькое maximum-scale: MDN предупреждает, что запрет масштабирования отсекает людей со слабым зрением, а WCAG 1.4.4 ожидает, что текст можно увеличить до 200 процентов.

Гибкие ширины и изображения

Фиксированная ширина чаще всего вызывает горизонтальную прокрутку на телефонах. Предпочитай max-width вместо width: max-width: 70rem у обёртки страницы позволяет ей заполнить маленький экран и перестать расти на большом. Изображения по умолчанию сохраняют свой естественный размер в пикселях, поэтому фото шириной 1200 пикселей вылезает за пределы экрана в 390 пикселей. img { max-width: 100%; height: auto; } позволяет изображениям уменьшаться до размера контейнера с сохранением пропорций. WCAG 1.4.10, «Перекомпоновка», требует, чтобы содержимое работало при ширине 320 CSS-пикселей без прокрутки в двух направлениях; проверять страницу в окне шириной 320 пикселей полезно взять в привычку.

Медиазапросы

Медиазапрос оборачивает правила, которые действуют только при выполнении условия. @media (min-width: 600px) { ... } применяет свои правила, когда ширина области просмотра не меньше 600 пикселей. Обычный подход называется mobile first: сначала пишут базовые стили для узкого экрана, которые часто самые простые (один столбец, всё друг под другом), а затем добавляют запросы min-width, которые перестраивают раскладку по мере роста места. Выбирай контрольные точки там, где твоё содержимое начинает выглядеть плохо, а не угадывай популярные размеры устройств, ведь новые размеры экранов появляются каждый год. Если писать контрольные точки в em, например 40em, они ещё и реагируют, когда читатель увеличивает текст.

/* Base: one column for narrow screens */
.cols { display: grid; gap: 16px; }

/* From 600px: two columns */
@media (min-width: 600px) {
  .cols { grid-template-columns: 1fr 1fr; }
}

/* From 960px: a sidebar layout */
@media (min-width: 960px) {
  .cols { grid-template-columns: 240px 1fr 1fr; }
}
Mobile first: базовые стили, затем запросы min-width, которые добавляют столбцы.
Один и тот же HTML при 390 и 1280 пикселях: на телефоне всё друг под другом, на широком экране боковая панель и два столбца.

О чём ещё может спросить запрос

Медиазапросы проверяют не только ширину. Признаки предпочтений читателя взяты из Media Queries Level 5: (prefers-color-scheme: dark) срабатывает, когда читатель выбрал тёмную тему в операционной системе, и можно автоматически предложить тёмные цвета. (prefers-reduced-motion: reduce) срабатывает, когда читатель попросил меньше движения, часто потому, что от анимации у него кружится голова; внутри этого запроса отключай крупные перемещения и эффекты параллакса. (hover: hover) из Level 4 сообщает, может ли основной указатель наводиться на элементы, а сенсорный экран этого не может. print оформляет страницу для бумаги, например скрывает меню. Наконец, clamp() плавно задаёт размеры без запроса: font-size: clamp(1.5rem, 4vw, 2.5rem) растёт вместе с экраном, но никогда не становится меньше 1.5rem или больше 2.5rem.

Окна предпросмотра на этой странице шириной всего примерно от 340 до 530 пикселей, поэтому в упражнении ниже используется маленькая контрольная точка 300px, чтобы было видно, как она работает. На настоящем сайте выбирай контрольные точки по своему содержимому, например 600px или 40em.
адаптивный дизайнОдна страница, которая подстраивается под любой экран
область просмотра (viewport)Видимая часть страницы в браузере
width=device-widthИспользовать настоящую ширину устройства, а не виртуальные 980px
медиазапрос@media (условие) { правила }
mobile firstБазовые стили для узких экранов, затем запросы min-width
контрольная точкаШирина, при которой меняется раскладка
prefers-reduced-motionЧитатель попросил меньше анимации
clamp()Значение между минимумом и максимумом
  1. Почему без метатега viewport медиазапросы для телефонов не работают?
    • Телефон раскладывает страницу при большой виртуальной ширине
    • Телефоны игнорируют CSS
    • Медиазапросам нужен JavaScript
  2. Когда применяется @media (min-width: 600px)?
    • Когда ширина области просмотра 600px или больше
    • При ширине меньше 600px
    • Только ровно при 600px
  3. Что значит mobile first?
    • Писать базовые стили для узких экранов, а затем добавлять запросы min-width
    • Сначала сделать сайт для телефона, а сайт для компьютера потом
    • Скрывать содержимое на телефонах
  4. Какое правило не даёт большим изображениям вылезать за пределы узких экранов?
    • img { max-width: 100%; height: auto; }
    • img { width: 1200px; }
    • img { display: none; }
  5. При какой ширине WCAG 1.4.10 «Перекомпоновка» требует, чтобы содержимое работало без прокрутки в двух направлениях?
  6. Почему никогда нельзя задавать user-scalable=no?
    • Это запрещает масштабирование и отсекает людей со слабым зрением
    • Это ломает медиазапросы
    • Это недопустимый HTML
  7. Как выбирать контрольные точки?
    • Там, где содержимое начинает выглядеть плохо
    • По списку популярных телефонов
    • Всегда 768px
  8. Какой запрос срабатывает для читателей, которые попросили меньше анимации?
    • (prefers-reduced-motion: reduce)
    • (hover: none)
    • (orientation: portrait)
  9. font-size: clamp(1.5rem, 4vw, 2.5rem) на экране шириной 1600px при rem 16px. Каков размер?
  10. Зачем писать контрольные точки в em?
    • Они реагируют, когда читатель увеличивает текст
    • В медиазапросах em обязателен
    • Они быстрее загружаются
Главное
  • Добавь метатег viewport; никогда не запрещай масштабирование.
  • Гибкие ширины, max-width вместо width, img { max-width: 100%; height: auto; }.
  • Mobile first с запросами min-width в контрольных точках содержимого; а также prefers-color-scheme, prefers-reduced-motion, print и clamp().
Источники курса (6)
  • W3C CSS Working Group specifications: CSS Snapshot 2025, Selectors Level 4, CSS Cascading and Inheritance Level 5, CSS Color Level 4, CSS Values and Units Level 4, CSS Box Model Level 3, CSS Box Sizing Level 3, CSS Fonts Level 4, CSS Flexible Box Layout Level 1, CSS Grid Layout Level 2, Media Queries Level 4 and Level 5 (w3.org/TR/, checked 2026-10-17)
  • MDN Web Docs, Learn web development: CSS styling basics and CSS layout, and the CSS reference (developer.mozilla.org/en-US/docs/Learn_web_development/Core/Styling_basics, .../Core/CSS_layout, developer.mozilla.org/en-US/docs/Web/CSS, checked 2026-10-17)
  • W3C, CSS history and CSS1 Recommendation of 17 December 1996 (w3.org/Style/CSS20/history.html, w3.org/press-releases/1996/css1-rec, checked 2026-10-17)
  • W3C WCAG 2.2, success criteria 1.4.3 Contrast (Minimum)
  • 1.4.8 Visual Presentation, 1.4.10 Reflow, 1.4.12 Text Spacing (w3.org/TR/WCAG22/, checked 2026-10-17)
  • every code exercise checked with a Playwright probe against a reference solution.

Проверено: 2026-10-17