Когда у вас есть селектор вида a :not(b) c
, он выбирает элементы, соответствующие c
, которые являются потомками элементов, не соответствующих b
, где последние являются потомками элементов, соответствующих a
.
Это, как правило, бесполезно, поскольку между a
и c
может быть несколько узлов, и только один из них должен соответствовать :not(b)
для выбранного элемента. Для этого требуется, чтобы по крайней мере один предок c
ниже a
не совпадал с b
- т.е. он выбирает c
, если не все предки выше a
соответствуют b
- вероятно, не то, чтовы намеревались.
Если вам нужны только элементы, которые не дочерние элементов, соответствующих b
, напишите a :not(b) > c
, чтобы использовать дочерний селектор вместо потомка селектора. Для этого родительский из c
не должен совпадать b
.
В качестве альтернативы, если :not(b)
действительно предназначен для применения к предкам, а не только к родителю, то это невообще возможно. Требуемый селектор будет выглядеть как a c:not(b *)
, соответствует c
с без предков ниже a
соответствует b
. Однако спецификация CSS запрещает использование потомков в :not()
, поэтому это не сработает. Это означает, что вы не можете использовать querySelectorAll
для выбора элементов с без предков , соответствующих b
. В качестве обходного пути вы могли бы написать вспомогательную функцию, чтобы проверить, имеет ли элемент соответствие предка b
, а затем использовать Array.filter для исключения элементов, которые выполняют.