Задача: автоматически прокручивать страницу до конца блока, когда пользователь до этого блока добирается вручную, но останавливать анимацию, если пользователь начал скролл вручную.
Алгоритм: при каждой прокрутке перебираем все подходящие элементы и сравниваем их координаты с текущим скроллом. Если пользователь в пределах одного из таких блоков - запускаем анимацию, но если он скроллит вручную - останавливаем
Проблема: 1) анимация не останавливается 2) Работает только скролл мышью, любой другой возвращается к последнему elBottom
(Дополнительно) - можно ли реализовать решение проще, чем через цикл внутри каждого onscroll? Влияет ли текущая реализация на производительность, так, чтобы это было заметно?
var $page = $('html, body'),
arr = document.getElementById('pagesUl').getElementsByClassName('odd');
window.onscroll = function() {
var currentScroll = window.pageYOffset || document.documentElement.scrollTop;
for (var i = 0; i <= arr.length - 1; i++) {
var elTop = arr[i].getBoundingClientRect().top + pageYOffset,
elBottom = arr[i].getBoundingClientRect().bottom + pageYOffset;
if (currentScroll >= elTop && currentScroll < elBottom && i != 2) {
$page.animate({
scrollTop: elBottom
}, 2000, 'linear');
$page.on('mousedown wheel DOMMouseScroll mousewheel keyup touchmove', function() {
$page.stop();
});
return false;
};
};
};