Подтвердить что ты не робот

Является ли: не псевдокласс повышением специфичности селектора?

Я читал о трюках css, которые: не следует добавлять дополнительную специфичность. Но похоже ли это?

https://css-tricks.com/almanac/selectors/n/not/

Специфика класса: not pseudo - это специфика его аргумента. Класс: not() pseudo не добавляет специфичности селектора, в отличие от других псевдоклассов.

Или я что-то не хватает?

.red:not(.blue) {
  background: blue;
}

.red {
  height: 100px;
  width: 100px;
  background: red;
}
<div class="red">
</div>
4b9b3361

Ответ 1

Да, это добавляет специфика его аргумента. Посмотрите на первое предложение:

Специфика класса: not pseudo - это специфика его аргумента.. Псевдокласс: not() не добавляет специфичности селектора, в отличие от других псевдоклассов.

Таким образом, спецификация .red:not(.blue) равна характеристике селекторов класса .red.blue - 2 или (0, 2, 0), что делает его более конкретным, чем .red самостоятельно. Второе предложение означает, что сам :not() не вносит дополнительной специфичности псевдокласса, чтобы сделать его (0, 3, 0), например, как :hover in .red.blue:hover.

Ответ 2

Селектор :not не имеет собственной специфичности, однако селектор внутри :not() действительно имеет.

Из MDN

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

Следующий список типов селекторов - это увеличение специфичности:

  • Селектора типов (например, h1) и псевдоэлементы (например, :before).
  • Селектора классов (например, .example), селектора атрибутов (например, [type="radio"]) и псевдоклассы (например, :hover).
  • ID селектора (например, #example).

Универсальный селектор (*), комбинаторы (+, >, ~, ' ') и псевдо-класс отрицания (:not()) не влияют на специфичность. (Однако селекторы, объявленные внутри :not(), делают.)


Поскольку у вас есть правило .red:not(.blue), а элемент <div class="red"> не имеет класса blue, это правило применяется.

.red:not(.blue) {
  background: blue;
}

.red {
  height: 100px;
  width: 100px;
  background: red;
}
div {
  background: green;
  width: 50px;
  height: 50px;
  margin: 10px;
}
<div></div>
<div class="red"></div>
<div class="blue"></div>