В IE11 и Edge div в сниппете после клика становится зелёным, хотя не должен.
Подробно:Рассмотрим следующую ситуацию: есть div чёрного цвета.
При клике по нему мы запрашиваем requestAnimationFrame и меняем цвет на зелёный.
В коллбеке requestAnimationFrame меняем цвет на красный.
Для наглядности в requestAnimationFrame добавлен цикл, вешающий браузер на 3 секунды, а на div повешена css-анимация, чтобы было ясно, что браузер повис.
Ожидаемое поведение (которое наблюдается в Chrome и Firefox):
requestAnimationFrameОднако, IE и Edge на шаге 5 показывают зелёный div. Насколько я понимаю, такое поведение некорректно, поскольку браузер обязан дождаться выполнения кода из requestAnimationFrame и только потом выполнить отрисовку на экране.
Как сделать, чтобы промежуточное состояние не отрисовывалось?
Вариант не изменять состояние без requestAnimationFrame не подходит, поскольку в реальной задаче (см. вопрос о canvas'е) эти изменения вызваны css-анимацией, а не скриптом. Кроме того, проблема проявляется даже при двух вложенных requestAnimationFrame.
https://jsfiddle.net/8Ljn14ee/2/
var div = document.querySelector('div');
div.addEventListener('click', function () {
requestAnimationFrame(function () {
var t = new Date;
t.setSeconds(t.getSeconds() + 3);
while (new Date < t);
div.style.background = 'red';
});
div.style.background = 'green';
});
div {
height: 200px;
width: 200px;
border-radius: 50%;
background: black;
animation: w-100-200 3s linear infinite;
}
@keyframes w-100-200 {
0% { width: 200px; }
50% { width: 400px; }
100% { width: 200px; }
}
<div></div>
PS: Этот вопрос на английском.
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники