Webkit bug with `:hover` and multiple adjacent-sibling selectors
Asked Answered
T

3

14

Safari and Chrome, as well as Opera and Firefox, can handle the :hover pseudo-class and adjacent-sibling selectors:

a:hover + div {}

This works.

However, when another adjacent-sibling is added:

div:hover + a + div {}

Webkit falls apart.

However, if you first hover over <a> and then hover over the <div> the style is applied as it ought to.

I'm further confounded, because if you add:

div:hover ~ div {}

with or without a style declared, it starts working as it ought to.

Demo

I see this problem in:

  • Google Chrome 15.0.874.121
  • Safari 5.1.1

for OS X.

Any ideas?

Tunny answered 30/11, 2011 at 2:46 Comment(4)
Yeah, this is a WebKit bug. I come across it occasionally. Elements apart from the :hovered one and its parents aren't updated. Nothing you can do about it, I'm afraid.Nonproductive
Somebody observed completely opposite behavior here: #5062009 Definitely a WebKit bug either way, and one that apparently hasn't been completely fixed yet.Disqualification
I found a more elegant solution to this on a more recent question, so I posted a similar answer here.Maleki
Seems to apply also in to a :checked selector.Foote
H
28

you can overcome Webkit's pseudo classes + general/adjacent sibling selectors bugs by faking animation on the body element:

body { -webkit-animation: bugfix infinite 1s; }

@-webkit-keyframes bugfix { 
  from { padding: 0; } 
  to { padding: 0; } 
}

you can check it out here: http://jsfiddle.net/jalbertbowdenii/ds2yY/1/

Handmade answered 30/11, 2011 at 3:22 Comment(5)
you aren't even applying the fix i provided there, plus the commented out selector, you are using. this solution fixed his problem, no reason to downvote.Handmade
this bug still present in almost similar situation, and this solution not workingGreenback
the bug is not present in the question asked so i really do know how much more you want from me. or what you expect. if you have a question, post it to everyone. nit picking an accepted solution to fit your needs is not the purpose of SOHandmade
Thanks! I used this in my artiyle Advanced Checkbox Hack to fix the WebKit bug on Android in combination with the default checkbox hack.Anchylose
@Handmade The bug is still present in Webkit. Your bugfixes does the trick, though (thanks!). However, is there a performance issue with constantly animating on the body?Convivial
M
13

Easy Fix without Animations

Handled a similar issue here, where this idea of changed pseudo-classes solved it (note: nth-child(n) will always match):

div:hover + a:nth-child(n) + div
Maleki answered 20/6, 2013 at 17:46 Comment(1)
amazing. what an obscure bug, and a simple (if obtuse) fixJazzman
B
12

Alternatively, the fix can be applied only to the elements that are having the update issue rather than to the body element:

http://jsfiddle.net/ds2yY/12/

.force-repaint { -webkit-animation: bugfix infinite 1s; }

@-webkit-keyframes bugfix {
    from { fill: 0; }
    to { fill: 0; }
}
Bohs answered 8/12, 2012 at 20:37 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.