Существует несколько способов сделать это. Просто не используйте наивную реализацию window.scroll
, если вы заинтересованы в опыте пользователя и/или производительности.
Это очень, очень и плохая идея приложить обработчики к окну прокрутки события. В зависимости от браузера событие прокрутки может запускать много, а ввод кода в обратном вызове прокрутки замедлит любые попытки прокрутить страницу (не очень хорошая идея). Любое ухудшение производительности в обработчике прокрутки приведет к тому, что общая производительность прокрутки составит всего лишь. Вместо этого гораздо лучше использовать ту или иную форму таймера для проверки каждые X миллисекунд или для присоединения события прокрутки, а запускает ваш код только после задержки (или даже после заданного количества исполнений - и затем задержка).
-John Resig, создатель JQuery, на ejohn.org
Способ 1: setInterval
Во-первых, наивный подход с использованием таймеров:
var $el = $('.guardrail360');
var timer = setInterval(function() {
if (isScrolledIntoView($el)) {
// do stuff
// to run this block only once, simply uncomment the next line:
//clearInterval(timer);
}
}, 150);
Метод 2: окно. scroll event
Тогда есть тривиальный, но сумасшедший неэффективен way с помощью события прокрутки (в зависимости от браузера событие прокрутки будет срабатывать сотни раз в секунду, поэтому вы НЕ хотите запускать много кода здесь, особенно не код, который запускает переходы/перерисовки браузера).
Когда-либо посещал сайт, где прокрутка страницы казалась вялой и нервной?Это часто вызывается кусок кода, как этот прямо здесь:
var $el = $('.guardrail360');
$(window).on('scroll', function() {
if (isScrolledIntoView($el)) {
// do stuff
}
});
Способ 3: лучшее из обоих миров
щегольской гибридный подход для высоких местах движения, как это было предложено Резиг в aforementioned blog post :
var $el = $('.guardrail360'),
didScroll = false;
$(window).scroll(function() {
didScroll = true;
});
var timer = setInterval(function() {
if (didScroll) {
didScroll = false;
if (isScrolledIntoView($el)) {
// do stuff
// to run this block only once, simply uncomment the next line:
//clearInterval(timer);
}
}
}, 250);
Метод 4: Дроссельный/дребезг
дросселирования (минимум N миллисекунд между вызовами) или дребезгом (только один invocatio n на «всплеск») также могут использоваться для эффективного ограничения скорости, с которой выполняется ваш внутренний код. Предполагая, что вы хотите использовать Ben Alman's jQuery throttle/debounce plugin, код выглядит следующим образом:
var $el = $('.guardrail360');
// Throttling
$(window).on('scroll', $.throttle(250, function(){
if (isScrolledIntoView($el)) {
// do stuff
}
}));
// Debouncing
$(window).on('scroll', $.debounce(250, function(){
if (isScrolledIntoView($el)) {
// do stuff
}
}));
(Обратите внимание, что дребезг действует несколько отличается от других реализаций, но иногда может быть то, что вы хотите, в зависимости от сценария работы пользователей)
это должно быть в событии прокрутки, хотя –
Как я могу ограничить событие прокрутки, чтобы оператор if запускался только в первый раз, когда элемент прокручивается в представлении? – adamdehaven
@AdamD Смотрите мое редактирование. – 0x499602D2