Мобильная адаптация
Сначала узкий экран, потом min-width. Сетка растёт вверх, а не ломается вниз.
also in web design and web development basics
Пишите CSS так, будто страница всегда телефон. Базовые размеры, отступы и сетка живут без медиазапроса. Когда ширины становится больше, вы добавляете правила через min-width. Узкий экран вы не «чините» в конце: он уже был правильным.
Зачем так, а не наоборот
Телефон не умеет вычитать десктоп. max-width говорит: «сначала широкая вёрстка, потом отмени её». Легко забыть отмену и получить горизонтальный скролл в руке. min-width говорит: «это уже есть на любом экране, а с такой ширины ещё вот это». Каскад совпадает с ростом окна: позже сработавший запрос перекрывает более ранний, база всегда включена.
Общий набор порогов (это не бренд, просто частые числа): 640, 768, 1024. Можно в px или в rem (1rem = 16px при корне 100%). Главное: одна единица во всех запросах, иначе порядок ломается.
Таблица ниже - пример порогов из документации Tailwind CSS, не авторская лекция. Цифры и формулировки смотрите на исходной странице.
| Префикс | Минимум | CSS |
|---|---|---|
sm | 40rem (640px) | @media (width >= 40rem) |
md | 48rem (768px) | @media (width >= 48rem) |
lg | 64rem (1024px) | @media (width >= 64rem) |
xl | 80rem (1280px) | @media (width >= 80rem) |
2xl | 96rem (1536px) | @media (width >= 96rem) |
Источник: Responsive design, Tailwind CSS. Там же соседняя тема max-width. Вместо 96rem (1536px) в учебном макете иногда берут 90rem (1440px).
Телефону нужен viewport, иначе он рисует «десктоп в лупу»:
<meta name="viewport" content="width=device-width, initial-scale=1" />База, потом пороги
.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.