对于这个问题,我使用以下标记:
<body>
<p>1</p> <!-- Paragraph 1 -->
<p>2</p> <!-- Paragraph 2 -->
<p>3</p> <!-- Paragraph 3 -->
</body>
在Selectors Level 3 规范中,以下选择器规则适用:
* any element
E + F an F element immediately preceded by an E element
E ~ F an F element preceded by an E element
基于此,应发生以下情况:
body + * { } /* Selects nothing as no elements precede body */
body ~ * { } /* As above. */
p + * { } /* Selects Paragraph 2 and Paragraph 3 as these are preceded by p */
p ~ * { } /* As above. */
* + * { } /* As above. */
* ~ * { } /* As above. */
错误的!
* + *
并且* ~ *
能够以某种方式选择第 1 段以及第 2 段和第 3 段!第 1 段前面没有任何内容,因此应该无法访问:
body + * { background: #000; }
body ~ * { background: #000; }
p ~ * { color: #f00; }
p + * { font-weight: bold; }
* + * { text-decoration: underline; }
* ~ * { font-style: italic; }
结果:
如您所见,第 1 段前面没有 thebody
或 phantom p
,但显然前面有一些东西。它根本不应该应用任何自定义样式,但会受到最后两个选择器的影响。这背后的逻辑是什么?