Время от времени Chrome отображает совершенно корректный HTML / CSS неправильно или не отображает его вообще. Копания через инспектора DOM часто достаточно, чтобы заставить его осознать ошибку своих путей и правильно перерисовать, поэтому вполне вероятно, что разметка хорошая. Это происходит достаточно часто (и, как и ожидалось, достаточно) в проекте, над которым я работаю, и я поместил код на место, чтобы вызвать перерисовку в определенных обстоятельствах.
Это работает в большинстве комбинаций браузер / операционная система:
el.style.cssText += ';-webkit-transform:rotateZ(0deg)'
el.offsetHeight
el.style.cssText += ';-webkit-transform:none'
Например, настройте неиспользуемое свойство CSS, затем запросите информацию, которая вызывает перерисовку, затем отмените свойство. К сожалению, яркая команда Chrome для Mac, похоже, нашла способ получить это offsetHeight без перерисовки. Таким образом убивая полезного в противном случае взломать.
Пока что лучшее, что я придумал, чтобы получить такой же эффект на Chrome / Mac, это уродство:
$(el).css("border", "solid 1px transparent");
setTimeout(function()
{
$(el).css("border", "solid 0px transparent");
}, 1000);
Например, на самом деле заставьте элемент немного подскочить, затем охладите секунду и отскочите назад. Хуже того, если вы сократите этот тайм-аут ниже 500 мс (туда, где он будет менее заметен), он часто не будет иметь желаемого эффекта, так как браузер не дойдет до перерисовки, пока не вернется в исходное состояние.
Кто-нибудь хочет предложить лучшую версию этого хака перерисовки / обновления (предпочтительно на основе первого примера выше), который работает на Chrome / Mac?
источник
Ответы:
Не уверен, что именно вы пытаетесь достичь, но этот метод я успешно использовал в прошлом, чтобы заставить браузер перерисовать, возможно, он будет работать для вас.
Если эта простая перерисовка не работает, вы можете попробовать эту. Он вставляет пустой текстовый узел в элемент, который гарантирует перерисовку.
РЕДАКТИРОВАТЬ: В ответ на Шиме Vidas, что мы достигаем здесь, будет принудительное оплавление. Вы можете узнать больше от самого мастера http://paulirish.com/2011/dom-html5-css3-performance/
источник
.hide().show(0)
на любом элементе (я выбрал нижний колонтитул страницы), он должен обновить страницу.Ни один из приведенных выше ответов не работал для меня. Я заметил, что изменение размера моего окна вызвало перерисовку. Так что это сделал это для меня:
источник
$(window).trigger('resize')
этого не делает, оно только генерирует событие «resize», которое запускает связанный обработчик, если он назначен.Недавно мы столкнулись с этим и обнаружили, что перевод затронутого элемента в составной слой с помощью translateZ устранил проблему, не требуя дополнительного JavaScript.
Поскольку эти проблемы рисования в основном проявляются в Webkit / Blink, и это исправление в основном предназначено для Webkit / Blink, в некоторых случаях это предпочтительно. Тем более , что многие решения JavaScript вызывают в оплавления и перекрашивать , а не просто перекрашивать.
источник
neon-animated-pages
. Спасибо: +1:Это решение без таймаутов! Реальная сила перерисована! Для Android и iOS.
источник
Это работает для меня. Престижность иди сюда .
источник
$().hide().show(0)
show()
отличается от того,show(0)
что указав длительность в последнем, он запускается с помощью методов анимации jQuery, а не сразу, что дает время для рендеринга таким же образом, чтоhide(0, function() { $(this).show(); })
и ,Если скрыть элемент, а затем снова показать его в пределах setTimeout 0, произойдет перерисовка.
источник
myElement.getBoundingClientRect()
, которые были кэшированы, скорее всего, для целей оптимизации / производительности. Я просто добавил нулевую задержку в миллисекунду для функции, которая добавляет новый элемент в DOM и получает новые значения после того, как старый элемент с предыдущими (кэшированными) значениями был удален из DOM.Это, кажется, делает трюк для меня. Плюс, это действительно не показывает вообще.
источник
вызов
window.getComputedStyle()
должен заставить пересылкуисточник
offsetHeight
свойство, которое не css.Я столкнулся с этой проблемой сегодня в OSX El Capitan с Chrome v51. Рассматриваемая страница прекрасно работала в Safari. Я попробовал почти все предложения на этой странице - ни одно из них не сработало - у всех были побочные эффекты ... В итоге я реализовал приведенный ниже код - очень простой - без побочных эффектов (все еще работает, как и раньше в Safari).
Решение. При необходимости переключите класс на проблемный элемент. Каждое переключение вызовет перерисовку. (Я использовал jQuery для удобства, но ванильный JavaScript не должен быть проблемой ...)
JQuery Class Toggle
Класс CSS
И это все...
ПРИМЕЧАНИЕ. Чтобы увидеть эффект, необходимо запустить фрагмент ниже «Полная страница».
источник
вызовите эту функцию через 500 миллисекунд.
источник
Если вы хотите сохранить стили, объявленные в ваших таблицах стилей, лучше использовать что-то вроде:
NB: с последним webkit / blink, сохранение значения
offsetHeight
обязательно для запуска перерисовки, в противном случае виртуальная машина (в целях оптимизации), вероятно, пропустит эту инструкцию.Обновление: добавлено второе
offsetHeight
чтение, необходимо, чтобы браузер не помещал в очередь / не кэшировал следующее изменение свойства / класса CSS с восстановлениемdisplay
значения (таким образом должен быть выполнен переход CSS, который может следовать)источник
// <== плохая идея$('article.child').redraw();
источник
.fadeIn(1)
вместо.show(300)
меня - не толкая элемент вокруг. Так что я думаю, что это запускdisplay:none
и обратноblock
Подход, который работал для меня в IE (я не мог использовать технику отображения, потому что был ввод, который не должен терять фокус)
Работает, если у вас 0 полей (смена отступов тоже работает)
источник
Только CSS Это работает в ситуациях, когда дочерний элемент удален или добавлен. В этих ситуациях границы и закругленные углы могут оставить артефакты.
источник
Мое исправление для IE10 + IE11. По сути, происходит добавление DIV в элемент-обертку, который необходимо пересчитать. Тогда просто удали это и вуаля; работает как шарм :)
источник
Большинство ответов требуют использования асинхронного тайм-аута, который вызывает раздражающее мигание.
Но я придумал этот, который работает гладко, потому что это синхронно:
источник
Это мое решение, которое сработало для исчезновения контента ...
источник
Я столкнулся с подобной проблемой, и эта простая линия JS помогла исправить это:
В моем случае это была ошибка с расширением Chrome, которое не перерисовывало страницу после изменения ее CSS изнутри расширения.
источник
Я хотел вернуть все состояния в предыдущее состояние (без перезагрузки), включая элементы, добавленные jquery. Вышеуказанная реализация не сработает. и я сделал следующее.
источник
У меня был список реагирующих компонентов, который при прокрутке открывал другую страницу, затем при возврате список не отображался на Safari iOS до прокрутки страницы. Так что это исправление.
источник
Ниже CSS работает на IE 11 и Edge, JS не требуется.
scaleY(1)
делает трюк здесь. Кажется самое простое решение.источник
Это помогло мне
источник
2020: легче и сильнее
Предыдущие решения больше не работают для меня.
Я предполагаю, что браузеры оптимизируют процесс рисования, обнаруживая все больше и больше «бесполезных» изменений.
Это решение заставляет браузер рисовать клон для замены исходного элемента. Это работает и, вероятно, более устойчиво:
протестировано на Chrome 80 / Edge 80 / Firefox 75
источник