Ось готовий урок, створений у стилі CS50: енергійний, з аналогіями та акцентом на розумінні «чому».
🎓 Урок: CSS у великих проєктах (Архітектура та Масштабування)
Привіт! Радий бачити вас. Сьогодні ми не просто пишемо код, ми будуємо архітектуру.
Давайте почнемо з простого запитання: хто з вас коли-небудь писав CSS, а потім боявся щось змінити, бо це могло зламати щось в іншому кінці сайту? (Підніміть руку подумки ✋).
Якщо так — ви не одні. Це класична проблема масштабування. Сьогодні ми навчимося, як не перетворити наш проєкт на картковий будиночок.
1. 🔥 Вступ: Хаос у шафі
Уявіть, що ви живете самі в однокімнатній квартирі. Ваші шкарпетки лежать на стільці, футболки — на ліжку, а ключі — десь на столі. Ви точно знаєте, де що лежить. Це — ваш маленький CSS-файл на 50 рядків. Все просто.
А тепер уявіть, що ви керуєте величезним складом Amazon. Там працює 100 людей. Якщо ви просто кинете товар "на стілець", ніхто його ніколи не знайде. Або ще гірше: хтось подумає, що це сміття, і викине.
У великих проєктах CSS має дві страшні проблеми:
1. Глобальний простір імен (Global Scope): Якщо ви назвете клас .button, він застосується до всіх кнопок на сайті. І до кнопки "Купити", і до кнопки "Видалити акаунт". Ви хочете змінити одну, а ламаєте всі.
2. Війни специфічності (Specificity Wars): Це коли ви пишете div ul li a { color: red; }, щоб перебити попередній стиль, а ваш колега пише body div ul li a { color: blue !important; }. Це перетворюється на гонку озброєнь, де переможців немає.
Навіщо нам цей урок? Щоб ви могли писати CSS, який можна підтримувати роками, навіть якщо в команді 20 розробників.
2. 🧠 Теоретична база: Розділяй і володарюй
Як ми вирішуємо цю проблему? Ми перестаємо думати "сторінками" і починаємо думати "компонентами".
Що таке Компонентний підхід?
Це як LEGO. Ви не будуєте замок із суцільного шматка пластику. Ви будуєте його з маленьких цеглинок. * Кнопка — це компонент. * Картка товару — це компонент. * Меню навігації — це компонент.
Компонент має бути незалежним. Якщо ви вирвете кнопку з "шапки" сайту і вставите її в "підвал", вона має виглядати так само.
Методологія BEM (Block, Element, Modifier)
Це не технологія, це угода про іменування. Це найпопулярніший спосіб організації CSS у світі.
- Block (Блок): Це сам компонент. Незалежний контейнер.
- Приклад:
.card
- Приклад:
- Element (Елемент): Частина блоку, яка не має сенсу без нього.
- Приклад:
.card__title(два підкреслення__означають "всередині").
- Приклад:
- Modifier (Модифікатор): Варіант або стан блоку.
- Приклад:
.card--featured(два дефіси--означають "модифікація", наприклад, "важлива картка").
- Приклад:
Що треба запам’ятати залізно:
Ми намагаємося уникати вкладеності в CSS. Замість
ul li a, ми даємо класу унікальне ім'я.menu__link.
Інтуїтивно: Читаючи ім'я класу, ви повинні розуміти, де цей елемент знаходиться і що він робить, навіть не дивлячись у HTML.
3. 🧪 Приклади: Від спагеті до структури
Приклад 1: Як роблять новачки (Spaghetti CSS) ❌
Дивіться сюди. Виглядає наче нормально, правда?
/* style.css */
.article {
background: white;
}
.title { /* Занадто загальна назва! */
font-size: 20px;
color: black;
}
.button { /* Вплине на всі кнопки сайту */
background: blue;
}
Що тут не так? Якщо я додам на сторінку віджет погоди, у якого теж є .title, стилі статті і погоди перемішаються. Це катастрофа.
Приклад 2: BEM у дії ✅
Перепишемо це "по-дорослому".
<!-- HTML -->
<article class="news-card news-card--large">
<h2 class="news-card__title">Новий iPhone вийшов</h2>
<button class="news-card__btn">Читати далі</button>
</article>
/* CSS */
/* Блок */
.news-card {
background: white;
padding: 20px;
}
/* Модифікатор блоку */
.news-card--large {
font-size: 1.2em;
border: 2px solid gold;
}
/* Елемент */
.news-card__title {
font-weight: bold;
/* Ми не пишемо .news-card .title — ми даємо унікальне ім'я! */
}
/* Елемент */
.news-card__btn {
background: blue;
color: white;
}
Запитання до вас: Чому я назвав кнопку .news-card__btn, а не просто .btn?
Пауза на роздуми...
Відповідь: Тому що це кнопка, яка специфічна саме для цієї картки новини. Якщо у нас буде глобальна кнопка, ми назвемо її .btn, але для унікальних елементів ми використовуємо прив'язку до блоку.
Приклад 3: Змінні (Custom Properties) — Сила масштабу
У великому проєкті ви не пишете #007bff (синій колір) у 50 місцях. Бо коли дизайнер скаже: "Давайте зробимо сайт трохи фіолетовим", ви будете плакати.
Ви робите так:
:root {
--main-color: #007bff;
--spacing-unit: 16px;
}
.news-card__btn {
background-color: var(--main-color);
padding: var(--spacing-unit);
}
.header {
background-color: var(--main-color); /* Той самий колір! */
}
Тепер, змінивши один рядок у :root, ви змінюєте дизайн усього величезного порталу. Це магія? Ні, це інженерія.
4. 🛠 Практична частина
Прийшов час забруднити руки кодом.
Завдання 1: Рефакторинг (BEM) У вас є такий код:
<div class="profile">
<img class="photo" src="user.jpg">
<span class="name">David Malan</span>
</div>
Перепишіть класи в HTML, використовуючи методологію BEM.
Завдання 2: Створення модифікатора Додайте до вашого коду з Завдання 1 клас-модифікатор для профілю, який є "активним" (наприклад, зелена рамка навколо фото). Як ви назвете цей клас?
Завдання 3: "А що, якщо..."
Уявіть, що ви використовуєте клас .profile__name.
Що станеться, якщо ви напишете в CSS такий селектор:
.sidebar .profile__name { color: red; }
Чи це гарна ідея в рамках BEM? (Підказка: ми говорили про вкладеність).
Завдання 4: Міні-кейс
Створіть змінні CSS для "Темної теми".
1. Визначте --bg-color і --text-color для світлої теми.
2. Використайте їх для body та .card.
3. Додайте медіа-запит @media (prefers-color-scheme: dark), де змініть значення цих змінних.
5. 💡 Мислення як у розробника
Як думає Senior Frontend Developer, дивлячись на макет?
- Він не бачить сторінку. Він бачить набір прямокутників (компонентів).
- Він боїться слова
!important. Якщо вам доводиться писати!important, значить, ваша архітектура десь дала тріщину. Це як заклеювати дірку в кораблі скотчем. Працює, але ненадовго. - Він любить довгі назви класів.
.c-btn— це погано..checkout-form__submit-button— це чудово. Код читають люди, а не машини. Чим зрозуміліша назва, тим менше документації треба писати.
Типова помилка новачка: Намагатися повторити структуру HTML у CSS.
/* ❌ ПОГАНО */
.header > nav > ul > li > a { ... }
Це називається "крихкий код". Варто змінити ul на div у HTML, і весь CSS зламається.
BEM вирішує це, бо ви просто звертаєтесь до .nav__link, і йому байдуже, де він лежить.
6. 🧩 Підсумок
Сьогодні ми зробили великий крок від "кодера" до "архітектора".
- Ви зрозуміли, що глобальний простір імен — це ворог у великих проєктах.
- Ви навчилися використовувати BEM, щоб ізолювати стилі (Блок, Елемент, Модифікатор).
- Ви побачили, як CSS змінні рятують вас від рутинної роботи при редизайні.
Тепер ви можете відкрити будь-який великий сайт (наприклад, Airbnb або сайт вашого улюбленого банку), подивитися в інспектор коду і побачити там знайомі патерни: __, -- і довгі зрозумілі назви.
Що далі? Тепер, коли у нас є порядок у назвах, виникає питання: "А чи не можна писати CSS швидше? Наприклад, використовувати цикли або функції?". Спойлер: Можна. На наступному уроці ми поговоримо про SASS та препроцесори — інструменти, які роблять CSS справжньою мовою програмування.
Це був CS50. Побачимось!