В этой коротенькой статейке, я хочу показать способ определения направления прокрутки колеса мыши. Область применения может и не такая обширная, однако я сам не раз сталкивался, где это было необходимо. Например, для создания одного "параллакс эффекта", где страница по сути не должна была скроллится, а эффект возникал только ориентируясь на то, крутит ли пользователь колесико мыши и в каком направлении. Возможно, что и вы найдете применение в своих проектах, если не сейчас, то в будущем.
function addEvent(elem, type, handler){
if(elem.addEventListener){
elem.addEventListener(type, handler, false);
} else {
elem.attachEvent('on'+type, handler);
}
return false;
}
function scrollDirection(){
var weelEvt = (/Firefox/i.test(navigator.userAgent)) ? 'DOMMouseScroll' : 'mousewheel',
el = document.body;
addEvent(el, weelEvt, function(e){
var evt = e.originalEvent ? e.originalEvent : e,
delta = evt.detail ? evt.detail*(-40) : evt.wheelDelta
console.log('Скроллим ' + (delta > 0 ? 'вверх' : 'вниз'));
});
}
// Вешаем обработчик события загрузки документа - DOM-Ready
addEvent(window, 'load', scrollDirection);
// Для jQuery - просто вызываем функцию после загрузки DOM
/*$(function(){
scrollDirection();
});*/
Что-то особо расписывать, я смысла не вижу. Единственное, что можно просто для себя отметить, так это то, что в данном случае "отличился" FireFox, со своим нестандартным событием "DOMMouseScroll".
Для лучшего понимания и восприятия, я решил сделать один примерчик, где предположим следующую задачу: при каждом скролле пользователя, он должен четко попадать на следующий/предыдущий раздел страницы, не проскакивая его, даже если скроллил интенсивно. При этом, будем подгружать в текущий блок соответствующий контент. Соорудим такой HTML и CSS:
<ul id="grid">
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
<li>6</li>
<li>7</li>
</ul>
<div id="fake"></div>
* {
margin: 0;
padding: 0;
}
#grid li {
list-style: none;
height: 300px;
border-bottom: 1px dotted #333;
}
#fake {height: 5000px;} /* только для того, чтоб точно был скроллбар */
Переходим к JS. Тут наша задача - отменить обычное поведение при событии прокрутки мыши (по сути - запретить пользователю прокручивание страницы вручную), вычислять, в зависимости от направление движения колеса, следующий или предыдущий блок, анимировано прокручивать до этого блока и подгружать в него необходимый контент.
$(function(){
var flag = false, // нужен для того, чтоб предотвращать действия во время анимации
bn = 0, // индекс текущего блока
blocks = $('#grid li'), // все блоки
cnt = blocks.length, // кол-во блоков
mousewheelevt = (/Firefox/i.test(navigator.userAgent)) ? "DOMMouseScroll" : "mousewheel"; // событие прокрутки колеса
blocks.eq(0).load('loadblocks.html #b0'); // сразу подгружаем контент в первый блок
// функция определения направления прокрутки колеса
function getDelta(e){
var evt = e || window.event;
evt = evt.originalEvent ? evt.originalEvent : evt;
return delta = evt.detail ? evt.detail*(-40) : evt.wheelDelta;
}
// ловим событие прокрутки
$(document).on(mousewheelevt+'.my_wheel', function(e){
e.preventDefault(); // отменяем обычное поведение (страница не скроллится)
if(flag) return false; // если flag == true, значит в данный момент происходит анимация
if(getDelta(e) > 0){
if(bn <= 0) return false; // если дошли до первого блока, то отменяем дальнейшие действия
--bn; // если блок не первый, то высчитываем индекс предыдущего блока
} else {
if(bn >= cnt-1) return false; // если дошли до последнего блока, то отменяем дальнейшие действия
++bn; // если блок не последний, то высчитываем индекс следующего блока
}
flag = true; // ставим флаг, указывая, что анимация началась
$('html, body').finish().animate({
scrollTop : blocks.eq(bn).offset().top // прокручиваем страницу до вычисленного по индексу блока
}, 1000, function(){
blocks.eq(bn).load('loadblocks.html #b' + bn); // подгружаем контент для блока
flag = false; // снимаем флаг, указывая, что анимация завершена
});
});
});
Расписал всё в комментариях, но осталось объяснить то, откуда подгружаются данные. В методе load(), есть возможность не только указать документ, который нужно загрузить, но и определить какой именно элемент нам будет нужен. В примере, я использовал обычный html-документ, в котором несколько элементов (по числу наших блоков) имеют ID от "b0" до "b6". Получив индекс текущего блока, мы подгружаем элемент с соответствующим id.
Пробуйте, экспериментируйте, а главное помните о том, что некоторые вещи, которые сегодня вам могут и не понадобиться - завтра могут очень сильно выручить. А если возникнут какие-то неординарные вопросы или задачи, то пишите их в этой теме или в разделе "Ваш вопрос".