В 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: Этот вопрос на английском.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Здравствуйте, прошу помощи, объяснений, примеров) Пишу слайдер своими силами для сайта (намеренно не использую библиотеки) на чистом js по возможности...
Если заполняется один из блоков, то оба блока принимают наибольшую высотуВариант с фиксированной высотой не подойдет
Нужно добавить атрибут defer при загрузке страницы всем <script>-амТаким образом хочу ускорить загрузку страницы