2

Я очень волновался после прочтения this article о более быстрых эффектах прокрутки. Я пошел реализации метода Warry, чтобы увидеть, если я мог заметить разницу в производительности - по сравнению с использованием слушателя событий прокрутки:Быстрая прокрутка без onScroll?

window.addEventListener('scroll', function() { 
    console.log('Scrolling: ' + window.pageYOffset); 
}); 

код из статьи:

function loop() { 
    if (lastPosition == window.pageYOffset) { 
     requestAnimationFrame(loop); 
     return false; 
    } else lastPosition = window.pageYOffset; 

    console.log('Scrolling: ' + window.pageYOffset); 
    // make sticky calculations... 

    requestAnimationFrame(loop); 
} 
loop(); // start loop 

Эти две части выходного кода то же самое (Y) и кажутся эквивалентными по производительности. Поэтому мой вопрос: правильно ли статья?

Также, как requestAnimationFrame подходит для этой фотографии? Я знаю, что он сообщает браузеру, что он хочет выполнить повторную краску. Или ... позиция фиксированная просто путь? Меня интересует эта тема, потому что я работаю над плагином для липких элементов.

Информация и рекомендации!

+0

«Кажется, что это эквивалентно по производительности» - как вы измерили это? – Bergi

+0

Речь идет о более эффективных * эффектах *. Если вы просто заходите на консоль, вы не почувствуете разницы (кроме возможных разных номеров или журналов). – Bergi

+0

Выходы были одинаковыми на каждом тике. Я также переключил все функции рендеринга (краска, границы слоя, счетчик FPS и проблемы с производительностью прокрутки) в DevTools от Chrome, чтобы увидеть, как будут выполняться липкие элементы. Не было никаких заметных различий. Я не писал для этого тестов; просто любопытно, что другие могут рассказать мне об этой теме. – JasonK

ответ

2

Поскольку события прокрутки могут срабатывать с высокой скоростью, обработчик событий не должен выполнять дорогостоящие операции с вычислением, такие как модификации DOM. Вместо этого рекомендуется дросселировать событие, используя requestAnimationFrame, setTimeout или customEvent.

Важно не только использовать requestAnimationFrame для ваших анимаций, но и использовать его в правильном направлении. - HTML5ROCKS

Также см https://developer.mozilla.org/en-US/docs/Web/Events/scroll

Это хороший маленький кусочек кода, чтобы получить префикс правильного браузера. Если requestAnimationFrame не поддерживается, мы возвращаемся к setTimeout(function(){}, 0).

var requestAnimationFrame = window.requestAnimationFrame 
    || window.webkitRequestAnimationFrame 
    || window.mozRequestAnimationFrame 
    || window.msRequestAnimationFrame 
    || window.oRequestAnimationFrame 
    || function(callback){ setTimeout(callback, 0) }; 

// Usage 
window.addEventListener('scroll', function() { 
    requestAnimationFrame(this.scroll); // call scroll event handler 
}); 
Смежные вопросы