Ответ 1
Не читает ли это: "Выберите все элементы
h1
, у которых есть предок, который не является элементомdiv
...?"
Это так. Но в типичном HTML-документе каждый h1
имеет по крайней мере двух предков, которые не являются элементами div
, и эти предки - это не что иное, как body
и html
.
Это проблема с попыткой фильтрации предков с помощью :not()
: он просто не работает надежно, особенно если :not()
не может быть квалифицирован каким-либо другим селектором, таким как селектор типа или селектор классов, например. .foo:not(div)
. У вас будет намного проще использовать стили для всех элементов h1
и переопределить их с помощью div h1
.
В Селекторы 4, :not()
были расширены, чтобы принимать полные комплексные селектор, содержащие комбинаторы, включая комбинатор потомков. Будет ли это реализовано в быстром профиле (и, следовательно, в CSS), еще предстоит проверить и подтвердить, но как только он будет реализован, вы сможете использовать его для исключения элементов с определенными предками. Из-за того, как работают селекторы, отрицание должно выполняться самим элементом, а не предком, чтобы надежно работать, и поэтому синтаксис будет выглядеть несколько иначе:
h1:not(div h1) { color: #900; }
Любой, кто знаком с jQuery, быстро укажет, что этот селектор работает в jQuery сегодня. Это один из различий между Selector 3 :not()
и jQuery :not()
, который Selectors 4 исправляет.