Как определить направление события прокрутки jQuery?
Я ищу что-то вроде этого:
$(window).scroll(function(event){
if (/* magic code*/ ){
// upscroll code
} else {
// downscroll code
}
});
какие идеи?
22 ответов
посмотреть scrollTop
против
var lastScrollTop = 0;
$(window).scroll(function(event){
var st = $(this).scrollTop();
if (st > lastScrollTop){
// downscroll code
} else {
// upscroll code
}
lastScrollTop = st;
});
вы можете сделать это без необходимости отслеживать предыдущую верхнюю часть прокрутки, как и все другие примеры требуют:
$(window).bind('mousewheel', function(event) {
if (event.originalEvent.wheelDelta >= 0) {
console.log('Scroll up');
}
else {
console.log('Scroll down');
}
});
Я не эксперт по этому вопросу, поэтому не стесняйтесь исследовать его дальше, но кажется, что когда вы используете $(element).scroll
, прослушиваемое событие является событием "прокрутки".
но если вы специально слушать mousewheel
событие с помощью bind,originalEvent
атрибут параметра event для обратного вызова содержит другую информацию. Часть этого процесса информация wheelDelta
. Если он положительный, то вы передвинули мышиное колесо вверх. Если он отрицательный, вы переместили мышиное колесо вниз.
Я предполагаю, что mousewheel
события будут срабатывать, когда колесо мыши поворачивается, даже если страница не прокручивается; случай, в котором события "прокрутки", вероятно, не срабатывают. Если вы хотите, вы можете позвонить event.preventDefault()
в нижней части обратного вызова, чтобы предотвратить прокрутку страницы и чтобы вы могли использовать событие mousewheel для чего-то другого, чем прокрутка страницы, например некоторые типа функцией Зума.
сохраните предыдущее местоположение прокрутки, а затем посмотрите, больше или меньше нового.
вот способ избежать любых глобальных переменных (скрипку здесь):
(function () {
var previousScroll = 0;
$(window).scroll(function(){
var currentScroll = $(this).scrollTop();
if (currentScroll > previousScroll){
alert('down');
} else {
alert('up');
}
previousScroll = currentScroll;
});
}()); //run this anonymous function immediately
Существующее Решение
не может быть 3 решение из этой публикации и другого ответа.
Решение 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');
}
});
Multi Browser Test
я не мог протестировать его на Safari
chrome 42 (Win 7)
- решение Один
- Up: 1 Событие на 1 прокрутку
- вниз : 1 Событие на 1 свиток
- Soltion 2
- итог : не работает
- вниз : не работает
- решение 3
- Up: 1 Событие на 1 прокрутку
- вниз : 1 Событие на 1 свиток
Firefox 37 (Win 7)
- Решение 1
- Up: 20 событий за 1 свиток
- вниз: 20 событий на 1 прокрутку
- Soltion 2
- итог : не работает
- вниз : 1 Событие на 1 свиток
- решение 3
- итог : не работает
- вниз : не работает
IE 11 (Win 8)
- Решение 1
- вверх : 10 событий на 1 прокрутку (побочный эффект: прокрутка вниз наконец-то!)
- вниз: 10 событий на 1 прокрутку
- Soltion 2
- итог : не работает
- вниз : не работает
- решение 3
- итог : не работает
- вниз : 1 Событие на 1 свиток
IE 10 (Win 7)
- Решение 1
- Up: 1 Событие на 1 прокрутку
- вниз : 1 Событие на 1 свиток
- Soltion 2
- итог : не работает
- вниз : не работает
- решение 3
- Up: 1 Событие на 1 прокрутку
- вниз : 1 Событие на 1 свиток
IE 9 (Win 7)
- Решение 1
- Up: 1 Событие на 1 прокрутку
- вниз : 1 Событие на 1 свиток
- Soltion 2
- итог : не работает
- вниз : не работает
- решение 3
- Up: 1 Событие на 1 прокрутку
- вниз : 1 Событие на 1 свиток
IE 8 (Win 7)
- Решение 1
- вверх: 2 события на 1 прокрутку (побочный эффект : прокрутка вниз произошла наконец)
- вниз : 2~4 события за 1 свиток
- Soltion 2
- итог : не работает
- вниз : не работает
- решение 3
- Up: 1 Событие на 1 прокрутку
- вниз : 1 Событие на 1 свиток
Комбинированное Решение
Я проверил, что побочный эффект от IE 11 и IE 8 с
if else
заявление. Итак, Я заменил его наif else if
заявление следующее.
из теста multi browser я решил использовать решение 3 для обычных браузеров, и Решение 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.);
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');
}
});
}
Я понимаю, что уже был принят ответ, но хотел опубликовать то, что я использую, если это может помочь кому-либо. Я получаю направление, как cliphex
С событием mousewheel, но с поддержкой Firefox. Это полезно делать так, если вы делаете что-то вроде блокировки прокрутки и не можете получить текущую вершину прокрутки.
смотрите живую версию здесь.
$(window).on('mousewheel DOMMouseScroll', function (e) {
var direction = (function () {
var delta = (e.type === 'DOMMouseScroll' ?
e.originalEvent.detail * -40 :
e.originalEvent.wheelDelta);
return delta > 0 ? 0 : 1;
}());
if(direction === 1) {
// scroll down
}
if(direction === 0) {
// scroll up
}
});
Событие Scroll
на событие Scroll ведет себя странно в FF (он запускается много раз из-за плавности прокрутки), но он работает.
Примечание: The свиток событие уволен при перетаскивании полосы прокрутки с помощью клавиш курсора или колесика мыши.
//creates an element to print the scroll position
$("<p id='test'>").appendTo("body").css({
padding: "5px 7px",
background: "#e9e9e9",
position: "fixed",
bottom: "15px",
left: "35px"
});
//binds the "scroll" event
$(window).scroll(function (e) {
var target = e.currentTarget,
self = $(target),
scrollTop = window.pageYOffset || target.scrollTop,
lastScrollTop = self.data("lastScrollTop") || 0,
scrollHeight = target.scrollHeight || document.body.scrollHeight,
scrollText = "";
if (scrollTop > lastScrollTop) {
scrollText = "<b>scroll down</b>";
} else {
scrollText = "<b>scroll up</b>";
}
$("#test").html(scrollText +
"<br>innerHeight: " + self.innerHeight() +
"<br>scrollHeight: " + scrollHeight +
"<br>scrollTop: " + scrollTop +
"<br>lastScrollTop: " + lastScrollTop);
if (scrollHeight - scrollTop === self.innerHeight()) {
console.log("► End of scroll");
}
//saves the current scrollTop
self.data("lastScrollTop", scrollTop);
});
Событие Колеса
вы также можете взглянуть на MDN, он выставляет большой информация о Событие Колеса.
Примечание: руль событие запускается только при использовании колесика мыши; клавиши курсора и перетаскивание полосы прокрутки не запускают событие.
Я прочитал документ и пример:прослушивание этого события через браузер
и после некоторых тестов с FF, IE, chrome, safari, я закончил с этим фрагмент:
//creates an element to print the scroll position
$("<p id='test'>").appendTo("body").css({
padding: "5px 7px",
background: "#e9e9e9",
position: "fixed",
bottom: "15px",
left: "15px"
});
//attach the "wheel" event if it is supported, otherwise "mousewheel" event is used
$("html").on(("onwheel" in document.createElement("div") ? "wheel" : "mousewheel"), function (e) {
var evt = e.originalEvent || e;
//this is what really matters
var deltaY = evt.deltaY || (-1 / 40 * evt.wheelDelta), //wheel || mousewheel
scrollTop = $(this).scrollTop() || $("body").scrollTop(), //fix safari
scrollText = "";
if (deltaY > 0) {
scrollText = "<b>scroll down</b>";
} else {
scrollText = "<b>scroll up</b>";
}
//console.log("Event: ", evt);
$("#test").html(scrollText +
"<br>clientHeight: " + this.clientHeight +
"<br>scrollHeight: " + this.scrollHeight +
"<br>scrollTop: " + scrollTop +
"<br>deltaY: " + deltaY);
});
в случае, если вы просто хотите знать, если вы выполните прокрутку вверх или вниз с помощью указателя (мыши и сенсорной панели) можно использовать deltaY свойства wheel
событие.
$('.container').on('wheel', function(event) {
if (event.originalEvent.deltaY > 0) {
$('.result').append('Scrolled down!<br>');
} else {
$('.result').append('Scrolled up!<br>');
}
});
.container {
height: 200px;
width: 400px;
margin: 20px;
border: 1px solid black;
overflow-y: auto;
}
.content {
height: 300px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="container">
<div class="content">
Scroll me!
</div>
</div>
<div class="result">
<p>Action:</p>
</div>
var tempScrollTop, currentScrollTop = 0;
$(window).scroll(function(){
currentScrollTop = $("#div").scrollTop();
if (tempScrollTop > currentScrollTop ) {
// upscroll code
}
else if (tempScrollTop < currentScrollTop ){
// downscroll code
}
tempScrollTop = currentScrollTop;
}
или использовать расширение колесико мыши см. здесь.
чтобы игнорировать любую привязку / импульс / отскок в верхней и нижней части страницы, Вот измененная версия принятый ответ Джосайи:
var prevScrollTop = 0;
$(window).scroll(function(event){
var scrollTop = $(this).scrollTop();
if ( scrollTop < 0 ) {
scrollTop = 0;
}
if ( scrollTop > $('body').height() - $(window).height() ) {
scrollTop = $('body').height() - $(window).height();
}
if (scrollTop >= prevScrollTop && scrollTop) {
// scrolling down
} else {
// scrolling up
}
prevScrollTop = scrollTop;
});
вы можете определить направление mousewhell.
$(window).on('mousewheel DOMMouseScroll', function (e) {
var delta = e.originalEvent.wheelDelta ?
e.originalEvent.wheelDelta : -e.originalEvent.detail;
if (delta >= 0) {
console.log('scroll up');
} else {
console.log('scroll down');
}
});
Я видел много версий хороших ответов здесь, но, похоже, у некоторых людей возникают проблемы с кросс-браузером, поэтому это мое исправление.
Я успешно использовал это для определения направления в FF, IE и Chrome ... Я не тестировал его в safari, поскольку обычно использую windows.
$("html, body").bind({'mousewheel DOMMouseScroll onmousewheel touchmove scroll':
function(e) {
if (e.target.id == 'el') return;
e.preventDefault();
e.stopPropagation();
//Determine Direction
if (e.originalEvent.wheelDelta && e.originalEvent.wheelDelta >= 0) {
//Up
alert("up");
} else if (e.originalEvent.detail && e.originalEvent.detail <= 0) {
//Up
alert("up");
} else {
//Down
alert("down");
}
}
});
имейте в виду, что я также использую это, чтобы остановить прокрутку, поэтому, если вы хотите, чтобы прокрутка все еще происходила, вы должны удалить e.preventDefault(); e.stopPropagation();
использовать это, чтобы найти направление прокрутки. Это только для того чтобы найти направление вертикальной прокрутки. Поддерживает все кросс-браузеры.
var scrollableElement = document.getElementById('scrollableElement');
scrollableElement.addEventListener('wheel', findScrollDirectionOtherBrowsers);
function findScrollDirectionOtherBrowsers(event){
var delta;
if (event.wheelDelta){
delta = event.wheelDelta;
}else{
delta = -1 * event.deltaY;
}
if (delta < 0){
console.log("DOWN");
}else if (delta > 0){
console.log("UP");
}
}
акции инкремент в .data ()
прокручиваемого элемента, вы сможете проверить количество раз, когда прокрутка достигла вершины.
держите его супер просто:
jQuery прослушиватель событий путь:
$(window).on('wheel', function(){
whichDirection(event);
});
Vanilla JavaScript Прослушиватель Событий Путь:
if(window.addEventListener){
addEventListener('wheel', whichDirection, false);
} else if (window.attachEvent) {
attachEvent('wheel', whichDirection, false);
}
Функция Остается Прежней:
function whichDirection(event){
console.log(event + ' WheelEvent has all kinds of good stuff to work with');
var scrollDirection = event.deltaY;
if(scrollDirection === 1){
console.log('meet me at the club, going down', scrollDirection);
} else if(scrollDirection === -1) {
console.log('Going up, on a tuesday', scrollDirection);
}
}
Я написал более глубокий пост на нем здесь
вы можете использовать как прокрутку, так и опцию mousewheel для отслеживания движения вверх и вниз одновременно.
$('body').bind('scroll mousewheel', function(event) {
if (event.originalEvent.wheelDelta >= 0) {
console.log('moving down');
}
else {
console.log('moving up');
}
});
вы также можете заменить "тело" на (окно).
этот код отлично работает с IE, Firefox, Opera и Chrome:
$(window).bind('wheel mousewheel', function(event) {
if (event.originalEvent.deltaY >= 0) {
console.log('Scroll up');
}
else {
console.log('Scroll down');
}
});
'колесо колесо' и администрацией deltaY необходимо использовать в bind ()
на .data()
элемента вы можете хранить JSON и тестовые значения для запуска событий
{ top : 1,
first_top_event: function(){ ...},
second_top_event: function(){ ...},
third_top_event: function(){ ...},
scroll_down_event1: function(){ ...},
scroll_down_event2: function(){ ...}
}
Это простое и легкое обнаружение, когда пользователь прокручивает от верхней части страницы и когда они возвращаются к вершине.
$(window).scroll(function() {
if($(window).scrollTop() > 0) {
// User has scrolled
} else {
// User at top of page
}
});
это оптимальное решение для обнаружения направления, когда пользователь заканчивает прокрутку.
var currentScrollTop = 0 ;
$(window).bind('scroll', function () {
scrollTop = $(this).scrollTop();
clearTimeout($.data(this, 'scrollTimer'));
$.data(this, 'scrollTimer', setTimeout(function() {
if(scrollTop > currentScrollTop){
// downscroll code
$('.mfb-component--bl').addClass('mfbHide');
}else{
// upscroll code
$('.mfb-component--bl').removeClass('mfbHide');
}
currentScrollTop = scrollTop;
}, 250));
});
вы должны попробовать это
var scrl
$(window).scroll(function(){
if($(window).scrollTop() < scrl){
//some code while previous scroll
}else{
if($(window).scrollTop() > 200){
//scroll while downward
}else{//scroll while downward after some specific height
}
}
scrl = $(window).scrollTop();
});