Урок 33. Старый vs Новый: Media queries: min/max-width, ориентация и prefers-*

📁 Раздел: Адаптивная вёрстка ⏱️ Время изучения: ~75 мин 🎯 Сложность: Средняя
#media #min-width #max-width #orientation #prefers-reduced-motion #prefers-color-scheme

⚡ Кратко

Старое: ловить ширину через JS window.innerWidth или писать desktop-first и «откатывать» под мобильный. Новое: media queries и mobile-first — база для телефона, min-width усложняет под широкий экран.

1. JS вместо CSS

❌ Старый подход: следить за шириной в JavaScript

Ширину экрана отслеживали скриптом и навешивали классы. Это дёргает layout, мигает при загрузке и ломается без JS.

📄 lesson-33/old.js
if (window.innerWidth > 768) {
  document.body.classList.add('desktop');
}
// + слушатель resize, чтобы пересчитывать… и так на каждый блок

✅ Современно: media query — браузер делает это сам

CSS реагирует на ширину нативно, без JS, без мигания и без слушателей событий.

📄 lesson-33/modern.css
@media (min-width: 48rem) {
  .layout { grid-template-columns: 18rem 1fr; }
}

2. desktop-first → mobile-first

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

❌ desktop-first (база — десктоп)

📄 lesson-33/old.css
.grid { grid-template-columns: repeat(3, 1fr); } /* десктоп */

@media (max-width: 47.99rem) {        /* откат под телефон */
  .grid { grid-template-columns: 1fr; }
}

✅ mobile-first (база — телефон)

📄 lesson-33/modern.css
.grid { grid-template-columns: 1fr; }  /* телефон */

@media (min-width: 48rem) {            /* усложняем под десктоп */
  .grid { grid-template-columns: repeat(3, 1fr); }
}

Результат одинаковый, но mobile-first читается как «расту от простого к сложному». Сравните оба превью:

📱 узкий — 1 колонка

1
2
3
.grid { grid-template-columns: 1fr; }

🖥️ широкий — 3 колонки

1
2
3
@media (min-width: 48rem) {
  .grid { grid-template-columns: repeat(3, 1fr); }
}
Подробное сравнение mobile-first и desktop-first — в уроках 34 и 35.

Навигация