I'm trying to set style for a <div> following an empty <ul> .

This is simple code i'm currently testing: (OS is win7)

Basic jsFiddle DEMO

HTML:

<button class="btnAdd">add new LI</button> <button class="btnRemove">remove last LI</button> <ul></ul> <div>Should be red if UL is empty</div>

CSS:

ul:empty + div { color:red; }

jQuery: (not relevant to issue, just for testing purpose)

$('.btnAdd').on('click', function () { $('ul').append('<li>LI</li>'); }); $('.btnRemove').on('click', function () { $('ul').find('li').last().remove(); });

Expected behaviour:

In all major browsers, when adding element to <ul> , style set for empty <ul> following <div> shouldn't be applied. When removing all <li> , style should be reapplied to targeted <div> .

Current behaviour:

Firefox handles it with no problem, get expected result.

handles it with no problem, get expected result. Chrome removes red color for following DIV when UL is no more empty, but doesn't reapply it when UL is empty again (removing all LIs from UL)

removes red color for following DIV when UL is no more empty, but doesn't reapply it when UL is empty again (removing all LIs from UL) IE10/11 just apply CSS :empty pseudo-class as by default, not reacting to any content added or removed

Googling it, i've find some workarounds but most seem outdated and none fix issue here, none i can't find at least.

For chrome, i've found that setting a CSS rule :empty for UL fixes it, but really i don't know what's going on : ul:empty {} (ya this is an empty CSS rule?!) <-- I guess now it forces an UI repaint on chrome ?!

Fixed jsFiddle for chrome

Unfortunatley, this doesn't fix behaviour on IE10/11.

So anyone knows a way to make it works on all major browsers???

UPDATE 1:

Seems like bug is related to next sibling selector + , even using ~ doesn't give consistent result on chrome. But if applying style directly to :empty element, all seems to work correctly on all browsers: http://jsfiddle.net/EyEa7/ But my goal here is to target sibling element of :empty element, not the empty element directly.

UPDATE 2:

Forcing an UI redraw fixes it on all browsers, e.g using $('body').hide().show(0); once content has been updated: See DEMO forcing redraw

But, i'd really more appreciate a fix which doesn't involve any javascript code.

The question now could be: