Неделя 1 · CSS Meme Slider

🧭 ← Roadmap · Следующая →

🎯 Что строим

Слайдер на чистом HTML+CSS — без единой строчки JavaScript. Картинки мемов с подписями + контролы навигации + плавные анимированные переходы. Работает на desktop и mobile.

📄 Полное задание на GitHub →

🏷 Required Skills (как заявлено в задании)

CSS animations · @keyframes · CSS transitions · Flexbox · CSS Grid · responsive design · media queries · pseudo-classes · relative units

🚫 Запреты (нарушишь — -100500)

Что нельзя Что вместо этого
🔴 JavaScript только HTML+CSS
🔴 CSS-фреймворки (Bootstrap, etc) чистый CSS
🔴 CSS-препроцессоры (Sass) чистый CSS
🔴 npm-пакеты ничего
🟡 position: relative/absolute/fixed/sticky только static (нормальный поток)
🟡 top / left / right / bottom transform: translate, margin
🟡 float Flexbox / Grid
🟡 псевдоэлементы (::before, ::after) только псевдо-классы
🟡 px вне media queries rem, em, %, vh, vw, fr

💡 Разрешено: reset.css / normalize.css, gif картинки, <header>/<h1>/<footer> и пр. семантические теги.


📚 Что изучить (по порядку)

⚠️ Идти строго по порядку. Каждый блок опирается на предыдущий. Не перепрыгивай — застрянешь в трюках с :checked если не понимаешь поток и комбинаторы.

📥 Что должен знать ДО старта

Это первая задача bootcamp. Если HTML/CSS вообще не трогал — сначала пройди:


1 · Блочная модель и нормальный поток

Зачем: задача требует, чтобы ВСЕ элементы остались в нормальном потоке (position: static, без float). Без понимания потока — невозможно.

Self-check: объясни словами разницу между content-box и border-box. Что произойдёт если убрать display у <div>?


2 · Селекторы и каскад

Зачем: в задаче понадобятся редкие селекторы (:checked, +, ~). Без понимания каскада не разберёшься почему один стиль не работает.

Self-check: напиши селектор: «второй <li> внутри <ul> с классом nav». Что выберет ul.nav > li + li?


3 · Layout-движок (Flexbox + Grid)

Зачем: один из них (или оба вместе) будет каркасом слайдера. Без них — inline-block и слёзы.

Flexbox (одномерный):

Grid (двумерный):

Когда что:

Self-check: что выбрать для раскладки «3 контрола в ряд» — Flexbox или Grid? А для «картинка слева, подпись справа, контролы снизу»?


4 · Относительные единицы

Зачем: задача требует везде использовать rem/em/%/vh/vw/fr. px разрешён ТОЛЬКО внутри media queries.

Шпаргалка (запомни):

Единица Относительно чего Когда
rem font-size у <html> (обычно 16px) размеры, отступы, шрифты
em font-size родителя размеры внутри компонента
% соответствующего свойства родителя ширины блоков
vh/vw 1% высоты/ширины viewport hero, full-screen
fr доля свободного места в Grid grid-template

Self-check: чем rem лучше em для глобальных размеров? Что произойдёт с 1rem если поменять font-size на <html>?


5 · Media queries (адаптив)

Зачем: mobile-версия проверяется на 500px, desktop — на 1024px. Без media queries — никак.

Self-check: напиши синтаксис media query «применить стили на экранах шириной до 500px включительно». Чем min-width лучше max-width в mobile-first подходе?


6 · Анимации и трансформации ⭐

Зачем: это сердце задачи. Все +15/+5/+5 баллов за плавные transition между слайдами/подписями.

Зачем transform вместо top/left:

  • Задача запрещает position и top/left
  • transform работает на композитном слое GPU — анимация плавная
  • Не вызывает re-layout (быстрее)

Self-check: в чём разница transition и animation? Что лучше анимировать transform: translateX чем left:?


7 · Псевдоклассы ⭐⭐⭐

Зачем: псевдокласс :checked + комбинатор ~ = главный трюк, как сделать слайдер БЕЗ JS. Тут запутаться легко — псевдо-элементы запрещены, псевдо-классы обязательны.

Полезные на эту задачу:

  • cursor — для cursor: pointer на контролах (требование задачи)
  • user-select — отключить выделение текста на контролах

Self-check: «псевдокласс :hover» и «псевдоэлемент ::before» — в чём разница на пальцах? Что произойдёт если на radio button навесить + .slide?


8 · Архитектура слайдера без JS (направление, не решение)

Зачем: к этому моменту у тебя есть все блоки. Сложи их сам.

📝 Идея направления (не код, не решение — это компоновка):

«Слайдер без JS = состояние храним в HTML. Где? В скрытом <input type="radio">. Как кликают? По <label>, связанному с input через for="". Как читаем состояние? Селектором :checked. Как влияем на другие элементы? Через комбинаторы + (следующий sibling) или ~ (любой следующий sibling).»

Дальше — ты сам собираешь:

  1. Сколько radio нужно?
  2. Где их разместить, чтобы могли «достать» до слайдов комбинаторами?
  3. Как анимировать переход — через transition на transform: translateX?
  4. Как сделать индикатор активного слайда?

⚠️ Не гугли «CSS only slider» — там готовые решения. Сделаешь сам — получишь компаунд-эффект на всю последующую CSS-карьеру.


9 · Workflow (одинаковый для всех задач)


✅ Чек-лист критериев (100 баллов)

Repository & Submission · 30

  • PR из gh-pages в main, открытый не смержен (+5)
  • Папка cssMemeSlider в gh-pages, деплой работает (+5)
  • ≥ 5 коммитов в истории (+5)
  • Коммиты по convention + timestamp в скобках (+5)
  • PR-ссылка засабмичена в rs app (+5)
  • PR description по схеме + список тестированных разрешений (+5)

Layout · 10

  • Слайдер по центру с равными margin слева/справа (+5)
  • Layout картинок/подписей/контролов как в дизайне (+5)

Animations · 20

  • Плавный animated transition между картинками (+15)
  • Animated transition между подписями (+5)

Content & Interaction · 15

  • Подписи = текст (НЕ часть картинки) (+5)
  • Кликабельная зона контрола больше визуального размера (+5)
  • Интерактивные состояния: hover, active, индикатор активного слайда, cursor (+5)

Responsive · 10

  • Mobile-версия + корректный layout (+10)

Code Quality · 15

  • Только относительные единицы (кроме px в media queries) (+5)
  • Все компоненты в нормальном потоке: position: static, без float (+5)
  • Нет псевдоэлементов (+5)

🧠 Self-check перед коммитом

Не нажимай git push, пока не сможешь ответить:

  1. Зачем transform: translateX лучше чем position: absolute; left:?
  2. Чем псевдо-класс отличается от псевдо-элемента (на пальцах)?
  3. Как :checked связан с переключением слайда?
  4. Почему я не могу использовать position: relative на этом проекте?
  5. Если я открою деплой на 320px ширины — какие компоненты могут сломаться?
  6. У меня в коммитах есть timestamp? Конвенция соблюдена?
  7. PR-description содержит список разрешений, на которых я проверял?

➡️ Что переходит в следующие задачи (compound forward)

После Slider в Shelter P1 переиспользуешь:

  • Всё из блоков 1-5 (поток, селекторы, Flexbox/Grid, единицы, media queries)
    • добавится семантика HTML и Figma

В Shelter P3:

  • Блок 7 (псевдоклассы) поможет понять как JS-event'ы дополняют CSS-стили

В Async Race:

  • Блок 6 (transform + transition) — будешь анимировать гонку машинок через transform: translateX + requestAnimationFrame

📚 Внешние ресурсы