:пустая проблема псевдокласса с добавленным/удаленным содержимым и родственными комбинаторами

Я пытаюсь установить стиль для <div> после пустого <ul>.

Это простой код, который я сейчас тестирую: (ОС win7)

Базовая демонстрация jsFiddle

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: (не относится к проблеме, просто для тестирования)

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

$('.btnRemove').on('click', function () {
    $('ul').find('li').last().remove();
});

Ожидаемое поведение:

Во всех основных браузерах при добавлении элемента в <ul> стиль, установленный для пустого <ul>, следующего за <div>, не должен применяться. При удалении всех <li> стиль следует повторно применить к целевым <div>.

Текущее поведение:

  • Firefox справится с этим без проблем, получите ожидаемый результат.
  • Chrome удаляет красный цвет для следующего DIV, когда UL больше не пуст, но не применяет его повторно, когда UL снова пуст (удаление всех LI из UL)
  • IE10/11 просто примените псевдокласс CSS :empty по умолчанию, не реагируя ни на добавление, ни на удаление содержимого.

Погуглив, я нашел некоторые обходные пути, но большинство из них кажутся устаревшими, и здесь нет проблем с исправлением, по крайней мере, я не могу найти.

Для Chrome я обнаружил, что установка правила CSS :empty для UL исправляет это, но действительно я не знаю, что происходит: ul:empty {} (да, это пустое правило CSS?!) ‹-- Думаю, теперь это заставляет перерисовывать пользовательский интерфейс в Chrome ?!

Исправлен jsFiddle для Chrome.

К сожалению, это не исправляет поведение в IE10/11.

Итак, кто-нибудь знает способ заставить его работать во всех основных браузерах ???

ОБНОВЛЕНИЕ 1:

Похоже, ошибка связана с селектором следующего брата +, даже использование ~ не дает последовательного результата в хроме. Но если применить стиль непосредственно к элементу :empty, все работает правильно во всех браузерах: http://jsfiddle.net/EyEa7/ Но моя цель здесь состоит в том, чтобы нацелиться на родственный элемент элемента :empty, а не непосредственно на пустой элемент.

ОБНОВЛЕНИЕ 2:

Принудительная перерисовка пользовательского интерфейса устраняет проблему во всех браузерах, например, с помощью $('body').hide().show(0); после обновления содержимого: см. ДЕМОКРАТИЧЕСКУЮ ПОМОЩЬ принудительной перерисовки

Но я бы больше оценил исправление, которое не включает код javascript.

Вопрос теперь может быть:

  • Как я могу заставить IE10/11 перерисовывать пользовательский интерфейс, используя только CSS? (надеюсь, что это уместный вопрос относительно этой проблемы)

person A. Wolff    schedule 31.03.2014    source источник
comment
К сожалению, IE всегда отстает. Лучше всего использовать подобные функции для улучшения взаимодействия с пользователем в браузерах, которые поддерживают такие тонкости, но не полагайтесь на них в плане функциональности, поскольку всегда будет кто-то, кто просматривает сайт в IE7/8. Ваше исправление Chrome работает для меня на Chrome 34   -  person Ashley Medway    schedule 31.03.2014
comment
@AshleyMedway Я не собираюсь поддерживать какие-либо браузеры, которые изначально не поддерживают псевдокласс :empty. Я просто хочу, чтобы он работал должным образом в соответствующих браузерах. В любом случае, спасибо за ваш вклад   -  person A. Wolff    schedule 31.03.2014
comment
@A.Wolff Я тестировал его, т.е. он работает в первый раз, но когда мы добавляем li, он не работает правильно, у вас то же самое?   -  person Just code    schedule 31.03.2014
comment
Только что отметил, что если используется ~, то после добавления или удаления элемента нам нужно щелкнуть документ/страницу, чтобы увидеть поведение :empty по умолчанию в Chrome, Win 8.   -  person Mr_Green    schedule 31.03.2014
comment
@DholakiyaAnkit Если я правильно вас понял, у меня такое же поведение в IE10/11.   -  person A. Wolff    schedule 31.03.2014
comment
@Mr_Green Используя ul:empty ~ div, TABLE должна потерять фокус на первом LI, добавленном в стиль «обновления». Это довольно странно! РЕДАКТИРОВАТЬ: не видел ваш обновленный комментарий, такое же поведение здесь на Win7   -  person A. Wolff    schedule 31.03.2014
comment
jsbin.com/tacuxori/1/edit Пожалуйста, проверьте этот URL, он будет работать, подождите 10 или более секунд.   -  person Just code    schedule 31.03.2014
comment
@DholakiyaAnkit Какая часть исправления?! В IE теперь это работает каким-то образом, даже похоже на ту же ошибку, что и при использовании селектора ul:empty ~ div в chrome, UL нужно потерять фокус для обновления стиля, странно! jsbin.com/tacuxori/2/edit   -  person A. Wolff    schedule 31.03.2014
comment
Да, на самом деле @A.Wolff я не знаю много информации об этом. Но я погуглил и нашел несколько инструментов, поэтому я попробовал.   -  person Just code    schedule 31.03.2014
comment
@DholakiyaAnkit Действительно, похоже, что это связано с jsbin vs jsfiddle и, возможно, как обрабатывается iframe или, может быть, режим автоматического запуска сценария на jsbin, не знаю. jsbin.com/tacuxori/3/edit   -  person A. Wolff    schedule 31.03.2014
comment
Кажется, это не зависит от особенностей iframe, jsFiddle или jsbin: fiddle.jshell.net/ Je6UY/3/шоу/свет   -  person Brewal    schedule 31.03.2014
comment
Вы можете принудительно перерисовать с помощью CSS3 animate. Проверьте этот ответ stackoverflow.com/questions/22011139/ возможно, это применимо к вашей ситуации   -  person pstenstrm    schedule 31.03.2014
comment
На самом деле существует аналогичный вопрос: stackoverflow.com /вопросы/9443500/   -  person Brewal    schedule 31.03.2014
comment
@Brewal Спасибо за ссылку, но я уже протестировал ее и, к сожалению, здесь не применяется, поскольку я проверял ее :(   -  person A. Wolff    schedule 31.03.2014
comment
@pstenstrm Спасибо, я тестирую. ОБНОВЛЕНИЕ: не работает в IE :( Исправляет это в хроме, но даже пустое правило CSS исправляет его в хроме   -  person A. Wolff    schedule 31.03.2014
comment
@Ashley Medway: К сожалению, IE всегда отстает. Так же и с Хромом. Это уже не просто IE, давно не было. Оба браузера явно нуждаются в каком-то способе принудительной перерисовки здесь, хотя перерисовки должны выполняться автоматически на основе изменений в DOM. И это даже не единственная проблема Chrome с родственными комбинаторами.   -  person BoltClock    schedule 31.03.2014
comment
@pstenstrm Это был правильный способ принудительно перекрасить. Я попробовал связанное решение, но оно не сработало (конечно, я удалил префикс для анимации). Но действительно использование анимации было рабочим способом, так что спасибо вам!   -  person A. Wolff    schedule 01.04.2014


Ответы (1)


Что-то вроде этого будет работать, но это не особенно красиво:

ul:empty {}

ul:empty + div {
    color: red;
}

ul + div {
    animation: repaint 1000s infinite linear;
}

@keyframes repaint {
    from { zoom: 1; }
    to { zoom: 0.99999; }
}

См.: http://jsfiddle.net/vd2Hx/.

Протестировано в Chrome, Firefox, Safari, Opera и IE.

person John Kurlak    schedule 31.03.2014
comment
Вау, это действительно приятно! Я имею в виду, какое ужасное исправление, которое работает, большое спасибо! :) - person A. Wolff; 01.04.2014
comment
Я буду использовать его, пока эта ошибка не будет исправлена, еще раз спасибо! - person A. Wolff; 01.04.2014