Визначення напрямку прокрутки


119

Тому я намагаюся використовувати JavaScript on scrollдля виклику функції. Але я хотів знати, чи зможу я визначити напрямок прокрутки, не використовуючи jQuery. Якщо ні, то чи існують якісь обхідні шляхи?

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

Я тільки що спробував використовувати цей код, але він не спрацював:

if document.body.scrollTop <= 0 {
    alert ("scrolling down")
} else {
    alert ("scrolling up")
}

Це wheelDeltaподія. Зовсім не крос-браузер. Дивіться phrogz.net/js/wheeldelta.html
marekful

1
хммм не зовсім те, що я шукав, але я ціную вашу допомогу: P Будь-які інші пропозиції?
dwinnbrown

Відповіді:


176

Його можна виявити, зберігаючи попереднє scrollTopзначення та порівнюючи з ним поточне значення scrollTop.

JavaScript:

var lastScrollTop = 0;

// element should be replaced with the actual target element on which you have applied scroll, use window in case of no target element.
element.addEventListener("scroll", function(){ // or window.addEventListener("scroll"....
   var st = window.pageYOffset || document.documentElement.scrollTop; // Credits: "https://github.com/qeremy/so/blob/master/so.dom.js#L426"
   if (st > lastScrollTop){
      // downscroll code
   } else {
      // upscroll code
   }
   lastScrollTop = st <= 0 ? 0 : st; // For Mobile or negative scrolling
}, false);

20
Безпечніше було б ініціалізувати lastScrollTopсторінкуYOffset || scrollTop замість того, щоб вважати 0
Ed Ballot

Повністю згоден !! Дякуємо @EdBallot. Ми повинні ініціалізувати те саме на події window.onload.
Prateek

@Prateek Дякую за вашу відповідь, але вона не працює для мене ... Я намагаюся "змінити сцену" у своєму веб-сайті, який побудований за допомогою Tumult Hype.
dwinnbrown

Я додав кілька коментарів у свою відповідь, будь ласка, перевірте це. Я думаю, ви використовуєте "element.addEventListener".
Prateek

@Prateek все ще нічого не боюся. Чи це може бути пов'язано з тим, що я запускаю його під час завантаження сторінки? Ось скріншот: i.imgur.com/Q0H0T4s.png
dwinnbrown

53

Простий спосіб зафіксувати всі події прокрутки (дотик та колесо)

window.onscroll = function(e) {
  // print "false" if direction is down and "true" if up
  console.log(this.oldScroll > this.scrollY);
  this.oldScroll = this.scrollY;
}

10
Ласкаво просимо до SO, якщо ви додасте допис у відповідь, це може бути кориснішим для ОП та для інших.
Алехандро Монтілья

32

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

var scrollableElement = document.body; //document.getElementById('scrollableElement');

scrollableElement.addEventListener('wheel', checkScrollDirection);

function checkScrollDirection(event) {
  if (checkScrollDirectionIsUp(event)) {
    console.log('UP');
  } else {
    console.log('Down');
  }
}

function checkScrollDirectionIsUp(event) {
  if (event.wheelDelta) {
    return event.wheelDelta > 0;
  }
  return event.deltaY < 0;
}

Приклад


2
Це добре, але, здається, працює лише для використання колеса прокрутки
Jonathan.Brink

1
З веб-протоколів MDN: Примітка. Не плутайте події колеса з подіями прокрутки. Дія за замовчуванням для колесної події залежить від впровадження, і не обов'язково розсилає подію прокрутки. Навіть коли це відбувається, значення delta * у події колеса не обов'язково відображають напрямок прокрутки вмісту. Тому не покладайтеся на властивості дельти * події колеса, щоб отримати напрямок прокрутки. Натомість виявляйте зміни значення scrollLeft та scrollTop цілі у події прокрутки. developer.mozilla.org/en-US/docs/Web/API/Element/wheel_event
battaboombattabaam

10

Ви можете спробувати це зробити.

function scrollDetect(){
  var lastScroll = 0;

  window.onscroll = function() {
      let currentScroll = document.documentElement.scrollTop || document.body.scrollTop; // Get Current Scroll Value

      if (currentScroll > 0 && lastScroll <= currentScroll){
        lastScroll = currentScroll;
        document.getElementById("scrollLoc").innerHTML = "Scrolling DOWN";
      }else{
        lastScroll = currentScroll;
        document.getElementById("scrollLoc").innerHTML = "Scrolling UP";
      }
  };
}


scrollDetect();
html,body{
  height:100%;
  width:100%;
  margin:0;
  padding:0;
}

.cont{
  height:100%;
  width:100%;
}

.item{
  margin:0;
  padding:0;
  height:100%;
  width:100%;
  background: #ffad33;
}

.red{
  background: red;
}

p{
  position:fixed;
  font-size:25px;
  top:5%;
  left:5%;
}
<div class="cont">
  <div class="item"></div>
  <div class="item red"></div>
  <p id="scrollLoc">0</p>
</div>


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

8

Це доповнення до того, на що відповів prateek. Здається, в коді в IE є збій, тому я вирішив змінити його трохи нічого фантазійного (просто інша умова)

$('document').ready(function() {
var lastScrollTop = 0;
$(window).scroll(function(event){
   var st = $(this).scrollTop();
   if (st > lastScrollTop){
       console.log("down")
   }
   else if(st == lastScrollTop)
   {
     //do nothing 
     //In IE this is an important condition because there seems to be some instances where the last scrollTop is equal to the new one
   }
   else {
      console.log("up")
   }
   lastScrollTop = st;
});});

1
Дякуємо за вашу підказку ... це, здається, пов’язане з варіантом IE "Плавне прокручування"
Kristo

5
  1. Ініціалізуйте стару оцінку
  2. Отримайте нову оцінку, слухаючи подію
  3. Відняти два
  4. Зробіть висновок з результату
  5. Оновіть oldValue новою Value

// Ініціалізація

let oldValue = 0;

// Прослуховування події

window.addEventListener('scroll', function(e){

    // Get the new Value
    newValue = window.pageYOffset;

    //Subtract the two and conclude
    if(oldValue - newValue < 0){
        console.log("Up");
    } else if(oldValue - newValue > 0){
        console.log("Down");
    }

    // Update the old value
    oldValue = newValue;
});

3

Ви можете отримати положення смуги прокрутки, використовуючи document.documentElement.scrollTop. І тоді це просто питання порівняння його з попередньою позицією.


Гаразд і чи можу я все-таки використовувати це на веб-сайті, який традиційно не дозволить прокручувати (тобто він відповідає браузеру на 100% шириною та висотою. Дякую
dwinnbrown

2

Цей простий код працює: Перевірте консоль на результати.

let scroll_position = 0;
let scroll_direction;

window.addEventListener('scroll', function(e){
    scroll_direction = (document.body.getBoundingClientRect()).top > scroll_position ? 'up' : 'down';
    scroll_position = (document.body.getBoundingClientRect()).top;
    console.log(scroll_direction);
});

1

Я особисто використовую цей код, щоб виявити напрямок прокрутки в JavaScript ... Просто потрібно визначити змінну, щоб зберігати значення tracrollvalue, а потім використовувати це, якщо & else

let lastscrollvalue;

function headeronscroll() {

    // document on which scroll event will occur
    var a = document.querySelector('.refcontainer'); 

    if (lastscrollvalue == undefined) {

        lastscrollvalue = a.scrollTop;

        // sets lastscrollvalue
    } else if (a.scrollTop > lastscrollvalue) {

        // downscroll rules will be here
        lastscrollvalue = a.scrollTop;

    } else if (a.scrollTop < lastscrollvalue) {

        // upscroll rules will be here
        lastscrollvalue = a.scrollTop;

    }
}

0

Простий код

// Events
$(document).on('mousewheel DOMMouseScroll', "element", function(e) {
    let delta = e.originalEvent.wheelDelta;
    
    if (delta > 0 || e.originalEvent.detail < 0) upScrollFunction();
    if (delta < 0 || e.originalEvent.detail > 0) donwScrollFunction();
}

Хоча цей код може відповісти на питання, надаючи додатковий контекст щодо того, як та / або чому він вирішує проблему, покращить довгострокове значення відповіді.
Дональд Дак
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.