Як я можу визначити напрямок події прокрутки jQuery?


344

Я шукаю щось для цього:

$(window).scroll(function(event){
   if (/* magic code*/ ){
       // upscroll code
   } else {
      // downscroll code
   }
});

Будь-які ідеї?


Для тих, хто має проблеми з еластичною прокруткою, скористайтеся цією відповіддю stackoverflow.com/questions/7154967/jquery-detect-scrolldown
Тімоті Далтон

1
Найпростіше використовувати wheelподію в ці дні: stackoverflow.com/a/33334461/3168107 .
Shikkediel

Відповіді:


699

Перевірити поточний scrollTopпроти попередньогоscrollTop

var lastScrollTop = 0;
$(window).scroll(function(event){
   var st = $(this).scrollTop();
   if (st > lastScrollTop){
       // downscroll code
   } else {
      // upscroll code
   }
   lastScrollTop = st;
});

16
Будь-який спосіб встановити чутливість до цього?
какао-кодер

8
Я зробив приклад у цьому кодексі. Можливо, я оновлю оновлення цієї відповіді плагіном jQuery через популярність.
Джосія Рудделл

3
Ви спробували це, якщо ви повернулися на попередню сторінку з цим кодом? Якщо ви прокрутите сторінку вниз, скажімо, 500PX. Перейдіть на іншу сторінку, а потім поверніться до початкової сторінки. Деякі веб-переглядачі зберігають положення прокрутки, і вони повернуть вас назад. У вас буде старт lastScrollTopна 0 або це буде правильно ініціалізовано ??
TCHdvlp

7
@TCHdvlp - найгірший сценарій, коли перша подія прокрутки оновила б змінну, а друга подія була б точною (.. це було б важливо лише при підвищенні прокрутки після зворотної навігації). Це можна виправити, встановивши var lastScrollTop = $(window).scrollTop()після того, як браузер оновлює положення прокрутки при завантаженні сторінки.
Джосія Рудделл

2
Оновлення з цього приводу: Будьте уважні, що деякі веб-переглядачі, зокрема IE 11 для Windows 8, можуть запускати субпіксельну подію прокрутки (плавна прокрутка). Але оскільки він повідомляє scrollTop як ціле число, ваше попереднє значення прокрутки може бути таким же, як і поточне.
Ренато

168

Це можна зробити, не відслідковуючи попередній верхній прокрутки, як вимагають усі інші приклади:

$(window).bind('mousewheel', function(event) {
    if (event.originalEvent.wheelDelta >= 0) {
        console.log('Scroll up');
    }
    else {
        console.log('Scroll down');
    }
});

Я не є експертом з цього питання, тому сміливо вивчайте його далі, але, здається, коли ви використовуєте $(element).scroll, подія, яку слухають, - це подія "прокрутки".

Але якщо ви спеціально слухаєте mousewheelподію за допомогою функції bind, originalEventатрибут параметра події у вашому зворотному дзвінку містить різну інформацію. Частина цієї інформації є wheelDelta. Якщо це позитивно, ви перемістили мишовик вгору. Якщо це негативно, ви перемістили мишовик вниз.

Я здогадуюсь, що mousewheelподії загоряться, коли колесо миші повернеться, навіть якщо сторінка не прокручується; випадок, коли події "прокрутки", ймовірно, не запускаються. Якщо ви хочете, ви можете зателефонувати event.preventDefault()в нижній частині зворотного дзвінка, щоб запобігти прокрутці сторінки, і щоб ви могли використовувати подію колесо миші для чогось іншого, ніж прокрутка сторінки, як-от деякий тип функцій збільшення.


13
Приємно, але, на жаль, один і єдиний Firefox не підтримує його developer.mozilla.org/en-US/docs/DOM/DOM_event_reference/… (перевірено у FF v15). : C
нуала

8
Це було корисно для мене: мені потрібно було виявити прокрутку, хоча сама сторінка насправді не прокручувалася, тому scrollTopне оновлювалася. Насправді, $(window).scroll()взагалі не стріляли.
Martti Laine

13
Приємно, що вам не потрібна стара держава. Однак ця техніка не працюватиме на мобільних телефонах чи планшетах, оскільки у них немає мишоподібного колеса!
joeytwiddle

13
Цей підхід не буде працювати, якщо я прокручую клавіатуру. Це, безумовно, цікавий підхід до таких речей, як масштабування, але я не думаю, що він стосується питання прокрутки.
chmac

6
$ ("html, body"). bind ({'мишовик DOMMouseScroll onmousewheel touchmove scroll': function (e) {// ...}); працює для мене у виявленні всіх даних прокрутки браузера
GoreDefex

31

Збережіть попереднє місце прокрутки, а потім подивіться, чи є нове більше або менше.

Ось спосіб уникнути будь-яких глобальних змінних ( скрипка доступна тут ):

(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

29

Існуюче рішення

З цієї публікації та іншої відповіді може бути 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');
        }
    });

Тест на кілька браузерів

Я не міг перевірити його на Safari

хром 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 прокрутку
  • Рішення 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 прокрутку
  • Рішення 2
    • Вгору: Не працює
    • Вниз: не працює
  • Рішення 3
    • Вгору: 1 подія на 1 прокрутку
    • Вниз: 1 подія на 1 прокрутку

IE 8 (Win 7)

  • Рішення 1
    • Вгору: 2 події на 1 прокрутку (побічний ефект: внизу відбувся прокручування вниз)
    • Вниз: 2 ~ 4 події на 1 прокрутку
  • Рішення 2
    • Вгору: Не працює
    • Вниз: не працює
  • Рішення 3
    • Вгору: 1 подія на 1 прокрутку
    • Вниз: 1 подія на 1 прокрутку

Комбіноване рішення

Я перевірив, що побічний ефект від IE 11 і IE 8 походить із if elseзаяви. Отже, я замінив його на if else ifнаступне.

У результаті тестування кількох браузерів я вирішив використовувати Рішення 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.$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');
            }
        });
    }

Якщо хтось може додати результат Safari browser, було б корисно доповнити рішення.
Хімічний програміст

На жаль! Я виявив, що браузер Mobile Chrome і браузер за замовчуванням Android охоплюються лише Рішенням 1. Тож було б краще використовувати і Рішення 1, і 3 разом для покриття різних браузерів.
Хімічний програміст

Не буде працювати, якщо дизайн є фіксованим дизайном. Якщо ви хочете виявити напрямок прокрутки на статичному веб-сайті без прокрутки, Firefox та IE11 не працюватимуть
Shannon Hochkins

Я вважаю, що коли я користуюсь цим, він використовує "Інші браузери" в хромі, це не дуже корисно, коли ви хочете виявити прокрутку як колесом миші, так і смугою прокрутки. .scroll виявить обидва типи прокрутки в хромі.
Сем

12

Я розумію, що вже було прийнято відповідь, але хотів опублікувати те, що я використовую, якщо це може допомогти комусь. Я отримую напрямок на кшталтcliphex у випадку з подіями миші, але з підтримкою 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
    }
});

@EtienneMartin наведений вище код покладається на jQuery, якщо саме це спричинило вашу помилку. Перегляньте додану скрипку, щоб побачити, як вона працює.
souporserious

8

Прокрутіть подію

У подію прокрутки поводиться дивно в FF (він викликається багато разів з - за гладкості прокрутки) , але вона працює.

Примітка . Подія прокрутки насправді запускається під час перетягування смуги прокрутки, використовуючи клавіші курсору або мишу.

//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);
});

2
У мене вигляд фіксованої панелі, який відключає фактичну смугу прокрутки, тому мені потрібно було визначити напрямок колеса миші. Рішення вашого мишоподібного колеса прекрасно працювало в перехресному веб-переглядачі, тому дякую за це!
Шеннон Хочкінс

8

Якщо ви просто хочете дізнатися, чи прокручуєте ви вгору чи вниз за допомогою вказівного пристрою (миша або трекований майданчик), ви можете використовувати властивість deltaYwheel події.

$('.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>


Це посилання говорить, що не покладатися на deltaY developer.mozilla.org/en-US/docs/Web/Events/wheel
Чарлі Мартін

3
var tempScrollTop, currentScrollTop = 0; 

$(window).scroll(function(){ 

   currentScrollTop = $("#div").scrollTop(); 

   if (tempScrollTop > currentScrollTop ) {
       // upscroll code
   }
  else if (tempScrollTop < currentScrollTop ){
      // downscroll code
  }

  tempScrollTop = currentScrollTop; 
} 

або скористатися розширенням миші , дивіться тут .


3

Я бачив багато версій хороших відповідей тут, але, здається, у деяких людей виникають проблеми з веб-переглядачем, і це моє виправлення.

Я успішно використовував це для виявлення напрямку в FF, IE та Chrome ... Я не перевіряв його в сафарі, оскільки зазвичай використовую 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();


1
завжди повертається вниз на android GS5
SISYN

Це спрацювало чудово! У мене виникло питання з голосовою відповіддю на IE. У цьому немає цього питання! +1 від мене.
Радіація

3

Щоб ігнорувати будь-який оснащення / імпульс / відскок вгорі та внизу сторінки, ось модифікована версія прийнятої відповіді Йосії :

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;
});

3

Ви можете визначити напрямок миші.

$(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');
    }
});

3

Використовуйте це, щоб знайти напрямок прокрутки. Це лише для того, щоб знайти напрямок вертикального прокрутки. Підтримує всі крос-браузери.

    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");
        }

    }

Приклад


3

цей код відмінно працює з IE, Firefox, Opera та Chrome:

$(window).bind('wheel mousewheel', function(event) {
      if (event.originalEvent.deltaY >= 0) {
          console.log('Scroll down');
      }
      else {
          console.log('Scroll up');
      }
  });

'колесо миші' та властивість deltaY повинні використовуватися у функції bind () .

Пам'ятайте: Користувач повинен оновити свою систему та браузери з міркувань безпеки. У 2018 році виправдання "у мене є IE 7" - це нісенітниця. Ми повинні навчати користувачів.

Гарного дня :)


1
Я спробував ваш код, і це інший шлях. Перший спрацьовує при прокручуванні вниз, а другий - при прокручуванні вгору.
AlexioVay

Привіт :) Дякую AlexioVay. Я відредагував свій код (Про час теж!) ^^. Звичайно "console.log ('.......')" це лише приклад того, що ми можемо зробити.
Кирило Моралес

2

Нехай це буде дуже просто:

Спосіб слухача подій jQuery:

$(window).on('wheel', function(){
  whichDirection(event);
});

Спосіб слухача подій у ванілі:

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);
  }
}

Я написав більш поглиблений пост на цьому тут


Чи потрібне колесо jquery для використання версії jquery?
Hastig Zusammenstellen

1
jquery-wheel для цього не потрібно @HastigZusammenstellen
CR Rollyson

2

Ви можете використовувати як прокрутку, так і мишоподібне колесо, щоб відслідковувати рух вгору та вниз відразу.

 $('body').bind('scroll mousewheel', function(event) {

if (event.originalEvent.wheelDelta >= 0) {
      console.log('moving down');   
    }
    else {
      console.log('moving up'); 
    }
});

Ви також можете замінити "body" на (window).


Здається, добре працює в Chrome, але не у FF (55.0.2, Ubuntu)
Hastig Zusammenstellen

1

Зробіть приріст .data ()елемента прокрутки, ви зможете протестувати кількість разів, коли прокрутка досягла вершини.


1

Чому ніхто не використовує eventоб'єкт, повернутий jQueryна прокруті?

$window.on('scroll', function (event) {
    console.group('Scroll');
    console.info('Scroll event:', event);
    console.info('Position:', this.pageYOffset);
    console.info('Direction:', event.originalEvent.dir); // Here is the direction
    console.groupEnd();
});

Я використовую, chromiumі я не перевіряв інші браузери, чи є у них dirвластивість.


1

Оскільки bindзастаріло на v3 ("замінено on") і wheelтепер його підтримують , забудьте wheelDelta:

$(window).on('wheel', function(e) {
  if (e.originalEvent.deltaY > 0) {
    console.log('down');
  } else {
    console.log('up');
  }
  if (e.originalEvent.deltaX > 0) {
    console.log('right');
  } else {
    console.log('left');
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<h1 style="white-space:nowrap;overflow:scroll">
🚂🚃🚃🚂🚃🚃🚃🚂🚃🚃🚂🚃🚃🚃🚂🚃<br/>
🚎🚌🚌🚌🚎🚌🚌🚎🚌🚌🚌🚎🚌🚌🚎🚌<br/>
🚂🚃🚃🚂🚃🚃🚃🚂🚃🚃🚂🚃🚃🚃🚂🚃<br/>
🚎🚌🚌🚌🚎🚌🚌🚎🚌🚌🚌🚎🚌🚌🚎🚌<br/>
🚂🚃🚃🚂🚃🚃🚃🚂🚃🚃🚂🚃🚃🚃🚂🚃<br/>
🚎🚌🚌🚌🚎🚌🚌🚎🚌🚌🚌🚎🚌🚌🚎🚌<br/>
</h1>

wheelСумісність веб-переглядача події на MDN (2019-03-18) :

Сумісність колесного заходу


Код вище створює два консольні журнали, використовуйте наступне, щоб повністю розділити вгору / вниз / вліво / вправо: if(e.originalEvent.deltaY > 0) { console.log('down'); } else if(e.originalEvent.deltaY < 0) { console.log('up'); } else if(e.originalEvent.deltaX > 0) { console.log('right'); } else if(e.originalEvent.deltaX < 0) { console.log('left'); }
Дон Вілсон,

touchmoveНатомість для мобільних пристроїв .
CPHPython

1

Ви також можете використовувати це

$(document).ready(function(){

  var currentscroll_position = $(window).scrollTop();
$(window).on('scroll', function(){
Get_page_scroll_direction();
});

function Get_page_scroll_direction(){
  var running_scroll_position = $(window).scrollTop();
  if(running_scroll_position > currentscroll_position) {
      
      $('.direction_value').text('Scrolling Down Scripts');

  } else {
       
       $('.direction_value').text('Scrolling Up Scripts');

  }
  currentscroll_position = running_scroll_position;
}

});
.direction_value{
  position: fixed;
  height: 30px;
  background-color: #333;
  color: #fff;
  text-align: center;
  z-index: 99;
  left: 0;
  top: 0;
  width: 100%;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<div class="direction_value">
</div>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nisi ducimus expedita facilis architecto fugiat veniam natus suscipit amet beatae atque, enim recusandae quos, magnam, perferendis accusamus cumque nemo modi unde!</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nisi ducimus expedita facilis architecto fugiat veniam natus suscipit amet beatae atque, enim recusandae quos, magnam, perferendis accusamus cumque nemo modi unde!</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nisi ducimus expedita facilis architecto fugiat veniam natus suscipit amet beatae atque, enim recusandae quos, magnam, perferendis accusamus cumque nemo modi unde!</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nisi ducimus expedita facilis architecto fugiat veniam natus suscipit amet beatae atque, enim recusandae quos, magnam, perferendis accusamus cumque nemo modi unde!</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nisi ducimus expedita facilis architecto fugiat veniam natus suscipit amet beatae atque, enim recusandae quos, magnam, perferendis accusamus cumque nemo modi unde!</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nisi ducimus expedita facilis architecto fugiat veniam natus suscipit amet beatae atque, enim recusandae quos, magnam, perferendis accusamus cumque nemo modi unde!</p>


0

у .data()елементі елемента ви можете зберігати JSON і тестувати значення для запуску подій

{ top : 1,
   first_top_event: function(){ ...},
   second_top_event: function(){ ...},
   third_top_event: function(){ ...},
   scroll_down_event1: function(){ ...},
   scroll_down_event2: function(){ ...}
}

0

Це просте та легке виявлення, коли користувач прокручується вгору сторінки та коли повертається до початку.

$(window).scroll(function() {
    if($(window).scrollTop() > 0) {
        // User has scrolled
    } else {
        // User at top of page
    }
});

0

Це оптимальне рішення для визначення напрямку саме тоді, коли користувач закінчує прокрутку.

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));

});

0

Ви повинні спробувати це

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();
    });

0

У мене виникли проблеми з пружною прокруткою (підстрибування сувої, резинка ). Ігнорування події прокрутки вниз, якщо близько до верхньої сторінки сторінки працювало для мене.

var position = $(window).scrollTop();
$(window).scroll(function () {
    var scroll = $(window).scrollTop();
    var downScroll = scroll > position;
    var closeToTop = -120 < scroll && scroll < 120;
    if (downScroll && !closeToTop) {
        // scrolled down and not to close to top (to avoid Ipad elastic scroll-problems)
        $('.top-container').slideUp('fast');
        $('.main-header').addClass('padding-top');
    } else {
        // scrolled up
        $('.top-container').slideDown('fast');
        $('.main-header').removeClass('padding-top');
    }
    position = scroll;
});

0

Це працює у всіх браузерах ПК та телефонів, розширюючи відповіді на найвищі відповіді. Можна скласти більш складне вікно об'єкта події ["scroll_evt"], а потім викликати його у функції handleScroll (). Це спрацьовує для двох одночасних умов, якщо минула певна затримка або пройшла певна дельта для усунення деяких небажаних тригерів.

window["scroll_evt"]={"delta":0,"delay":0,"direction":0,"time":Date.now(),"pos":$(window).scrollTop(),"min_delta":120,"min_delay":10};
$(window).scroll(function() {

    var currentScroll = $(this).scrollTop();
    var currentTime = Date.now();
    var boolRun=(window["scroll_evt"]["min_delay"]>0)?(Math.abs(currentTime - window["scroll_evt"]["time"])>window["scroll_evt"]["min_delay"]):false;
    boolRun = boolRun && ((window["scroll_evt"]["min_delta"]>0)?(Math.abs(currentScroll - window["scroll_evt"]["pos"])>window["scroll_evt"]["min_delta"]):false);
    if(boolRun){
        window["scroll_evt"]["delta"] = currentScroll - window["scroll_evt"]["pos"];
        window["scroll_evt"]["direction"] = window["scroll_evt"]["delta"]>0?'down':'up';
        window["scroll_evt"]["delay"] =currentTime - window["scroll_evt"]["time"];//in milisecs!!!
        window["scroll_evt"]["pos"] = currentScroll;
        window["scroll_evt"]["time"] = currentTime;
        handleScroll();
    }
});


function handleScroll(){
    event.stopPropagation();
    //alert(window["scroll_evt"]["direction"]);
    console.log(window["scroll_evt"]);
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.