HTML & CSS

Вступ до CSS. Селектори та специфічність

Глибоке занурення у CSS: три способи підключення стилів, анатомія CSS-правила, типи селекторів (тегові, класи, ID, атрибутні), комбінатори, псевдокласи, псевдоелементи, каскад та специфічність.

Вступ до CSS. Селектори та специфічність

Навіщо потрібен CSS?

Відкрийте будь-який сучасний сайт — YouTube, Apple, Spotify — і поспробуйте уявити його без кольорів, шрифтів, відступів та анімацій. Що залишиться? Голий текст із посиланнями — щось схоже на веб-сторінки 1993 року. Саме CSS (Cascading Style Sheets — каскадні таблиці стилів) перетворює скелет HTML на повноцінний візуальний досвід.

У попередньому занятті ми вже бачили шматочки CSS-коду: color: red, text-decoration: line-through, background-color: #fef08a. Тепер прийшов час зрозуміти цю мову системно — від першого правила до складних механізмів каскаду.

🎨 Зовнішній вигляд

CSS керує кольорами, шрифтами, фонами, тінями — усім, як виглядає сторінка.

📐 Компонування

CSS визначає розташування елементів на екрані: сітки, колонки, центрування, відступи.

📱 Адаптивність

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

✨ Інтерактивність

CSS додає анімації, переходи, ефекти при наведенні — без жодного рядка JavaScript.

Анатомія CSS-правила

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

<h1>Привіт, CSS!</h1>
<p>Це абзац тексту, стилізований за допомогою CSS.</p>
<p class="highlight">А цей абзац — виділений.</p>
/* CSS-правило */
h1 {
    color: #1e40af;
    font-size: 2rem;
    text-align: center;
}

p {
    color: #334155;
    line-height: 1.6;
}

.highlight {
    background-color: #fef9c3;
    padding: 0.5em;
    border-left: 4px solid #f59e0b;
}
Preview

Розберемо кожну частину CSS-правила:

Loading diagram...
graph LR
    A["CSS-правило"] --> B["Селектор<br/>h1, .highlight, #id"]
    A --> C["Блок оголошень<br/>{ ... }"]
    C --> D["Оголошення 1<br/>color: #1e40af;"]
    C --> E["Оголошення 2<br/>font-size: 2rem;"]
    D --> F["Властивість<br/>color"]
    D --> G["Значення<br/>#1e40af"]
    style A fill:#3b82f6,color:#fff
    style B fill:#f59e0b,color:#fff
    style C fill:#64748b,color:#fff
    style D fill:#3b82f6,color:#fff
    style E fill:#3b82f6,color:#fff
    style F fill:#10b981,color:#fff
    style G fill:#8b5cf6,color:#fff
Селектор (Selector)
string
Вказує, до яких HTML-елементів застосовується правило. Це може бути тег (h1), клас (.highlight), ідентифікатор (#header) або складніша конструкція.
Блок оголошень (Declaration Block)
object
Фігурні дужки { } містять одне або кілька оголошень — пар «властивість: значення».
Властивість (Property)
string
Назва стильового параметра: color, font-size, margin, display тощо. CSS має понад 500 властивостей.
Значення (Value)
string
Конкретне значення властивості: red, 16px, center, #3b82f6.
Крапка з комою (;)
string
Роздільник між оголошеннями. Обов'язковий після кожного оголошення (крім останнього, але рекомендується завжди ставити).

CSS-коментарі

CSS підтримує лише один вид коментарів — блокові:

/* Це коментар. Браузер його ігнорує. */

h1 {
    color: blue; /* Колір заголовка */
    /* font-size: 3rem; — тимчасово вимкнено */
}

/*
    Багаторядковий коментар.
    Зручно для пояснення складних правил.
*/
CSS не підтримує однорядкові коментарі //, які є у JavaScript. Використання // у CSS — це помилка, яку браузер мовчки проігнорує, зламавши наступне правило.

Три способи підключення CSS до HTML

У попередній статті ми бачили ці три способи коротко. Тепер розберемо їх детально.

CSS-код виноситься в окремий файл .css, який підключається через тег <link> у <head>:

<!DOCTYPE html>
<html lang="uk">
    <head>
        <meta charset="UTF-8" />
        <title>Моя сторінка</title>
        <link rel="stylesheet" href="styles.css" />
    </head>
    <body>
        <h1>Привіт!</h1>
    </body>
</html>
styles.css
h1 {
    color: #1e40af;
    text-align: center;
}

Переваги:

  • ✅ Один CSS-файл для всіх сторінок сайту
  • ✅ Браузер кешує файл — наступні сторінки завантажуються швидше
  • ✅ Чітке розділення структури (HTML) і оформлення (CSS)
  • ✅ Легко підтримувати та змінювати стилі

Це стандарт індустрії. У реальних проєктах використовується саме цей спосіб.

На цьому курсі в прикладах ми часто використовуємо компонент ::html-preview, де CSS записаний разом із HTML. У реальних проєктах завжди виносьте CSS у зовнішній файл .css.

Типи селекторів

Селектори — це серце CSS. Вони визначають, які саме елементи будуть стилізовані. Почнемо з простих і рухатимемось до складних.

Універсальний селектор *

Селектор * вибирає абсолютно всі елементи на сторінці:

* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}
Цей прийом називається CSS Reset — скидання стандартних стилів браузера. Більшість проєктів починаються з нього, щоб HTML-елементи виглядали однаково в Chrome, Firefox, Safari.

Селектор тегу (Type Selector)

Вибирає всі елементи за іменем тегу:

<h1>Заголовок першого рівня</h1>
<p>Звичайний абзац тексту.</p>
<p>Ще один абзац тексту.</p>
<a href="#">Посилання</a>
h1 {
    color: #1e40af;
    border-bottom: 2px solid #3b82f6;
    padding-bottom: 0.5rem;
}

p {
    color: #475569;
    line-height: 1.6;
}

a {
    color: #2563eb;
    text-decoration: none;
}
a:hover {
    text-decoration: underline;
}
Preview

Особливість: селектор тегу має найнижчу специфічність. Він стилізує всі елементи цього типу — іноді це забагато.

Селектор класу . (Class Selector)

Вибирає елементи за значенням атрибута class. Це найпопулярніший тип селектора у реальних проєктах:

<p class="info">Інформаційне повідомлення.</p>
<p class="warning">Попередження! Зверніть увагу.</p>
<p class="error">Помилка! Щось пішло не так.</p>
<p>Звичайний абзац без класу.</p>

<!-- Один елемент може мати кілька класів -->
<p class="info bold">Жирне інформаційне повідомлення.</p>
.info {
    color: #1e40af;
    background-color: #dbeafe;
    padding: 0.75rem 1rem;
    border-left: 4px solid #3b82f6;
    border-radius: 4px;
    margin: 0.5rem 0;
}

.warning {
    color: #92400e;
    background-color: #fef3c7;
    padding: 0.75rem 1rem;
    border-left: 4px solid #f59e0b;
    border-radius: 4px;
    margin: 0.5rem 0;
}

.error {
    color: #991b1b;
    background-color: #fee2e2;
    padding: 0.75rem 1rem;
    border-left: 4px solid #ef4444;
    border-radius: 4px;
    margin: 0.5rem 0;
}

.bold {
    font-weight: 700;
}
Preview
Правило хорошого тону: Називайте класи за призначенням, а не за зовнішнім виглядом. .error-message — добре. .red-text — погано (бо завтра помилки можуть стати оранжевими).

Селектор ідентифікатора # (ID Selector)

Вибирає єдиний елемент із зазначеним атрибутом id:

<header id="main-header">
    <h1>Мій сайт</h1>
</header>
#main-header {
    background-color: #1e293b;
    color: #f8fafc;
    padding: 1rem 2rem;
}
Уникайте #id у CSS! Селектор #id має аномально високу специфічність, яку дуже важко перевизначити. У сучасній верстці для стилізації використовують виключно класи (.class). Ідентифікатори id залишають для JavaScript (getElementById) та якірних посилань (<a href="#section">).

Селектор атрибутів (Attribute Selector)

Вибирає елементи за наявністю або значенням атрибутів:

<input type="text" placeholder="Ваше ім'я" />
<input type="email" placeholder="email@example.com" />
<input type="password" placeholder="Пароль" />
<input type="submit" value="Відправити" />

<a href="https://google.com" target="_blank">Google (нове вікно)</a>
<a href="/about">Про нас (поточне вікно)</a>
/* Наявність атрибута */
input[type] {
    display: block;
    margin: 0.5rem 0;
    padding: 0.5rem;
    border: 1px solid #cbd5e1;
    border-radius: 4px;
    font-family: inherit;
    width: 250px;
}

/* Точне значення */
input[type="email"] {
    border-color: #3b82f6;
}

input[type="submit"] {
    background-color: #2563eb;
    color: white;
    border: none;
    cursor: pointer;
    width: auto;
    padding: 0.5rem 1.5rem;
}

/* Посилання, що відкриваються в новому вікні */
a[target="_blank"]::after {
    content: " ↗";
    font-size: 0.8em;
}

a {
    display: inline-block;
    margin: 0.5rem 0.5rem 0 0;
    color: #2563eb;
}
Preview

Усі варіанти атрибутних селекторів:

СелекторЩо вибирає
[attr]Елементи, що мають атрибут attr
[attr="value"]Точне значення
[attr~="value"]Значення як окреме слово (розділене пробілами)
[attr^="value"]Значення починається з value
[attr$="value"]Значення закінчується на value
[attr*="value"]Значення містить value
/* Посилання на PDF-файли */
a[href$=".pdf"] {
    color: #dc2626;
}

/* Посилання на зовнішні ресурси */
a[href^="https://"] {
    color: #059669;
}

Групування селекторів

Якщо кілька селекторів мають однакові стилі, їх можна об'єднати через кому:

/* ❌ Дублювання стилів */
h1 {
    font-family: 'Georgia', serif;
    color: #1e293b;
}
h2 {
    font-family: 'Georgia', serif;
    color: #1e293b;
}
h3 {
    font-family: 'Georgia', serif;
    color: #1e293b;
}

/* ✅ Групування */
h1,
h2,
h3 {
    font-family: 'Georgia', serif;
    color: #1e293b;
}
Кожен селектор у групі пишеться з нового рядка — це конвенція для читабельності. Кома між селекторами означає «або» — стилі застосуються до кожного з перелічених селекторів.

Комбінатори (Combinators)

Комбінатори дозволяють вибирати елементи залежно від їхнього розташування в DOM-дереві.

Нащадок <space> (Descendant Combinator)

Пробіл між селекторами вибирає елемент, що знаходиться всередині іншого на будь-якому рівні вкладеності:

<nav class="menu">
    <ul>
        <li><a href="#">Головна</a></li>
        <li><a href="#">Про нас</a></li>
        <li>
            <a href="#">Послуги</a>
            <ul>
                <li><a href="#">Дизайн</a></li>
                <li><a href="#">Розробка</a></li>
            </ul>
        </li>
    </ul>
</nav>
<p><a href="#">Це посилання — поза nav</a></p>
/* Всі a ВСЕРЕДИНІ .menu — на будь-якому рівні */
.menu a {
    color: #7c3aed;
    text-decoration: none;
}
.menu a:hover {
    text-decoration: underline;
}
li { margin: 0.3rem 0; }
p { margin-top: 1rem; }
Preview

Дочірній > (Child Combinator)

Символ > вибирає лише безпосередніх нащадків (дітей першого рівня):

/* Тільки прямі li в ul, а не вкладені */
ul > li {
    list-style: square;
    color: #1e40af;
}

Сусідній + (Adjacent Sibling)

Символ + вибирає елемент, який стоїть безпосередньо після іншого на тому ж рівні:

<h2>Заголовок</h2>
<p>Цей абзац одразу після h2 — отримає стиль.</p>
<p>Цей абзац — ні, бо він другий після h2.</p>
<h2>Ще заголовок</h2>
<p>І цей абзац теж отримає стиль.</p>
/* Абзац, що стоїть ОДРАЗУ після h2 */
h2 + p {
    font-size: 1.125rem;
    color: #475569;
    border-left: 3px solid #3b82f6;
    padding-left: 0.75rem;
}

h2 {
    color: #1e293b;
    margin-top: 1rem;
}
p { margin: 0.5rem 0; }
Preview

Загальний сусід ~ (General Sibling)

Символ ~ вибирає всіх братів/сестер, що стоять після зазначеного елемента:

/* ВСІ абзаци після h2 (на тому ж рівні) */
h2 ~ p {
    color: #64748b;
}

Зведена таблиця комбінаторів

КомбінаторПрикладЩо вибирає
(пробіл)div pБудь-який <p> всередині <div> (на будь-якій глибині)
>div > pТільки прямий дочірній <p> в <div>
+h2 + pПерший <p> безпосередньо після <h2>
~h2 ~ pВсі <p>, що йдуть після <h2> (на тому ж рівні)

Псевдокласи (Pseudo-classes)

Псевдокласи вибирають елементи за їхнім станом або позицією у DOM — без додавання класів у HTML.

Стани взаємодії

<a href="#" class="btn">Наведіть та натисніть</a>

<input type="text" placeholder="Натисніть для фокусу" class="input-field" />

<label class="checkbox-label">
    <input type="checkbox" /> Увімкнути сповіщення
</label>
.btn {
    display: inline-block;
    padding: 0.75rem 1.5rem;
    background-color: #2563eb;
    color: white;
    text-decoration: none;
    border-radius: 8px;
    transition: all 0.2s ease;
}

/* :hover — при наведенні миші */
.btn:hover {
    background-color: #1d4ed8;
    transform: translateY(-2px);
    box-shadow: 0 4px 12px rgba(37, 99, 235, 0.4);
}

/* :active — при натисканні */
.btn:active {
    transform: translateY(0);
    box-shadow: none;
}

.input-field {
    display: block;
    margin: 1rem 0;
    padding: 0.5rem 0.75rem;
    border: 2px solid #cbd5e1;
    border-radius: 6px;
    font-family: inherit;
    font-size: 1rem;
    outline: none;
    transition: border-color 0.2s;
    width: 280px;
}

/* :focus — коли елемент у фокусі (клік або Tab) */
.input-field:focus {
    border-color: #3b82f6;
    box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.2);
}

.checkbox-label {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    cursor: pointer;
}
Preview

Головні псевдокласи станів:

ПсевдокласКоли активний
:hoverКурсор миші над елементом
:activeЕлемент натиснутий (mouse down)
:focusЕлемент у фокусі (клік або Tab)
:focus-visibleФокус через клавіатуру (не через клік)
:visitedВідвідане посилання
:checkedУвімкнений checkbox або radio
:disabledВимкнений елемент форми

Структурні псевдокласи

Ці псевдокласи вибирають елементи за їхньою позицією серед братів/сестер:

<ul class="demo-list">
    <li>Перший елемент</li>
    <li>Другий елемент</li>
    <li>Третій елемент</li>
    <li>Четвертий елемент</li>
    <li>П'ятий елемент</li>
    <li>Шостий (останній)</li>
</ul>
.demo-list {
    list-style: none;
    padding: 0;
    margin: 0;
}
.demo-list li {
    padding: 0.5rem 1rem;
    margin: 2px 0;
    border-radius: 4px;
}

/* Перший дочірній елемент */
.demo-list li:first-child {
    background-color: #dbeafe;
    font-weight: 700;
}

/* Останній дочірній елемент */
.demo-list li:last-child {
    background-color: #dcfce7;
    font-weight: 700;
}

/* Парні елементи (2, 4, 6...) */
.demo-list li:nth-child(even) {
    background-color: #f1f5f9;
}

/* Непарні елементи (1, 3, 5...) */
.demo-list li:nth-child(odd) {
    background-color: #fff;
}
Preview

Формула nth-child():

Формула An+B дає гнучкий контроль:

СелекторЩо вибирає
:nth-child(3)Тільки третій елемент
:nth-child(odd)Непарні: 1, 3, 5, 7...
:nth-child(even)Парні: 2, 4, 6, 8...
:nth-child(3n)Кожен третій: 3, 6, 9...
:nth-child(3n+1)1, 4, 7, 10...
:nth-child(-n+3)Перші три елементи
:nth-last-child(2)Другий з кінця

Псевдоклас :not() — виключення

Вибирає елементи, що не відповідають зазначеному селектору:

/* Всі посилання без класу .btn */
a:not(.btn) {
    color: #2563eb;
    text-decoration: underline;
}

/* Всі input, крім submit */
input:not([type="submit"]) {
    border: 1px solid #e2e8f0;
}

Псевдоелементи (Pseudo-elements)

Псевдоелементи створюють віртуальні елементи, яких немає в HTML, але які можна стилізувати. Записуються з подвійним двокрапком ::.

<p class="quote">Простота — найвища форма витонченості.</p>

<ul class="custom-list">
    <li>Вивчити CSS селектори</li>
    <li>Зрозуміти специфічність</li>
    <li>Попрактикуватись</li>
</ul>
/* ::before — віртуальний елемент ПЕРЕД вмістом */
.quote::before {
    content: "«";
    font-size: 2rem;
    color: #3b82f6;
    font-weight: 700;
    margin-right: 0.25rem;
}

/* ::after — віртуальний елемент ПІСЛЯ вмісту */
.quote::after {
    content: "»";
    font-size: 2rem;
    color: #3b82f6;
    font-weight: 700;
    margin-left: 0.25rem;
}

.quote {
    font-style: italic;
    font-size: 1.2rem;
    color: #334155;
}

/* Кастомні маркери списку */
.custom-list {
    list-style: none;
    padding: 0;
}
.custom-list li {
    padding: 0.4rem 0;
    padding-left: 1.5rem;
    position: relative;
}
.custom-list li::before {
    content: "✅";
    position: absolute;
    left: 0;
}

/* ::first-line — перший рядок тексту */
.quote::first-line {
    font-weight: 700;
}
Preview

Основні псевдоелементи:

ПсевдоелементЩо робить
::beforeВставляє вміст перед елементом
::afterВставляє вміст після елемента
::first-lineСтилізує перший рядок тексту
::first-letterСтилізує першу літеру тексту
::placeholderСтилізує placeholder у <input>
::selectionСтилізує виділений користувачем текст
::before та ::afterобов'язково потребують властивість content. Без неї — псевдоелемент не з'явиться. Навіть якщо вміст порожній, потрібно вказати content: "".

Каскад (Cascade)

У назві CSS — Cascading Style Sheets — каховане ключове слово. Каскад — це алгоритм, за яким браузер визначає, яке правило «перемагає», коли кілька правил конфліктують.

Три стовпи каскаду

Loading diagram...
graph TD
    A["Який стиль застосувати?"] --> B["1. Джерело<br/>(Origin)"]
    A --> C["2. Специфічність<br/>(Specificity)"]
    A --> D["3. Порядок<br/>(Order)"]
    B --> B1["Браузерні стилі"]
    B --> B2["Авторські стилі"]
    B --> B3["!important"]
    C --> C1["Вага селектора<br/>(id, class, tag)"]
    D --> D1["Останнє оголошення перемагає"]
    style A fill:#3b82f6,color:#fff
    style B fill:#f59e0b,color:#fff
    style C fill:#10b981,color:#fff
    style D fill:#8b5cf6,color:#fff

1. Джерело стилів (Origin): Стилі браузера (user-agent) < стилі автора < !important.

2. Специфічність (Specificity): Якщо два правила з одного джерела — перемагає правило з вищою специфічністю (вагою селектора).

3. Порядок (Order): Якщо специфічність однакова — перемагає правило, записане останнім у коді.

Порядок оголошення

<p class="text">Якого кольору буде цей абзац?</p>
.text {
    color: blue;
}

/* Це правило оголошене ПІЗНІШЕ — воно перемагає */
.text {
    color: green;
}
Preview

Обидва правила мають однакову специфічність (один клас). Тому перемагає правило, записане другим — текст буде зеленим.


Специфічність (Specificity)

Специфічність — це числова вага селектора. Браузер порівнює ваги, щоб визначити, яке правило застосувати.

Алгоритм підрахунку

Специфічність записується як чотири числа: (інлайн, ID, клас, тег)

Крок 1: Рахуємо інлайн-стилі

Якщо стиль заданий через атрибут style="" — він отримує вагу (1, 0, 0, 0). Це найвища специфічність (крім !important).

Крок 2: Рахуємо ID-селектори

Кожен #id у селекторі додає (0, 1, 0, 0).

Крок 3: Рахуємо класи, псевдокласи, атрибутні селектори

Кожен .class, :hover, [type="text"] додає (0, 0, 1, 0).

Крок 4: Рахуємо теги та псевдоелементи

Кожен div, p, ::before додає (0, 0, 0, 1).

Таблиця прикладів

СелекторСпецифічністьПояснення
p0,0,0,11 тег
.info0,0,1,01 клас
p.info0,0,1,11 клас + 1 тег
#header0,1,0,01 ID
#header .nav a0,1,1,11 ID + 1 клас + 1 тег
div#main p.text:hover0,1,2,21 ID + 2 (клас + псевдоклас) + 2 теги
style="color: red"1,0,0,0Інлайн — найвища

Специфічність у дії

<div id="container">
    <p class="text special">Якого кольору буде цей текст?</p>
</div>
/* Специфічність: 0,0,0,1 */
p {
    color: gray;
}

/* Специфічність: 0,0,1,0 — вище ніж тег */
.text {
    color: blue;
}

/* Специфічність: 0,0,2,0 — вище ніж один клас */
.text.special {
    color: green;
}

/* Специфічність: 0,1,0,1 — ID перемагає всі класи */
#container p {
    color: red;
}
Preview

Текст буде червоним, бо #container p (0,1,0,1) має найвищу специфічність серед усіх правил.

!important — ядерна зброя CSS

Оголошення з !important перевизначає будь-яку специфічність:

p {
    color: red !important; /* Перемагає навіть #id */
}

#container p {
    color: blue; /* Програє, незважаючи на ID */
}
Ніколи не використовуйте !important у повсякденному коді. Це як «пожежний вихід» — інструмент для крайніх випадків (наприклад, перевизначення стилів сторонньої бібліотеки). Кожне !important робить код важчим для підтримки, бо єдиний спосіб перевизначити !important — це інше !important з вищою специфічністю.

Спадкування (Inheritance)

Деякі CSS-властивості автоматично передаються від батька до дітей у DOM-дереві. Це називається спадкуванням.

<div class="parent">
    <h2>Заголовок</h2>
    <p>Абзац <span>з вкладеним span</span> тексту.</p>
    <ul>
        <li>Пункт 1</li>
        <li>Пункт 2</li>
    </ul>
</div>
/* Стилі font та color УСПАДКОВУЮТЬСЯ дочірніми елементами */
.parent {
    font-family: 'Georgia', serif;
    color: #1e293b;
    line-height: 1.7;
    font-size: 1.05rem;
}

/* border, padding, margin — НЕ УСПАДКОВУЮТЬСЯ */
.parent {
    border: 2px solid #94a3b8;
    padding: 1rem;
    border-radius: 8px;
}

h2 { margin-top: 0; }
Preview

Що успадковується:

  • Текстові: color, font-family, font-size, font-weight, line-height, text-align, letter-spacing
  • Списки: list-style-type, list-style-position
  • Курсор: cursor, visibility

Що НЕ успадковується:

  • Блокова модель: margin, padding, border, width, height
  • Фон: background-color, background-image
  • Позиціонування: position, top, left, z-index
  • Flexbox/Grid: display, flex, grid
Якщо потрібно примусово успадкувати значення, використовуйте ключове слово inherit:
.child {
    border: inherit; /* Бере значення border від батька */
}

Практичні завдання

Рівень 1 — Базовий

Рівень 2 — Логіка та комбінування

Рівень 3 — Створення з нуля


Підсумок

🎯 Селектори

CSS-селектори вибирають HTML-елементи для стилізації. Основні типи: тег (p), клас (.info), ID (#header), атрибут ([type="text"]).

🔗 Комбінатори

Комбінатори визначають зв'язок між селекторами: нащадок ( ), дочірній (>), сусідній (+), загальний сусід (~).

⚡ Псевдокласи

:hover, :focus, :nth-child(), :not() — вибирають елементи за станом або позицією без HTML-класів.

⚖️ Специфічність

Вага селектора визначає пріоритет: inline > #id > .class > tag. Уникайте !important — використовуйте точніші селектори.

Корисні посилання

  • 📖 MDN — CSS Selectors — повний довідник селекторів
  • 🎮 CSS Diner — інтерактивна гра для вивчення CSS-селекторів
  • ⚖️ Specificity Calculator — калькулятор специфічності
  • 📐 W3C CSS Specification — офіційна специфікація
  • 🎨 Can I Use — підтримка CSS-властивостей браузерами
Copyright © 2026