Skip to content

Мобильная адаптация

Сначала узкий экран, потом min-width. Сетка растёт вверх, а не ломается вниз.

also in web design and web development basics

On this page

Пишите CSS так, будто страница всегда телефон. Базовые размеры, отступы и сетка живут без медиазапроса. Когда ширины становится больше, вы добавляете правила через min-width. Узкий экран вы не «чините» в конце: он уже был правильным.

Зачем так, а не наоборот

Телефон не умеет вычитать десктоп. max-width говорит: «сначала широкая вёрстка, потом отмени её». Легко забыть отмену и получить горизонтальный скролл в руке. min-width говорит: «это уже есть на любом экране, а с такой ширины ещё вот это». Каскад совпадает с ростом окна: позже сработавший запрос перекрывает более ранний, база всегда включена.

Общий набор порогов (это не бренд, просто частые числа): 640, 768, 1024. Можно в px или в rem (1rem = 16px при корне 100%). Главное: одна единица во всех запросах, иначе порядок ломается.

Таблица ниже - пример порогов из документации Tailwind CSS, не авторская лекция. Цифры и формулировки смотрите на исходной странице.

ПрефиксМинимумCSS
sm40rem (640px)@media (width >= 40rem)
md48rem (768px)@media (width >= 48rem)
lg64rem (1024px)@media (width >= 64rem)
xl80rem (1280px)@media (width >= 80rem)
2xl96rem (1536px)@media (width >= 96rem)

Источник: Responsive design, Tailwind CSS. Там же соседняя тема max-width. Вместо 96rem (1536px) в учебном макете иногда берут 90rem (1440px).

Телефону нужен viewport, иначе он рисует «десктоп в лупу»:

head.html
<meta name="viewport" content="width=device-width, initial-scale=1" />

База, потом пороги

mobile-first.css
.cards {
  display: grid;
  gap: 12px;
  grid-template-columns: 1fr;
}
 
@media (min-width: 640px) {
  .cards {
    grid-template-columns: 1fr 1fr;
  }
}
 
@media (min-width: 768px) {
  .cards {
    gap: 16px;
  }
}
 
@media (min-width: 1024px) {
  .cards {
    grid-template-columns: 1fr 1fr 1fr;
  }
}

На 390px работает только первый блок. На 700px уже база и 640. На 1100px все четыре. Правило на 1024 не выключает 640: колонок три, потому что оно позже и конкретнее по каскаду.

Не пишите «только для мобильного» через min-width: 640px. Этот запрос как раз не про узкий экран.

Живая ширина

Тяните край макета или ползунок до конца шкалы. Макет меняет ширину, без scale. Карточки магазина: minmax(0, 1fr), длинный артикул не стопорит ресайз. Подсветка кода: какой фрагмент сейчас действует.

Ширина макета в виджете, не окна сайта

390px / 1 кол.

Витрина

1 колонка

Наушники Sable

Bluetooth, 32 ч

4 890 ₽

Лампа Halo

2700 K, USB-C

2 140 ₽

Клавиатура

SKU-VERYLONGUNBROKENTOKEN

7 200 ₽

Мышь Trace

8000 DPI

1 890 ₽

Часы Field

сталь, 40 мм

9 400 ₽

Наушники провод

3.5 мм

1 250 ₽

.cards { display: grid; gap: 12px; grid-template-columns: 1fr; }

@media (min-width: 640px) { .cards { grid-template-columns: 1fr 1fr; } }

@media (min-width: 768px) { .cards { gap: 16px; } }

@media (min-width: 1024px) { .cards { grid-template-columns: 1fr 1fr 1fr; } }

Высоту экрана (vh / viewport height, svh / small viewport height) смотрите в единицах. Ряды и fr (fraction) - в Grid.