Модуль 31

CSS архітектура та організація коду

Ось готовий урок, створений спеціально для тебе в стилі Девіда Малана. Поїхали! 🚀


🏛 Тема: CSS Архітектура та організація коду

(Або як не перетворити свій CSS на монстра, якого страшно редагувати)


1. 🔥 Вступ: Проблема та мотивація

Привіт, друзі! 👋

Уявіть, що ви вирішили побудувати невеличкий сарай для інструментів. Ви берете дошки, цвяхи, молоток — і за кілька годин все готово. Просто, швидко, працює.

А тепер уявіть, що вас попросили збудувати хмарочос. Чи можете ви просто взяти купу дощок і почати прибивати їх одна до одної хаотично? Звісно, ні! Без креслень, розподілу поверхів і чіткої системи комунікацій ваш хмарочос завалиться ще на етапі фундаменту.

У веб-розробці те саме. Коли ви пишете CSS для однієї сторінки, ви можете скинути все в один файл style.css. * Але що, коли у вас 50 сторінок? * Що, коли код пишуть 10 розробників одночасно? * Що, коли ви міняєте колір кнопки в "Кошику", а ламається верстка в "Хедері"? 😱

Це називається CSS-спагеті. Це коли ваш код настільки заплутаний, що простіше видалити все і написати заново, ніж виправити одну помилку.

Питання до вас: Чи траплялося вам дописувати !important в кінці властивості, просто щоб вона нарешті спрацювала, хоча ви не розуміли, чому вона не працює? Якщо так — вітаю, сьогодні ми це вилікуємо.

Без архітектури CSS ваш проєкт стає некерованим. З архітектурою — це конструктор LEGO, де кожна деталь ідеально підходить до іншої.


2. 🧠 Теоретична база (Як це працює "під капотом")

Архітектура CSS — це не про те, які властивості писати (color, margin), а про те, як їх називати і де зберігати.

Три кити порядку:

  1. Компонентний підхід Ми перестаємо думати "сторінками" (Головна, Контакти). Ми починаємо думати компонентами (Кнопка, Картка товару, Меню). Кнопка має виглядати однаково, де б ви її не поставили.

  2. Специфічність (Specificity) — наш ворог і друг Пам’ятаєте, що ID (#id) сильніший за клас (.class)? А вкладені селектори (.nav .list .item a) сильніші за прості?

    • Як це працює: Браузер рахує "бали" для кожного селектора. Хто має більше балів, той і застосовує стиль.
    • Проблема: Якщо ви пишете занадто складні селектори, вам потім дуже важко їх "перебити".
    • Рішення: Тримайте специфічність низькою. Використовуйте переважно класи.
  3. Методологія BEM (Block, Element, Modifier) Це золотий стандарт. Це правило іменування класів, щоб уникнути конфліктів.

    • Block (Блок): Незалежний компонент. Наприклад: .card
    • Element (Елемент): Частина блоку, яка не має сенсу окремо. Наприклад: .card__title (два підкреслення).
    • Modifier (Модифікатор): Варіація блоку (колір, розмір). Наприклад: .card--featured (два дефіси).

❗️ Що треба запам'ятати залізно: Ніколи не стилізуйте через ID (#header). Ніколи не використовуйте теги (div, span) для стилізації складних компонентів. Тільки класи!


3. 🧪 Приклади: Від хаосу до порядку

Давайте подивимось на еволюцію коду.

Приклад 1: "Як пишуть новачки" (The Bad Way ❌)

/* style.css */
div {
    background: white;
    padding: 20px;
}

#submit-btn {
    background: red;
    color: white;
}

.sidebar .menu li a {  /* Жахлива вкладеність! */
    font-size: 14px;
}

Що тут не так? * Всі div на сайті отримали стилі (катастрофа!). * Кнопку #submit-btn неможливо перевикористати, якщо нам треба така сама, але з іншим ID. * Щоб змінити колір посилання в меню, вам доведеться писати ще довшу "ковбасу" селекторів.


Приклад 2: "BEM у дії" (The Good Way ✅)

Уявіть, що ми робимо картку профілю користувача.

Питання на засипку: Як би ви назвали клас для аватарки всередині профілю? .avatar? .profile-img? А якщо аватарка буде ще десь?

Давайте використаємо BEM:

<!-- HTML -->
<article class="profile">
    <img src="user.jpg" class="profile__avatar" alt="User">
    <h2 class="profile__name">David Malan</h2>
    <!-- Кнопка - це окремий блок, вкладений сюди -->
    <button class="btn btn--primary">Follow</button>
</article>
/* CSS */

/* Блок Profile */
.profile {
    border: 1px solid #ccc;
    padding: 20px;
}

/* Елементи Profile */
.profile__avatar {
    border-radius: 50%;
    width: 100px;
}

.profile__name {
    font-size: 24px;
}

/* Блок Button (окремий, незалежний!) */
.btn {
    padding: 10px 20px;
    border: none;
    cursor: pointer;
}

/* Модифікатор Button */
.btn--primary {
    background-color: blue;
    color: white;
}

.btn--danger {
    background-color: red; /* Для кнопки видалення */
    color: white;
}

Чому це круто? Ми розірвали зв'язок між HTML-структурою та стилями. Якщо я переміщу кнопку .btn у футер, вона виглядатиме так само. Вона не залежить від батька. Це і є модульність!


Приклад 3: Організація файлів (ITCSS / 7-1 pattern)

Ви ж не зберігаєте шкарпетки, виделки та документи в одній шухляді? То чому весь CSS в одному файлі?

Як думає профі (структура папок):

sass/
|
|– base/          # Базові стилі (скидання, типографіка для body)
|   |– _reset.scss
|   |– _typography.scss
|
|– components/    # Наші BEM блоки
|   |– _buttons.scss
|   |– _card.scss
|   |– _navbar.scss
|
|– layout/        # Глобальна сітка
|   |– _header.scss
|   |– _footer.scss
|
|– main.scss      # Тут ми просто імпортуємо всі ці файли

Примітка: Навіть якщо ви пишете на чистому CSS (без Sass), логіка розділення коду на логічні частини залишається тією ж.


4. 🛠 Практична частина

Час закотити рукави! Ось ваші завдання.

Завдання 1: Рефакторинг (Виправлення імен)

Перепишіть ці класи згідно з методологією BEM. * Блок: "search-form" * Елемент: поле введення (input) всередині форми. * Елемент: кнопка пошуку всередині форми. * Модифікатор: форма у стані "активна" (відкрита).

Завдання 2: Боротьба зі специфічністю

У вас є код:

div.content .article p { color: gray; }

Як переписати цей CSS (і відповідний HTML клас), щоб зробити селектор максимально простим (один клас), але щоб стиль зберігся?

Завдання 3: "Світлофор" 🚦

Створіть універсальний компонент .alert. 1. Він має мати базові стилі (падінги, рамку). 2. Додайте модифікатори: * Успіх (зелений) * Помилка (червоний) * Попередження (жовтий) 3. Напишіть HTML код, де використовуються всі три варіанти.

Завдання 4: Міні-кейс "Інтернет-магазин"

Уявіть картку товару (product-card). У ній є: фото, ціна, стара ціна (перекреслена), кнопка "Купити". Напишіть тільки назви класів для цієї структури по BEM.

Завдання 5: А що, якщо...?

Клієнт каже: "Я хочу, щоб кнопка 'Купити' була великою на головній сторінці, але маленькою в кошику". Як ви це реалізуєте, не дублюючи код самої кнопки? (Підказка: згадайте про мікс класів або модифікатори).


5. 💡 Мислення як у розробника

Як відрізнити новачка від сеньйора, просто глянувши на CSS?

  1. Глибина вкладеності.

    • Новачок: .header .nav ul li a span { ... } (Це "пекло селекторів").
    • Профі: .nav__link-text { ... } (Швидко, чітко, браузер щасливий).
  2. Reusable vs Disposable (Багаторазове vs Одноразове). Новачок пише стилі під конкретний текст на конкретній сторінці. Профі пише "паттерни". Він бачить дизайн і думає: "О, цей заголовок такий самий, як на сторінці Про нас. Зроблю для нього спільний клас .section-title".

  3. Страх змін. Новачок боїться видалити рядок CSS, бо "раптом щось впаде". Профі не боїться, бо його компоненти ізольовані. Зміни в кнопці не зламають хедер.

Порада від Девіда:

Кожного разу, коли пишете CSS, запитуйте себе: "Якщо я скопіюю цей HTML код і вставлю його на абсолютно пусту білу сторінку, чи буде він виглядати правильно?". Якщо так — ваша архітектура чудова!


6. 🧩 Підсумок

Отже, що ми сьогодні зробили? 1. Зрозуміли, що хаос у CSS коштує грошей і нервів. 2. Вивчили BEM — мову, якою ми називаємо класи, щоб розуміти один одного. 3. Навчилися мислити компонентами, а не сторінками. 4. Зрозуміли, що плоска структура краща за глибоку вкладеність.

Тепер ви не просто "фарбуєте кнопочки". Ви архітектори інтерфейсів. Ви будуєте надійний фундамент.

🔜 У наступній серії: Тепер, коли ми вміємо гарно організовувати чистий CSS, ми дізнаємось, як пришвидшити це в 10 разів. Готуйтеся, наступна тема — CSS Препроцесори (Sass/SCSS): змінні, цикли та магія, яка робить CSS схожим на справжню мову програмування!

А поки що — це був CS50... тобто, урок з CSS архітектури. Побачимось! 👋