У меня есть следующий код CSS:
article ul ul :nth-child(2) {
border:1px solid black;
}
Которая выбирает каждый второй элемент в дереве dom, независимо от глубины дерева. (но он должен быть внутри ul, который должен быть внутри ul, который должен быть внутри article).
Но почему в этом примере не выбирается каждый второй элемент?
article ul ul :nth-child(2) {
border: 1px solid black;
}<article>
<ul>
<li>this not</li>
<li>this not</li>
<ul>
<li>this not</li>
<li>this</li>
<p>
<li>this not</li>
<li>why not this?</li>
</p>
</ul>
</ul>
</article>Но когда я меняю элемент p на div, он работает. Кто-нибудь может это объяснить?
осмотрите элемент и вы увидите свою вину
См. это






Ваша разметка недействительна. ul может иметь только элементы li в качестве его непосредственных потомков. Кроме того, li является недействительным потомком p. Теги абзаца может содержать только формулировка содержания, который не включает li. Я предлагаю вам изучить следующий фрагмент, чтобы увидеть, как меняется ваш браузер, чтобы попытаться исправить свои ошибки разметки. По крайней мере, для хрома, это приводит к разделению тега абзаца на две части и размещению вложенных элементов li на том же уровне, что и другие.
article ul ul :nth-child(2) {
border:1px solid black;
}<article>
<ul>
<li>this not</li>
<li>this not</li>
<ul>
<li>this not</li>
<li>this</li>
<p>
<li>this not</li>
<li>why not this?</li>
</p>
</ul>
</ul>
</article>Как уже упоминалось в @Huangism, ваш HTML недействителен.
От Страница MDN о ul:
Permitted content:
zero or more<li>elements, which in turn often contain nested<ol>or<ul>elements.
Вот пример того, как ваш дом должен быть структурирован, чтобы он работал:
article ul ul :nth-child(2) {
border: 1px solid black;
}<article>
<ul>
<li>this not</li>
<li>this not</li>
<li>
<ul>
<li>this not</li>
<li>this</li>
<li>
<ul>
<li>this not</li>
<li>why not this?</li>
</ul>
</li>
</ul>
</li>
</ul>
</article>
Вы должны исправить свой html на действительный html, тогда он будет работать.
ulне может находиться внутри другогоulв детстве. Это должен быть элемент списка, а затемulвнутри элемента списка. Тег абзаца также должен находиться внутри элемента списка, а не быть дочерним элементомul.