Неделя 3 · Shelter Part 2 — Responsive (320–1280px)
🧭 ← P1 · Следующая → P3
🎯 Что строим
Берёшь Main и Pets из P1 и делаешь полностью адаптивными от 320px до 1280px. Дизайн в Figma уже есть на трёх ширинах: 1280 / 768 / 320 (artboards main-* и our-pets-*).
Бургер-меню в этой части НЕ открывается — только заменяет навигацию иконкой при <768px. Сам menu появится в P3.
🏷 Required Skills
responsive design · media queries · mobile-first · fluid layout · relative units · breakpoints · CSS Flexbox · CSS Grid
🚫 Запреты
- 🔴 Layout как screenshot —
-100 - 🔴 Запрещённые фреймворки —
-100 - 🟡 Горизонтальный скролл на любой ширине от 320 до 1280 —
-20(главное правило)
⛰ Что унаследовано из P1 (compound)
Из Shelter P1 ты уже умеешь:
- Семантический HTML + W3C-валидацию
- Figma → код (но только 1280-артборды)
- Pixel-perfect через PerfectPixel
- BEM
- Flexbox + Grid layout
- Логотип + h1 + favicon + scroll-behavior
Эта задача добавляет → media queries для трёх breakpoint'ов, mobile-first архитектуру CSS, fluid layout между breakpoint'ами, бургер-иконку (без логики).
📚 Что изучить (по порядку)
1 · Mobile-first философия
Зачем: правильный mobile-first CSS строится min-width → расширяется. Anti-pattern — писать desktop и потом «забивать» mobile через max-width. Понимание подхода = меньше CSS-кода.
Идея: базовый CSS — для самого узкого экрана (320px). Дальше через @media (min-width: 768px) { … } ДОБАВЛЯЕШЬ изменения для tablet и desktop.
Self-check: почему min-width лучше max-width в mobile-first подходе?
2 · Media queries + breakpoints
Зачем: три фиксированных точки: 1280px (desktop), 768px (tablet), 320px (mobile). Сабмит проверяется на них.
- Media queries ← главная заметка
- Grid и media queries (если каркас на Grid)
Шаблон mobile-first:
/* Базовые стили — для 320px */
.card { width: 100%; }
/* Для tablet (≥768px) — расширяем */
@media (min-width: 768px) {
.card { width: 50%; }
}
/* Для desktop (≥1280px) — расширяем */
@media (min-width: 1280px) {
.card { width: 33.33%; }
}
Self-check: в каком порядке писать media queries — от mobile к desktop или наоборот? Что произойдёт если перепутать?
3 · Viewport meta tag
Зачем: без правильного <meta name="viewport"> mobile-браузер отрендерит сайт как desktop в 980px и зашрумкает. Адаптивность не сработает вообще.
Обязательно в <head>:
<meta name="viewport" content="width=device-width, initial-scale=1.0">
Self-check: что произойдёт на iPhone если убрать viewport meta? Что значит width=device-width?
4 · Относительные единицы и fluid layout
Зачем: между breakpoint'ами (например, 800–1100px) контент должен плавно «течь», а не быть «лестницей» из ступенек.
- Viewport units —
vw,vh,vmin,vmax - Единицы измерения
- Адаптивная типографика
- min() max() clamp() ← ключевые для fluid
Современный паттерн — fluid typography:
font-size: clamp(1rem, 2vw + 0.5rem, 1.5rem);
/* минимум 1rem, идеально 2vw + 0.5rem, максимум 1.5rem */
Self-check: чем clamp отличается от media queries для font-size? Когда лучше что?
5 · No horizontal scroll (главный pitfall)
Зачем: +20 баллов и репутация. Главная причина пропадания баллов в P2.
Источники горизонтального скролла:
- Элементы с
min-widthбольше viewport (например,min-width: 350pxна экране 320px) width: 100vw+ есть scrollbar по вертикали →100vw>100%body- Не задан
overflow-x: hiddenна body (иногда нужно, но симптом проблемы, а не лечение) - Картинки/SVG без
max-width: 100%; height: auto padding/marginвpxна узких контейнерах- Длинные слова без
word-break/overflow-wrap
Проверка: в Chrome DevTools переключай Responsive mode, тяни от 320 до 1280, смотри на горизонтальный scrollbar.
Self-check: почему width: 100vw опасно? Чем width: 100% безопаснее?
6 · Адаптивные изображения и медиа
- Responsive images -- CSS подходы
- picture и srcset — если хочешь экономить трафик на mobile
- loading lazy —
loading="lazy"на не-первом экране картинок
Минимум:
img { max-width: 100%; height: auto; display: block; }
7 · Бургер-иконка (без open-логики)
Зачем: +5 за появление иконки вместо <nav> на <768px. Сам menu — в P3.
Реализация без JS:
- На широких экранах показываем
<nav>(или его меню-список) - На узких — скрываем его через
display: none, показываем бургер-иконку - Иконка обычно делается через 3
<span>или 1 SVG/inline-SVG
.burger { display: none; }
.nav-menu { display: flex; }
@media (max-width: 767px) {
.burger { display: block; }
.nav-menu { display: none; }
}
(Логика клика на бургер появится в P3 через JS.)
8 · Adaptive layout patterns
Зачем: надо знать паттерны как карточки/блоки переразлагаются на 3 ширинах.
- Flexbox -- карточная раскладка
- Grid -- карточная сетка
- auto-fill и auto-fit · repeat() -- повторение треков · minmax() -- границы размеров
- Responsive Grid без media queries — современный подход без MQ
- Flexbox -- распространённые баги и фиксы
- Flexbox -- доступность и порядок —
orderиногда меняет визуальный порядок (осторожно с a11y)
Современный Grid-паттерн (без media queries для карточек):
.grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 1rem;
}
Автоматически 1/2/3/4 колонки в зависимости от ширины.
9 · Workflow (отличие от P1)
- Создаёшь ветку
shelter-part2ИЗshelter - Работаешь, мержишь PR
shelter-part2 → shelter - Деплой gh-pages обновляется
- Открываешь PR
shelter → main(если ещё не открыт) — не мержим
См. Repo Workflow для bootcamp.
✅ Чек-лист критериев (110 баллов)
Main страница · 45
- Layout совпадает с дизайном на 1280px (
+15) - Layout совпадает с дизайном на 768px (
+15) - Layout совпадает с дизайном на 320px (
+15)
Pets страница · 15
- Layout на 1280px (
+5) - Layout на 768px (
+5) - Layout на 320px (
+5)
Responsive behavior · 50
- Нет горизонтального скролла на обоих страницах при любой ширине 320–1280 (
+20) - Layout адаптируется плавно между breakpoint'ами (нет overlap/cut-off/jump) (
+15) - Бургер-иконка появляется вместо
<nav>при <768px на обеих страницах (+5) - Markup валиден на обеих страницах по W3C (
+10)
🧠 Self-check перед коммитом
- Открыл DevTools Responsive, тянул от 320 до 1280 — есть ли где-то горизонтальный scrollbar? (Если да — лечи)
- PerfectPixel совпадение на трёх ширинах: 320 / 768 / 1280?
- Viewport meta присутствует?
- На 767px видна бургер-иконка, на 768px —
<nav>? - W3C валидация снова прошла после ресайза?
- На реальном телефоне (или эмуляторе) выглядит ок?
➡ Что переходит дальше
В P3:
- Бургер начнёт открывать меню (JS)
- Same media queries — основа для popup и слайдера
В будущем — все UI-задачи bootcamp (Podcast/NFC/Async Race) требуют responsive ≤500px.