WebKit Adjacent/General Sibling & Pseudo Class Bug

Avatar of Chris Coyier
Chris Coyier on

DigitalOcean bietet Cloud-Produkte für jede Phase Ihrer Reise. Starten Sie mit 200 $ kostenlosem Guthaben!

Gute Nachrichten allerseits! Dies wurde in den stabilen Versionen der WebKit-Browser Safari (5.1) und Chrome (13) behoben.

Es ist nicht alltäglich, auf einen soliden Bug in WebKit zu stoßen, der meiner Meinung nach in der CSS-Unterstützung führend ist. Alexander Futekov hat mir per E-Mail davon berichtet, und ich bin persönlich nie auf diesen Bug gestoßen.

Das Problem besteht darin, dass die Selektoren für benachbarte (+) oder allgemeine (~) Geschwisterelemente mit Pseudoklassen kombiniert werden. So:

h1 ~ p { color: black; }
h1:hover ~ p { color: red; }

Daran ist nichts falsch, oder? Das erscheint ziemlich einfach. Aber das funktioniert in WebKit nicht, es passiert nichts. Es gibt viele seltsame Eigenheiten, die es beeinflussen und scheinbar Teile davon beheben können. Wie diese:

/* This affects both paragraphs */
h1 ~ p { font: 18px Helvetica, Arial, Sans-Serif; }

/* This works */
h1:hover + p { color: red; }

/* This only affects first
... and does nothing without previous rule */
h1:hover ~ p { color: blue; }

Ich habe nicht jeden einzelnen getestet, aber es gibt anscheinend Probleme mit allen Pseudoklassen-Selektoren (:focus, :hover, :checked, :enabled, etc.).

Eine reine CSS-Lösung!

Alexander schickte auch eine clevere reine CSS-Lösung für das Problem. Verwenden Sie eine "do-nothing"-Animation für das `body`-Element.

/* Warning: while this works, it may cause high CPU load */
<code class="lang-css prettyprint">body { -webkit-animation: bugfix infinite 1s; }
@-webkit-keyframes bugfix { from { padding: 0; } to { padding: 0; } }

Eine reine WebKit-Lösung für ein reines WebKit-Problem. WARNHINWEIS: Die Leser Adam Ferguson und Simon Goellner haben beide geschrieben, um mir mitzuteilen, dass diese Lösung die direkte Ursache für einen hohen CPU-Verbrauch auf von ihnen bearbeiteten Websites war.

François Germain hat auch eine Testseite mit einem vorgeschlagenen Fix darauf.

Gut dokumentiert

Dies ist sicherlich nicht der erste Bericht darüber. Hier sind einige Fehlerberichte:

Und andere Publikationen, die das Problem erwähnen: