Что такое каскад (cascade) в CSS?

Ответ

Каскад (Cascade) в CSS — это алгоритм, который определяет, какое окончательное значение CSS-свойства будет применено к элементу, когда на него влияют несколько конфликтующих правил из разных источников (авторские стили, пользовательские стили, стили браузера).

Алгоритм разрешения конфликтов (в порядке приоритета):

  1. Важность (!important): Правила с !important имеют наивысший приоритет.
  2. Источник и происхождение: Порядок приоритета: !important в user-agent < авторские < !important авторские < !important пользовательские.
  3. Специфичность селектора: Вычисляется вес селектора. Порядок (от низкого к высокому):
    • Селекторы элементов (p) и псевдоэлементов (::before).
    • Селекторы классов (.class), атрибутов ([type]) и псевдоклассов (:hover).
    • Селекторы ID (#id).
    • Встроенные стили (style="").
  4. Порядок следования: Если все предыдущие критерии равны, применяется правило, объявленное последним в коде.

Пример расчета специфичности:

/* Специфичность: (0,0,1) - 1 элемент */
p { color: black; }

/* Специфичность: (0,1,0) - 1 класс */
.text { color: blue; }

/* Специфичность: (1,0,0) - 1 ID (ВЫСОЧАЙШИЙ ПРИОРИТЕТ здесь) */
#main { color: red; }

/* Специфичность: (0,1,1) - 1 класс + 1 элемент */
p.text { color: green; }

/* !important перебивает даже высокую специфичность */
.text { color: orange !important; }

Для элемента <p id="main" class="text"> цвет будет orange из-за !important.

Ответ 18+ 🔞

А, слушай, про каскад в CSS! Ну это ж, блядь, святая святых, основа основ, а половина верстальщиков про неё нихуя не помнит, пока в проекте не начнётся пиздец и стили не поползут как угорелые.

Короче, представь: на один бедный, ёбта, div сваливается куча правил — от браузера, от тебя, от какого-нибудь плагина. И все орут: «Сделай меня синим!», «Нет, красным, сука!», «А я сказал — зелёным!». Так вот каскад — это такой, блядь, верховный судья, который всех этих крикунов слушает по очереди и выносит окончательный, блядь, приговор — какого цвета будет этот самый div.

И судится он так, хитрая жопа:

  1. Сначала смотрят на кричащих истеричек. Это те, кто написал !important. У них приоритет овердохуища. Но и тут, ёпта, есть нюанс — !important от самого браузера слабее, чем твой !important, а твой слабее, чем !important, который в спец. расширении для слепых у пользователя. В общем, бардак.

  2. Потом смотрят, кто вообще пришёл. Откуда правило: от браузера (user agent), от тебя (автор) или от юзера? Обычно твои стили бьют стили браузера. Но если юзер в своих настройках написал !important — пиши пропало, его слово закон, хоть ты тресни.

  3. А вот если все без !important или оно одинаковое — начинается самое весёлое: считают «жирность» селектора, его специфичность. Это как взвешивание перед боем, блядь.

    • Лёгкий вес (0,0,1): Селекторы по тегу (p) и псевдоэлементы (::before). Ну, просто имя, нихуя.
    • Средний вес (0,1,0): Классы (.my-class), псевдоклассы (:hover), селекторы по атрибуту ([type="text"]). Уже солиднее.
    • Тяжёлый вес (1,0,0): ID (#header). Вот это уже серьёзная заявка, один такой жирдяй перевесит кучу классов.
    • Абсолютный чемпион: Встроенный стиль прямо в теге (style="color: red;"). У него вес, блядь, (1,0,0,0) — почти как ID, но ещё круче.
  4. Ну и если после всех этих танцев с бубнами два правила оказались одинаково жирными — побеждает то, которое написано в коде ПОСЛЕДНИМ. Принцип «кто последний, тот и прав». Обычно на этом все и спотыкаются, когда подключают свои стили не в том порядке.

Вот, смотри пример, чтобы не быть просто пиздаболом:

/* Специфичность: (0,0,1) - один тощий тег. Цвет чёрный. */
p { color: black; }

/* Специфичность: (0,1,0) - один упитанный класс. Цвет синий. */
.text { color: blue; }

/* Специфичность: (1,0,0) - один жирный ID. Цвет красный. */
#main { color: red; }

/* Специфичность: (0,1,1) - класс + тег. Цвет зелёный. */
p.text { color: green; }

/* А тут, блядь, истеричка с !important. Всем пизда, цвет оранжевый! */
.text { color: orange !important; }

Вот есть у нас <p id="main" class="text">. Все на него смотрят. ID говорит «красный!», связка p.text орёт «зелёный!». Но в конце приплывает второй .text с криком !important — и всем, блядь, каюк. Элемент будет оранжевым, хоть ты обосрись. Вот такая, сука, каскадная демократия.