requestAnimationFrame не ждет следующего кадра

Спасибо за регистрацию!

Итак, насколько мне известно (может быть, это неправильно), метод JavaScript requestAnimationFrame работает (немного) как setTimeout, за исключением того, что он ждет не определенное время, а рендеринг следующего кадра.

Это можно использовать для многих вещей, но то, чего я пытаюсь достичь здесь, — это эффект затухания, управляемый JavaScript на основе CSS. Вот как выглядит код с пояснениями:

//This line makes the element displayed as block from none
//but at this point it has an opacity value of 0
this.addClass('element__displayed');

//here i am waiting a frame so that the previously added
//display value takes effect
window.requestAnimationFrame(function(){
    //adding opacity: 1 for fade effect
    this.addClass('element__visible');
}.bind(this));

Моя проблема здесь в том, что, хотя для элемента настроен переход css, и я жду, пока отобразится отображаемое значение, я не получаю перехода, он просто появляется.

(это работает, если я использую setTimeout(..., 1000/60), но setTimeout является узким местом производительности по сравнению с requestAnimationFrame)

Пожалуйста, не пытайтесь дать альтернативное решение для эффекта затухания, потому что мой вопрос не в эффекте, а в том, почему анимацияFrame не работает!

Благодарю вас!


person kristóf baján    schedule 28.07.2016    source источник
comment
Можешь поделиться демо   -  person Arun P Johny    schedule 28.07.2016
comment
покажите css пожалуйста   -  person Jaromanda X    schedule 28.07.2016
comment
jsfiddle.net/arunpjohny/zwgsv3ys/1 — выглядит просто отлично   -  person Arun P Johny    schedule 28.07.2016
comment
@ArunPJohny Это почти то, что я пробовал, и у меня это тоже не работает в вашей демонстрации (последний Chrome): /   -  person kristóf baján    schedule 28.07.2016
comment
@kristófbaján при нажатии кнопки, что происходит в вашей системе - для меня это работает в последней версии Chrome   -  person Arun P Johny    schedule 28.07.2016
comment
Здесь вообще не нужно использовать requestAnimationFrame. Вы можете использовать visibility вместо display. https://jsfiddle.net/46taexkp/   -  person DavidDomain    schedule 28.07.2016
comment
@ArunPJohny при нажатии он просто появляется без какого-либо перехода для меня   -  person kristóf baján    schedule 28.07.2016
comment
@DavidDomain, пожалуйста, прочитайте все описание, прежде чем комментировать   -  person kristóf baján    schedule 28.07.2016


Ответы (1)


Я думаю, что requestAnimationFrame не гарантирует ожидание следующего кадра. Пол Айриш пишет

Любые rAF, поставленные в очередь в ваших обработчиках событий, будут выполняться в том же фрейме. Любые rAF, поставленные в очередь в rAF, будут выполнены в следующем кадре.

Если я адаптировал вашу демонстрацию, она теперь работает для меня в Chrome: https://jsfiddle.net/ker9zpjs/

Однажды я нашел этот помощник, который с тех пор находится в моем наборе инструментов:

var nextFrame = function(fn) { raf(function() { raf(fn); }); };

Но я должен признаться, что мой ответ не полностью исследован, если бы кто-то мог найти более подробную информацию, я также был бы признателен.

person ernesto    schedule 17.02.2017
comment
Any rAFs queued in a rAF will be executed in the next frame​. Похоже, это ложь. - person H.B.; 04.02.2018
comment
@HB: У вас есть ссылки или примеры, подтверждающие это? - person ernesto; 05.02.2018
comment
У меня были некоторые проблемы с WebVR, хотя это могли быть артефакты от внешнего устройства, имеющего свои собственные петли rAF. Мне нужно было бы изучить это более глубоко, возможно, фактическое поведение даже не наблюдается должным образом, например. профилировщик Chrome. - person H.B.; 05.02.2018
comment
Похоже, что это, вероятно, просто артефакт профилировщика, и на самом деле все выполняется, как и ожидалось. - person H.B.; 05.02.2018