На главную

Мы долго боролись со специфичностью, но почему-то используем :root


Долгие годы фронтенд-сообщество боролось со специфичностью: выравнивали селекторы, избегали вложенности, практиковали БЭМ и «плоские деревья».

Мы ушли от

#about ul li a {
  color: rebeccapurple !important;
}

к

.about__link {
  color: rebeccapurple;
}

И всё же, когда речь заходит о кастомных свойствах, мы нередко бездумно складываем их в :root — тем самым повышая глобальную специфичность и усиливая сцепление кода, от которого сами же пытались уйти.

:root {
  --color-link: rebeccapurple;
}

.about__link {
  color: var(--color-link);
}

Моя мысль простая: необязательно класть кастомные свойства в :root. :root - это всего лишь селектор, который совпадает с html, но обладает более высокой специфичностью. Ждать, что :root превратиться в svg глупая затея, так как нет ни единой строчки в наших стилях, которые были бы готовы к такому изменению. Это звучит как оправдание использования :root.

Так зачем нам :root для кастомных свойств? Зачем повышать специфичность, если мы можем использовать html?

:root — не «магическое место для переменных», а просто избыточный выбор по умолчанию.

Мне кажется, это такой же странность, как бояться повесить класс на <html class="page">.