Каскад, специфичность, наследование

↑ 1.3 CSS и SASS · ← Предыдущая · → Следующая

Желательно~3 мин чтенияУровень: junior

Зачем это на собесе

«Почему мой стиль не применяется?» — вопрос про каскад. Нужно назвать порядок разрешения конфликтов.

Объяснение

Порядок разрешения конфликтов:

  1. Происхождение и важность: !important (author) > обычные author > user-agent.
  2. Слои @layer (позже объявленный слой сильнее для обычных правил).
  3. Специфичность селектора.
  4. Порядок в коде — позднее побеждает.

Специфичность (a, b, c): a — количество id, b — классов/атрибутов/псевдоклассов, c — тегов/псевдоэлементов. Inline-стиль сильнее любого селектора.

СелекторСпецифичность
p0,0,1
.card0,1,0
.card p0,1,1
#app .card1,1,0
:where(.a)0,0,0
:is(.a, #b)как самый специфичный аргумент

Наследование: часть свойств наследуется потомками (color, font-*, line-height, visibility), другие — нет (margin, padding, border, background).

Управление: inherit, initial, unset, revert, all: unset.

@layer reset, base, components, utilities;      /* явный порядок слоёв */
@layer components { .btn { padding: 8px 16px; } }
@layer utilities  { .p-0 { padding: 0; } }       /* сильнее компонентов независимо от специфичности */

Нюансы и подводные камни

  • !important ломает каскад, используйте только для утилит.
  • Вложенность в SCSS увеличивает специфичность: не вкладывайте больше 2–3 уровней.
  • Стили из <style scoped> во Vue добавляют атрибут — специфичность выше.
  • Порядок подключения файлов CSS влияет на результат.
  • Инспектор в DevTools показывает, какие правила перечёркнуты и почему.

Практика

  1. Посчитайте специфичность 5 селекторов и проверьте в DevTools.
  2. Настройте @layer для reset/base/components/utilities.
  3. Найдите и уберите !important из проекта.

Вопросы с ответами

Связанные темы