Ось готовий урок у стилі CS50, адаптований під тему UI-компоненти.
🎓 CS50-Style: Buttons, Cards та Магія UI-компонентів
Привіт, друзі! Радий бачити вас.
Сьогодні ми не просто пишемо код. Ми збираємося навести лад у хаосі.
1. 🔥 Вступ: Чому Copy-Paste — це зло?
Уявіть собі ситуацію. Ви будуєте наступний великий стартап — скажімо, аналог Airbnb. У вас на сайті є 5,000 оголошень про оренду квартир. Кожне оголошення має фото, ціну, заголовок і кнопку «Забронювати».
Ви, як старанний новачок, берете HTML-код для однієї квартири... і копіюєте його 5,000 разів. Працює? Працює.
Але тут приходить дизайнер і каже: "Слухай, а давай зробимо ціну червоною, а кнопку — круглою?"
Риторичне запитання: Що ви будете робити? 1. Підете у всі 5,000 місць і будете вручну змінювати код (і витратите на це тиждень)? 2. Чи, можливо, є спосіб змінити це в одному місці, і воно магічним чином оновиться скрізь?
Якщо ви обрали варіант №2 — вітаю, ви почали мислити як інженер.
Аналогія: Уявіть, що ви будуєте дім із LEGO. У вас є стандартні цеглинки (2x4, 1x2). Вам не потрібно щоразу відливати пластик, щоб створити нову деталь. Ви берете готову деталь (компонент) і використовуєте її. * Кнопка (Button) — це проста цеглинка. * Картка (Card) — це вже зібраний блок із кількох цеглинок (стіна з вікном).
Сьогодні ми навчимося створювати власні "LEGO-деталі" для вебу.
2. 🧠 Теоретична база: Атоми та Молекули
У розробці інтерфейсів є концепція, яку ми називаємо "Атомарний дизайн" (Atomic Design). Не лякайтеся назви, все просто:
- Атоми: Це найдрібніші неподільні елементи. Наприклад: Кнопка, Іконка, Поле вводу. Самі по собі вони прості.
- Молекули: Це група атомів, які працюють разом. Наприклад: Картка товару (картинка + заголовок + ціна + кнопка).
Як це працює "під капотом"?
Коли браузер бачить ваш код, він шукає Класи (Classes).
Клас — це ваш контракт із браузером. Ви кажете: "Дивись, усе, що має ім'я .btn, має бути зеленим і з заокругленими кутами".
Ось що треба запам’ятати залізно: * Reusability (Повторне використання): Ми пишемо CSS один раз, а використовуємо HTML-клас скільки завгодно. * Consistency (Узгодженість): Всі кнопки на сайті виглядають однаково. Користувач не плутається.
Інтуїтивно: Думайте про класи як про уніформу. Одягнув форму поліцейського — ти поліцейський. Одягнув клас .card — ти картка.
3. 🧪 Приклади: Від простого до складного
Давайте перейдемо до коду.
Рівень 1: Його Величність Кнопка (Atom)
Ми хочемо кнопку, яка виглядає клікабельною.
Що ви очікуєте побачити? Напевно, якийсь фон, білий текст і відступи, щоб текст не прилипав до країв.
<!-- HTML -->
<button class="btn btn-primary">Купити</button>
<button class="btn btn-danger">Видалити</button>
/* CSS */
/* Базовий стиль для всіх кнопок */
.btn {
padding: 10px 20px; /* Дихання для тексту */
border: none; /* Прибираємо стандартну рамку */
border-radius: 5px; /* Заокруглення - це модно */
font-weight: bold;
cursor: pointer; /* Курсор стає ручкою */
transition: opacity 0.2s; /* Плавність при наведенні */
}
/* Модифікатори кольору */
.btn-primary {
background-color: #007bff; /* Синій */
color: white;
}
.btn-danger {
background-color: #dc3545; /* Червоний */
color: white;
}
/* Ефект наведення (всім кнопкам) */
.btn:hover {
opacity: 0.8;
}
Чому так?
Ми розділили логіку. .btn відповідає за форму та розмір (скелет), а .btn-primary — за "шкіру" (колір). Це дозволяє нам мати 10 видів кнопок, не переписуючи код для відступів.
Рівень 2: Картка товару (Molecule)
Тепер складніше. Зберемо картку.
Що очікуємо? Контейнер з рамкою, всередині картинка, під нею текст і наша кнопка з попереднього прикладу.
<div class="card">
<img src="sneakers.jpg" alt="Кросівки" class="card-img">
<div class="card-body">
<h3 class="card-title">Nike Air Max</h3>
<p class="card-price">$120</p>
<!-- Використовуємо наш АТОМ тут! -->
<button class="btn btn-primary">У кошик</button>
</div>
</div>
.card {
width: 300px;
border: 1px solid #ddd; /* Тонка рамка */
border-radius: 8px;
overflow: hidden; /* Щоб картинка не вилазила за кути */
box-shadow: 0 4px 6px rgba(0,0,0,0.1); /* Тінь для глибини */
font-family: sans-serif;
}
.card-img {
width: 100%; /* Картинка займає всю ширину картки */
height: 200px;
object-fit: cover; /* Обрізати, але не розтягувати */
}
.card-body {
padding: 15px; /* Відступи всередині картки */
}
.card-title {
margin: 0 0 10px 0;
}
Пояснення:
Бачите магію? Ми вставили кнопку .btn всередину картки. Якщо ми змінимо дизайн кнопки в CSS, вона оновиться і в картці, і в шапці сайту, і в підвалі. Це і є сила компонентів.
4. 🛠 Практична частина
Прийшов час забруднити руки кодом! Відкрийте свій редактор (CodePen, VS Code або просто блокнот).
Завдання 1: Реплікація
Скопіюйте код кнопки та картки. Створіть три картки поряд (просто скопіюйте блок div.card тричі). Переконайтеся, що вони відображаються.
Завдання 2: Варіативність (Ghost Button)
Створіть новий клас для кнопки .btn-outline.
Вона повинна мати прозорий фон, синю рамку і синій текст. При наведенні (:hover) вона має ставати синьою з білим текстом.
Підказка: використовуйте border, background-color: transparent.
Завдання 3: "Розпродаж"
Додайте в HTML картки новий елемент — бейдж "SALE".
Він має бути маленьким, червоним, у правому верхньому куті картки або біля ціни. Напишіть для нього клас .badge.
Завдання 4: Міні-кейс
Уявіть, що ви робите список треків для Spotify.
Створіть компонент "Рядок треку" (track-row).
Він має містити:
1. Номер (1, 2, 3...)
2. Назву пісні
3. Тривалість (3:45)
Зробіть так, щоб при наведенні мишкою на весь рядок, його фон ставав світло-сірим.
5. 💡 Мислення як у розробника
Як відрізнити новачка від профі, глянувши на цей код?
-
Жорсткі значення (Hardcoding).
- Новачок: Пише
width: 300pxдля кнопки. Якщо текст "Купити зараз зі знижкою" не влазить — кнопка ламається. - Профі: Використовує
padding, дозволяючи контенту диктувати розмір. Кнопка "дихає".
- Новачок: Пише
-
Назви класів.
- Новачок: Називає класи
.red-box,.big-text. - Профі: Називає класи за призначенням, а не виглядом:
.alert-error,.hero-title. Чому? Бо завтра дизайнер скаже зробити помилку помаранчевою. Клас.red-box, який став помаранчевим — це шизофренія в коді.
- Новачок: Називає класи
-
Вкладеність. Не робіть залежності занадто сильними. Кнопка має працювати сама по собі, а не тільки коли вона всередині картки.
Порада: Завжди запитуйте себе: "Якщо я скопіюю цей шматок HTML на іншу сторінку, він виглядатиме нормально?" Якщо так — ви створили хороший компонент.
6. 🧩 Підсумок
Ну що, підсумуємо?
Сьогодні ми не просто навчилися малювати квадратики. Ми навчилися архітектурі. 1. Ми розбили складний інтерфейс на прості компоненти (кнопки, картки). 2. Ми зрозуміли, що зміна в одному місці CSS впливає на весь проєкт (і це чудово). 3. Ви створили свій перший набір UI-елементів (UI Kit).
Тепер ви вмієте: створювати масштабовані елементи інтерфейсу, які не соромно показати в реальному проєкті.
🔍 Що далі? Зараз наші картки стоять одна під одною, як солдати. А як вибудувати їх у гарну сітку, як в Instagram? Як зробити так, щоб на телефоні було по одній картці, а на комп'ютері — по три? На наступному уроці ми познайомимося з Flexbox та Grid — магією, що керує простором.
А поки що — це був CS50. (Умовно 😉) Практикуйтеся!