2016-09-15 2 views
1

Я думал, что это было простое использование псевдослова: not(), но он не работает в большинстве браузеров, поэтому я сделал об этом codepen.: not() пример псевдокласса работает только в Safari

Demo example

.YYY:not(.ZZZ .YYY) {} 

Обновлено

Необходимость решения для the ниже правила CSS

.YYY:not(.AAA + .YYY) {} 
+0

Был вопрос не ответили? – Roope

ответ

2

Вот что я понимаю, кто-то поправьте меня, если я неправильно что-то.

TLDR: В соответствии со спецификацией, :not(X) принимает в качестве аргумента простого селектора, который отличается от последовательности простых селекторов. Таким образом, он даже не должен работать, и Safari просто идет против спецификации.


Spec: https://drafts.csswg.org/selectors-3/#negation

Отрицание псевдо-класс,: нет (Х), является функциональной нотации принимает простой селектор (за исключением отрицания самого псевдо-класса) в качестве аргумента.

Spec: https://drafts.csswg.org/selectors-3/#simple-selectors-dfn

Простой селектор либо селектор типа, универсальный селектор, селектор атрибута, селектор класса, селектор идентификатора, или псевдо-класса.

Комбинаторы: пробелы, «знак больше» (U + 003E,>), знак «плюс» (U + 002B, +) и «тильда» (U + 007E, ~). Между комбинатором и простыми селекторами вокруг него может появляться белое пространство. Только символы «пробел» (U + 0020), «табуляция» (U + 0009), «линия» (U + 000A), «возврат каретки» (U + 000D) и «подача формы» (U + 000C) может возникать в пробеле. Другие космические символы, такие как «em-space» (U + 2003) и «идеографическое пространство» (U + 3000), никогда не являются частью пробелов.

Элементы дерева документа, которые представлены селектором, являются объектами селектора. Селектор, состоящий из одной последовательности простых селекторов, представляет собой любой элемент, удовлетворяющий его требованиям. Превращение другой последовательности простых селекторов и комбинатора в последовательность накладывает дополнительные ограничения соответствия, поэтому субъекты селектора всегда являются подмножеством элементов, представленных последней последовательностью простых селекторов.

Обратите внимание на разницу между говорят о простого селектора и последовательности простых селекторов.

Spec: https://drafts.csswg.org/selectors-3/#changesFromCSS2

список основных определений (селектор, группы селекторов, простой селектор, и т.д.) был изменен; в частности, то, что было передано в CSS2 как простой селектор теперь называется последовательность простых селекторов, а термин «простой селектор» теперь используется для компонентов этой последовательности

0

В соответствии с CSSWG draft, то отрицательный псевдокласс принимает в качестве параметра простой селектор.

селектор представляет собой цепь из одного или более последовательностей простых селекторов, разделенных комбинаторов. Один псевдоэлемент может быть добавлен к последней последовательности простых селекторов в селекторе .

A Последовательность простых селекторов представляет собой цепочку простых селекторов, которые являются , не разделенные комбинатором. Он всегда начинается с селектора типов или универсального селектора. Никакой другой селектор или универсальный селектор не допускается в последовательности.

Простой селектор либо селектор типа, универсальный селектор, селектор атрибута, селектор класса, селектор идентификатора, или псевдо-класса.

.ZZZ .YYY является селектором, а не простой селектор, поэтому использование его в качестве параметра для отрицания псевдо-класса не поддерживается. Однако некоторые браузеры, такие как Safari, могут поддерживать его, но мы не должны рассчитывать на это.

1

В качестве альтернативы вы можете использовать это правило CSS, которое служит для

.YYY { 
    font-size: 24px; 
    text-align: center; 
} 

*:not(.ZZZ) > .YYY { 
    color:red; 
} 

Вот является codepen link

+0

Спасибо. Хотя я действительно упростил свой конкретный случай для демонстрации. Как бы вы написали это обновленное перо, чтобы заставить его работать со спецификацией? http://codepen.io/dangoodspeed/pen/ORNZxp –

+0

Ufff! Оператор '+' в 'not() + css_selector' не работает. Только> и ~ работают. Это максимум, я могу помочь вам теперь [codepen] (http://codepen.io/rajugt/pen/ALKZvZ) без оператора +. Я предлагаю вам использовать родительский класс css, как указано в приведенном выше ответе, чтобы упростить эту проблему. – rajuGT

+1

Черт. Хорошо, спасибо за вашу помощь! Надеюсь, некоторые будущие спецификации CSS3 будут работать с этими селекторами, как я их написал. Это очень удобно. –