搜索

首页  >  问答  >  正文

javascript - scroll结束事件

需求滚动显示隐藏,需求就是: 滚动时菜单隐藏,滚动停止时菜单显示,但是不知道怎么监听scroll结束事件,求解惑

伊谢尔伦伊谢尔伦2770 天前1131

全部回复(3)我来回复

  • 淡淡烟草味

    淡淡烟草味2017-06-14 10:56:32

    把结束 handler 放在 scroll 事件中不断延时处理,scroll 事件停了之后就会触发。

    var scrollTimer
    const timeout = 400
    function handler () {
      // ...
    }
    document.addEventListener('scroll', () => {
      clearTimeout(scrollTimer)
      scrollTimer = setTimeout(handler, timeout)
    })

    回复
    0
  • 迷茫

    迷茫2017-06-14 10:56:32

    雷雷

    回复
    0
  • 学习ing

    学习ing2017-06-14 10:56:32

    可以考虑使用touch来模拟scroll,然后使用touchend
    如果一定要使用scroll,那就在scroll的回调中做延时处理,以jQuery为例。

    (function(){
     
        var special = jQuery.event.special,
            uid1 = 'D' + (+new Date()),
            uid2 = 'D' + (+new Date() + 1);
     
        special.scrollstart = {
            setup: function() {
     
                var timer,
                    handler =  function(evt) {
     
                        var _self = this,
                            _args = arguments;
     
                        if (timer) {
                            clearTimeout(timer);
                        } else {
                            evt.type = 'scrollstart';
                            jQuery.event.handle.apply(_self, _args);
                        }
     
                        timer = setTimeout( function(){
                            timer = null;
                        }, special.scrollstop.latency);
     
                    };
     
                jQuery(this).bind('scroll', handler).data(uid1, handler);
     
            },
            teardown: function(){
                jQuery(this).unbind( 'scroll', jQuery(this).data(uid1) );
            }
        };
     
        special.scrollstop = {
            latency: 300,
            setup: function() {
     
                var timer,
                        handler = function(evt) {
     
                        var _self = this,
                            _args = arguments;
     
                        if (timer) {
                            clearTimeout(timer);
                        }
     
                        timer = setTimeout( function(){
     
                            timer = null;
                            evt.type = 'scrollstop';
                            jQuery.event.handle.apply(_self, _args);
     
                        }, special.scrollstop.latency);
     
                    };
     
                jQuery(this).bind('scroll', handler).data(uid2, handler);
     
            },
            teardown: function() {
                jQuery(this).unbind( 'scroll', jQuery(this).data(uid2) );
            }
        };
     
    })();

    回复
    0
  • 取消回复