CSS псевдокласс: not () для родительских элементов / элементов-предков - PullRequest
59 голосов
/ 16 августа 2011

Это сводит меня с ума:

HTML:

<div><h1>Hello World!</h1></div>

CSS:

*:not(div) h1 { color: #900; }

Разве это не читается как "Выбрать все элементы h1, у которых есть предок, который не является элементом div ...?" Таким образом, «Привет, мир!» не должен быть окрашен в красный цвет, но все же это так.

Для приведенной выше разметки добавление дочернего комбинатора работает:

*:not(div) > h1 { color: #900; }

Но не влияет на элемент h1, если он не является дочерним для элемента div. Например:

<div><article><h1>Hello World!</h1></article></div>

Именно поэтому я хотел бы указать элемент h1 как потомок, а не как дочерний элемент div. Кто-нибудь?

Ответы [ 2 ]

68 голосов
/ 16 августа 2011

Разве это не читается как "Выбрать все h1 элементы, у которых есть предок, который не является div элементом ...?"

Это так. Но в типичном HTML-документе каждый h1 имеет как минимум двух предков, которые не являются элементами div, и эти предки являются не кем иным, как body и html.

Это проблема при попытке отфильтровать предков с помощью :not(): он просто не работает надежно, особенно когда :not() не проверяется каким-либо другим селектором, таким как селектор типа или селектор класса, например, .foo:not(div). Вам будет гораздо проще просто применить стили ко всем элементам h1 и переопределить их с помощью div h1.

In Селекторы 4 , :not() были расширены, чтобы принимать полносложные селекторы, содержащие комбинаторы, включая комбинатор-потомок. Будет ли это реализовано в быстром профиле (и, следовательно, CSS), еще предстоит проверить и подтвердить, но как только оно будет реализовано, вы сможете использовать его для исключения элементов с определенными предками. Из-за того, как работают селекторы, для надежной работы необходимо сделать отрицание для самого элемента, а не для его предка, и поэтому синтаксис будет выглядеть немного иначе:

h1:not(div h1) { color: #900; }

Любой, кто знаком с jQuery, быстро заметит, что этот селектор работает в jQuery сегодня . Это один из ряда различий между :not() в Selector 3 и :not() в jQuery, которые Селектор 4 пытается исправить.

14 голосов
/ 16 августа 2011

Элемент <html> не является <div>. Элемент <body> не является <div>.

Таким образом, условие «имеет предка, который не является <div>» будет истинным для всех элементов.

Если вы не можете использовать > (дочерний) селектор, я не думаю, что вы можете делать то, что пытаетесь сделать - это не имеет смысла. Во втором примере <article> не является div, поэтому он также соответствует *:not(div).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...