Принуждение IE8 к перезаписи/перекраске:до/: после псевдо-элементов
поэтому я немного поиграл с этой календарной штукой:
- сетка дивов (имитация таблицы)
- при наведении указателя мыши на ячейку таблицы отображается подсказка с двумя значками, каждый из которых состоит из div с элементами :before и: after
- значки меняют цвет в зависимости от цвета зависшей ячейки и цвета ее предыдущего брата (класс цвета ячейки применяется к значку).
урезанная скрипку: http://jsfiddle.net/e9PkA/1/
Это прекрасно работает в каждом браузере, но IE8 и ниже (IE lte 7 и я никогда не буду друзьями, но IE8 было бы неплохо иметь).
IE8 замечает изменение имен классов и соответственно обновляет цвет divs, но полностью игнорирует изменения цвета, подразумеваемые объявлениями: before и: after, например:
.wbscal_icon_arrival:before {
width: 12px;
height: 4px;
left: -8px;
top: 6px;
background-color: silver;
}
.wbscal_icon_arrival.wbscal_full:before {
background-color: #ff0000 !important;
}
в скрипке выше, элементы: before/: after окрашиваются ровно один раз: в первый раз появится подсказка.
в другой версии он будет обновляться каждый раз, когда я буду перемещать мышь из div "таблица", но не если подсказка скрыта при наведении курсора на границу div "ячейка".
Я пробовал принудительно запускать перерисовки, добавляя / удаляя другие классы в / из элемента / его родителей/тела, редактируя / получая доступ к атрибутам стиля и тому подобное, поэтому я думаю, что это не ваша средняя проблема перерисовки.
есть ли JS hack, который исправляет это и заставляет: before/: after to обновление?
4 ответа:
пытаюсь выяснить то же самое. В основном IE8 не перерисовывает псевдо-элементы, если вы не внесете изменения в содержимое. Поэтому я изменил ваш пример здесь (только CSS): http://jsfiddle.net/lnrb0b/VWhv9/. Я добавил
width:0
иoverflow:hidden
к псевдо элементам, а затем добавилcontent:"x"
для каждого варианта цвета, где x - это увеличивающееся число пробелов.это работает для меня; надеюсь, это поможет вам!
добавлять
content:"x"
для каждого объявления psuedo-элементов и увеличения количества пробелов для каждого другого состояния элемента, безусловно, решить эту проблему.в основном, идея состоит в том, чтобы сказать IE8, что содержимое немного отличается в каждом состоянии, поэтому перерисуйте содержимое для каждого состояния. Так что, если содержание то же самое, мы "подделать" его с пустыми пространствами. Блестяще!!
@lnrbob действительно хороший ответ!!
у меня была проблема, что я использовал псевдонимы до и после ввода флажка, которые используют некоторые родительские атрибуты для отображения их содержимого (из-за того, что они легко могут реализовать перевод там).
так они выглядят:
input:before { content: "" attr(data-on) ""; } input:after { content: "" attr(data-off) ""; }
и разметка выглядит так:
<div class="switch off" data-on="It is ON" data-off="It is OFF"> <input id="switch" name="switch" type="checkbox" class="off"> </div>
и модификация, которую я делаю в jquery, выглядит так:
var mSwitch = $('div.switch'), on = $.trim(mSwitch.attr('data-on')), off = $.trim(mSwitch.attr('data-off')); // remove any spaces due to trim mSwitch .attr('data-on', on); // add a space mSwitch .attr('data-on', on + ' '); mSwitch .attr('data-off', off); mSwitch .attr('data-off', off + ' ');
и я называю эту модификацию после установки / удаления классов, чтобы изменить стиль "флажок", который является скорее кнопкой переключения в этом случае: D
таким образом, вы не получите stackoverflow от слишком большого количества символов пространства, если некоторые хардкорные тестеры автоматически нажимают на вход в течение бесконечного времени;)
вот так:
<div class="switch on" data-on="ON" data-off="OFF ">
в основном IE8 не перерисовывает псевдо-элементы, если вы не внесете изменения в содержимое, поэтому вы можете изменить, как показано ниже:
.wbscal_icon_arrival:before { width: 12px; height: 4px; left: -8px; top: 6px; background-color: silver; content: ''; } .active .wbscal_icon_arrival:before { background-color: gold; content: ' '; }