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、2015年

回答:


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プラグインで更新します。
Josiah Ruddell、2012年

3
このコードがある前のページに戻った場合、これを試しましたか?ページを下にスクロールする場合は、500PXとしましょう。別のページに移動してから、最初のページに戻ります。一部のブラウザはスクロール位置を保持し、ページを下に戻します。あなたはlastScrollTop0 から始めますか、それとも適切に初期化されますか?
TCHdvlp 2013

7
@TCHdvlp-最悪の場合のシナリオでは、最初のスクロールイベントが変数を更新し、2番目のイベントが正確になります(バックナビゲーション後のアップスクロールでのみ問題になります)。これはvar lastScrollTop = $(window).scrollTop()、ブラウザがページの読み込み時にスクロール位置を更新した後に設定することで修正できます。
ジョサイア・ラデル2013

2
これに関する更新:一部のブラウザー、特にWindows 8のIE 11は、サブピクセルベースのスクロールイベント(スムーズスクロール)を起動できることに注意してください。ただし、scrollTopを整数として報告するため、以前のスクロール値は現在のスクロール値と同じになる可能性があります。
Renato

168

他のすべての例が必要とするので、前のスクロールトップを追跡する必要なく、それを行うことができます:

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

私はこれの専門家ではないので、自由に調査してください。しかし、を使用する$(element).scrollと、リッスンされているイベントは「スクロール」イベントのようです。

ただし、mousewheelバインドを使用して特定のイベントをリッスンする場合originalEvent、コールバックに対するイベントパラメータの属性には異なる情報が含まれます。その情報の一部ですwheelDelta。正の場合は、マウスホイールを上に動かしました。負の場合は、マウスホイールを下に動かしました。

私の推測ではmousewheel、ページがスクロールしない場合でも、マウスホイールが回転するとイベントが発生します。「スクロール」イベントが発生しない可能性があるケース。必要に応じて、event.preventDefault()コールバックの下部でを呼び出して、ページがスクロールしないようにすることができます。これにより、マウスホイールイベントを、ページスクロール以外の何か(ある種のズーム機能など)に使用できます。


13
ニース残念ながら唯一のFirefoxはサポートされていないdeveloper.mozilla.org/en-US/docs/DOM/DOM_event_reference/...(FFのV15でテストを)。:C
nuala 2012

8
これは私にとって便利でした。ページ自体は実際にはスクロールscrollTopしなかったため、更新しなかったとしても、スクロールを検出する必要がありました。実際に$(window).scroll()は、まったく発砲しませんでした。
Martti Laine、

13
古い状態が必要ないのは素晴らしいことです。ただし、マウスホイールがないため、この手法は携帯電話やタブレットでは機能しません。
joeytwiddle 2013

13
この方法は、キーボードでスクロールすると機能しません。これは間違いなくズームのようなものにとって興味深いアプローチですが、スクロール方向の質問には対応していないと思います。
chmac

6
$( "html、body")。bind({'mousewheel DOMMouseScroll onmousewheel touchmove scroll':function(e){// ...}); すべてのブラウザスクロールデータを検出するのに
役立ち

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
    • Up:1スクロールあたり1イベント
    • ダウン:1スクロールあたり1イベント
  • 解決2
    • Up:機能していません
    • ダウン:機能していません
  • 解決策3
    • Up:1スクロールあたり1イベント
    • ダウン:1スクロールあたり1イベント

Firefox 37(Win 7)

  • 解決策1
    • Up:1スクロールあたり20イベント
    • ダウン:1スクロールあたり20イベント
  • 解決2
    • Up:機能していません
    • ダウン:1スクロールあたり1イベント
  • 解決策3
    • Up:機能していません
    • ダウン:機能していません

IE 11(Win 8)

  • 解決策1
    • 上:1スクロールあたり10イベント(副作用:最後に下スクロールが発生しました)
    • ダウン:1スクロールあたり10イベント
  • 解決2
    • Up:機能していません
    • ダウン:機能していません
  • 解決策3
    • Up:機能していません
    • ダウン:1スクロールあたり1イベント

IE 10(Win 7)

  • 解決策1
    • Up:1スクロールあたり1イベント
    • ダウン:1スクロールあたり1イベント
  • 解決2
    • Up:機能していません
    • ダウン:機能していません
  • 解決策3
    • Up:1スクロールあたり1イベント
    • ダウン:1スクロールあたり1イベント

IE 9(Win 7)

  • 解決策1
    • Up:1スクロールあたり1イベント
    • ダウン:1スクロールあたり1イベント
  • 解決2
    • Up:機能していません
    • ダウン:機能していません
  • 解決策3
    • Up:1スクロールあたり1イベント
    • ダウン:1スクロールあたり1イベント

IE 8(Win 7)

  • 解決策1
    • 上:1スクロールあたり2イベント(副作用:最後に下スクロールが発生しました)
    • ダウン:1スクロールあたり2〜4イベント
  • 解決2
    • Up:機能していません
    • ダウン:機能していません
  • 解決策3
    • Up:1スクロールあたり1イベント
    • ダウン:1スクロールあたり1イベント

組み合わせたソリューション

IE 11とIE 8の副作用がif elseステートメントからのものであることを確認しました。なので、if else if以下のように置き換えました。

マルチブラウザテストから、一般的なブラウザにはソリューション3を使用し、FirefoxとIE 11にはソリューション1を使用することにしました。

この回答を参照し 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を一緒に使用して、さまざまなブラウザーをカバーすることをお勧めします。
ケミカルプログラマー、

デザインが固定レイアウトデザインの場合は機能しません。静的なスクロールしないWebサイトでスクロール方向を検出する場合、FirefoxとIE11は機能しません
Shannon Hochkins

これを使用すると、Chromeの「その他のブラウザ」が使用されますが、マウスホイールとスクロールバーの両方によるスクロールを検出する場合は、あまり使用されません。.scrollは、クロムの両方のタイプのスクロールを検出します。
Sam

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に依存しています。それが機能しているのを確認するには、添付のフィドルを参照してください。
2015年

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もご覧くださいホイールイベントに関する優れた情報が公開されています。

注: wheelイベントは、mousewheelを使用している場合にのみ発生します。カーソルキーとスクロールバーをドラッグしてもイベントは発生しません。

私はドキュメントと例を読みました:ブラウザー全体でこのイベントを聞いて
、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
実際のスクロールバーを無効にする固定パネルビューがあるので、マウスホイールからの方向を検出する必要がありました。あなたのマウスホイールソリューションはブラウザ間で完全に動作したので、ありがとうございます!
Shannon Hochkins 16年

8

ポインターデバイス(マウスまたはトラックパッド)を使用して上下にスクロールするかどうかを知りたいだけの場合は、イベントの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>




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。
ラドメーション2018年

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

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

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

「ホイールマウスホイール」とプロパティdeltaYbind()関数で使用する必要があります。

注意:セキュリティ上の理由から、ユーザーはシステムとブラウザを更新する必要があります。2018年、「IE 7を持っている」という言い訳はナンセンスです。ユーザーを教育する必要があります。

良い一日を過ごしてください :)


1
私はあなたのコードを試しました、そしてそれは逆です。1つ目は下にスクロールしたときにトリガーされ、2つ目は上にスクロールしたときにトリガーされます。
AlexioVay 2018

こんにちは:) AlexioVayに感謝します。私は自分のコードを編集しました(時間についても!)^^。もちろん、「console.log( '.......')」は、私たちにできることの単なる例です。
Cyril Morales

2

超シンプルに保つ:

jQueryイベントリスナーの方法:

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

バニラ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);
  }
}

私はそれにもっと徹底的記事を書いたここに


jqueryバージョンを使用するにはjquery-wheelが必要ですか?
Hastig Zusammenstellen 2017

1
この@HastigZusammenstellenにはjquery-wheelは必要ありません
CR Rollyson '26 / 09/17

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 '26 / 09/26

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>

wheelMDN(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 2019

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

これはすべてのPCまたは電話のブラウザーで機能し、上位の回答を拡張します。より複雑なイベントオブジェクトwindow ["scroll_evt"]を作成し、それをhandleScroll()関数で呼び出すことができます。特定の遅延が経過した場合、または特定のデルタが渡されて不要なトリガーが排除された場合、これは2つの同時条件でトリガーされます。

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"]);
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.