Существующее решение
Может быть 3 решение из этой публикации и другая статья stackoverflow .
Решение 1
var lastScrollTop = 0;
$(window).on('scroll', function() {
st = $(this).scrollTop();
if(st < lastScrollTop) {
console.log('up 1');
}
else {
console.log('down 1');
}
lastScrollTop = st;
});
Решение 2
$('body').on('DOMMouseScroll', function(e){
if(e.originalEvent.detail < 0) {
console.log('up 2');
}
else {
console.log('down 2');
}
});
Решение 3
$('body').on('mousewheel', function(e){
if(e.originalEvent.wheelDelta > 0) {
console.log('up 3');
}
else {
console.log('down 3');
}
});
Мультибраузерный тест
Я не смог протестировать его в Safari
Chrome 42 (Win 7)
- Решение 1
- Наверх:1 событие на 1 прокрутку
- Вниз: 1 событие на 1 прокрутку
- Решение 2
- Вверх: не работает
- Вниз:Не работает
- Решение 3
- Вверх: 1 событие на 1 прокрутку
- Вниз: 1 событие на 1 прокрутку
Firefox 37 (Win 7)
- Решение 1
- Вверх: 20 событий на 1 прокрутку
- Вниз: 20 событий на 1 прокрутку
- Решение 2
- Вверх: не работает
- Вниз: 1 событие на 1 прокрутку
- Решение 3
- Вверх: не работает
- Вниз: не работает
IE 11 (Win 8)
- Решение 1
- Вверх: 10 событий на 1 прокрутку (побочный эффект: прокрутка вниз произошла наконец)
- Вниз: 10 событий на 1 прокрутку
- Soltion 2
- Вверх: не работает
- Вниз: не работает
- Решение 3
- Вверх: не работает
- Вниз: 1 событие на 1 прокрутку
IE 10 (Win 7)
- Решение 1
- Вверх: 1 событие на 1 прокрутку
- Вниз: 1 событие на 1 прокрутку
- Решение 2
- Вверх: не работает
- Вниз: Не работает
- Решение 3
- Вверх: 1 событие на 1 прокрутку
- Вниз: 1 событие на 1 прокрутку
IE 9 (Win 7)
- Решение 1
- Вверх: 1 событие на 1 прокрутку
- Вниз: 1 событие на 1прокрутки
- Soltion 2
- Вверх: не работает
- Вниз: не работает
- Решение 3
- Вверх: 1 событие на 1 свиток
- Вниз: 1 событие на 1 свиток
IE 8 (Win 7)
- Решение 1
- Вверх: 2 события на 1 прокрутку (побочный эффект: прокрутка вниз произошла в конце)
- Вниз: 2 ~ 4 события на 1 прокрутку
- Soltion 2
- Up: не работает
- Down: не работает
- Solution 3
- Up: 1событие за 1 свиток
- Вниз: 1 событие за 1 свиток
Комбинированное решение
Я проверил эту сторонуЭффект от IE 11 и IE 8 исходит из заявления if else
.Итак, я заменил его на оператор if else if
следующим образом.
Из теста с несколькими браузерами я решил использовать Solution 3 для обычных браузеров и Solution 1 для firefox и IE 11.
Я отправил этот ответ , чтобы обнаружить IE 11.
// Detect IE version
var iev=0;
var ieold = (/MSIE (\d+\.\d+);/.test(navigator.userAgent));
var trident = !!navigator.userAgent.match(/Trident\/7.0/);
var rv=navigator.userAgent.indexOf("rv:11.0");
if (ieold) iev=new Number(RegExp.$1);
if (navigator.appVersion.indexOf("MSIE 10") != -1) iev=10;
if (trident&&rv!=-1) iev=11;
// Firefox or IE 11
if(typeof InstallTrigger !== 'undefined' || iev == 11) {
var lastScrollTop = 0;
$(window).on('scroll', function() {
st = $(this).scrollTop();
if(st < lastScrollTop) {
console.log('Up');
}
else if(st > lastScrollTop) {
console.log('Down');
}
lastScrollTop = st;
});
}
// Other browsers
else {
$('body').on('mousewheel', function(e){
if(e.originalEvent.wheelDelta > 0) {
console.log('Up');
}
else if(e.originalEvent.wheelDelta < 0) {
console.log('Down');
}
});
}