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:
- bugs.webkit.org/show_bug.cgi?id=12520
- bugs.webkit.org/show_bug.cgi?id=17680
- bugs.webkit.org/show_bug.cgi?id=18026
- bugs.webkit.org/show_bug.cgi?id=18027
- bugs.webkit.org/show_bug.cgi?id=26539
- bugs.webkit.org/show_bug.cgi?id=29029
- bugs.webkit.org/show_bug.cgi?id=32695
- bugs.webkit.org/show_bug.cgi?id=45168
Und andere Publikationen, die das Problem erwähnen:
- Inhalte mit reinem CSS3 anzeigen und ausblenden, im Abschnitt Die ältere Generation pflegen.
- CSS3 :target-basierte Schnittstellen im Abschnitt Probleme mit Spinnen und Reptilien.
- dev.opera.com/forums/topic/600712 – eine kurze Diskussion des Fehlers.
- Reine CSS-klappbare Baumstruktur im Abschnitt „Another demo, another bug“.
- Breadcrumbs (& CSS3 general sibling selector) im Abschnitt „Caveats“.
- CSS3 – Fast eine gute Idee, aber für Safari und Chrome von allen Browsern, wo die Webkit-Browser für den Bug stark kritisiert werden.
- Webkit Bug: Hover und Sibling Selector, ein Artikel über den Bug mit einigen möglichen Lösungen.
- Safari CSS :hover und Adjacent Sibling Selector Bug – noch ein Blogbeitrag zu dem Thema.
- Safari Bug-Bericht: Hover mit Adjacent Selector funktioniert nicht, die Sichtweise von Quirksmode auf das Problem.
Hm, interessant. Das muss ich im Hinterkopf behalten, da ich immer vielfältigere Selektoren verwende.
Danke!
Ich bin vor etwa einem Monat auf dasselbe Problem gestoßen. Es betrifft auch dynamische Pseudoklassen-Selektoren, die mit gestapelten benachbarten Geschwister-Selektoren kombiniert werden. Zum Beispiel funktioniert Folgendes nicht:
/* Funktioniert nicht in WebKit */
h1:hover + p + p { color: red; }
Ich habe auch bemerkt, dass die Verwendung von `-webkit-transition` auf einem benachbarten Geschwister-Selektor Chrome zum Absturz brachte. Aber das war noch in Chrome 3; obwohl der Selektor nicht funktioniert, ist dieser Absturz möglicherweise behoben. Das sollte ich überprüfen.
Danke für die Weitergabe von Alexanders Lösung!
Wow, ich habe versucht, so etwas zu verwenden, um einen Play-Button für eine Animation in CSS zu erstellen. Schön, eine Lösung zu sehen.
Das ist wie ein schönes Tutorial für mich. Ich war noch nie so tief drin...
Dieser Bug existiert schon ewig und ist wirklich ärgerlich. Ich kannte die Lösung nicht, gut gemacht!
Aber ich widerspreche stark der Aussage "qualitativ hochwertige CSS-Unterstützung" in WebKit und bin wirklich überrascht, so etwas von Ihnen zu hören. Meiner Meinung nach implementiert WebKit Dinge schnell, aber auf extrem fehlerhafte Weise. Mozilla und Opera haben normalerweise deutlich solidere Implementierungen, aber sie brauchen länger, um sie zu entwickeln.
Gut geschriebener Blogbeitrag, und ich habe bereits gelernt, dass einige Gruppen eher geneigt sind als andere (da viele von uns unterschiedlich sind), dieselbe Idee zu teilen. Ich hoffe, Sie halten diesen Blog funktionsfähig. Ich habe einen Blogbeitrag zu Ihrem Blog gepostet. Wenn Sie Webdesign, Entwicklung, SEO, PPC-Marketing oder Softwareentwicklung benötigen, besuchen Sie unsere Website http://www.ukwebsitedesigncompany.co.uk.
Ich hasse es, wenn Leute das tun. Wie würden Sie sich fühlen, wenn wir alle auf Ihrem Blog sinnlose Kommentare mit Links zu unseren Websites hinterlassen würden?
Danke für das Posten der Lösung dafür...
Danke, dass du meinen Artikel aufgenommen hast, Chris – ich war wirklich verblüfft, dass das in -webkit nicht funktioniert. Großartig, eine Lösung für dieses Problem zu sehen, aber weiß jemand, warum dieser Workaround tatsächlich funktioniert? Es macht überhaupt keinen Sinn!
Ich weiß! Das dachte ich auch.
Hallo,
Ich bin sehr froh, dass es einen Workaround für dieses Problem gibt – das ist genau das, wonach ich gesucht habe, und jemand hat es gemacht! Aber es ist wirklich bedauerlich, dass es nach vier Jahren immer noch nicht behoben ist.
Nachdenken über den Workaround: Die CSS funktioniert so:
1. Die erste Zeile referenziert die Animation, die stattfinden soll; und dann
2. Die zweite Zeile weist den Padding an, sich nicht zu animieren.
„bugfix“ ist nur ein Referenzname.
Ich denke also, dass der WebKit-Bug etwas mit dem Padding von `body` zu tun hat, aber nur unter bestimmten Umständen.
Ich bin mir nicht sicher, ob jemand anderes darüber nachdenken möchte, aber ich frage mich:
a) Mein Tutorial für scrollende Websites (die zweite referenzierte Website) basiert auf der Animation eines absolut positionierten Elements innerhalb eines fixierten Elements. Beide sind innerhalb von `body` enthalten. Was ist die Position (statisch/relativ/absolut) von `body`, wenn die Position nicht deklariert ist, und was ist sein Padding?
b) Beeinflusst die Position des Enkels das Padding des Großvaters?
Trotzdem ist es großartig, eine Lösung zu sehen.
Ich dachte früher, dass `~` nur bei jQuery und nicht bei CSS wirkt.
Können `+`, `>` und `<` auch in CSS verwendet werden?
Noch verwirrender für mich ist, dass WebKit `a:link` scheinbar sowohl als `a:link` als auch als `a:visited` behandelt.
Gut zu wissen, dass es dafür einen Workaround gibt!
Gibt es ein Follow-up zur Akku-fressenden Seite dieses Hacks?
Beachten Sie, dass der Fehler auch bei Attributselektoren + benachbarten Selektoren vorhanden ist,
d. h. `.element[data-state=true]~div`
Glücklicherweise funktioniert die vorgeschlagene Lösung perfekt.