4

我正在使用fullPage.jsJQuery 插件(请参阅此处的演示)。该插件定义了全窗口大小的部分,并在用户向上或向下滚动时从“幻灯片”部分滚动到“幻灯片”。

我正在尝试修改它,以便在滚动开始时滚动事件不会立即触发,而是在短时间或一定滚动量之后触发,以防止用户意外滑动几个像素,这将触发滚动事件并滚动到下一张幻灯片。

例如,如果用户滚动 offset < 100px 则滚动回当前幻灯片,如果 offset > 100px 则滚动到下一张幻灯片。

fullpage.js代码。我认为我将不得不修改此功能以获得我想要的:

//when scrolling...
$(window).scroll(function(e){
        if(!options.autoScrolling){
                var currentScroll = $(window).scrollTop();

                var scrolledSections = $('.section').map(function(){
                        if ($(this).offset().top < (currentScroll + 100)){
                                return $(this);
                        }
                });

                //geting the last one, the current one on the screen
                var currentSection = scrolledSections[scrolledSections.length-1];

                //executing only once the first time we reach the section
                if(!currentSection.hasClass('active')){
                        var yMovement = getYmovement(currentSection);

                        $('.section.active').removeClass('active');
                        currentSection.addClass('active');

                        var anchorLink  = currentSection.data('anchor');
                        $.isFunction( options.onLeave ) && options.onLeave.call( this, currentSection.index('.section'), yMovement);

                        $.isFunction( options.afterLoad ) && options.afterLoad.call( this, anchorLink, (currentSection.index('.section') + 1));

                        activateMenuElement(anchorLink);        
                }
        }                                        
});

但我真的不知道该怎么做......我想我应该在滚动开始和滚动结束时获得滚动偏移/时间,获取差异,然后根据差异滚动到当前或下一张幻灯片,但我不不知道如何在这个函数中实现这个以及如何获取滚动结束事件。

而且我不确定是否使用“滚动结束事件”,因为如果用户想要向下或向上滚动,脚本不应该等待用户停止滚动以滚动到它必须滚动的位置。

也许我应该在滚动期间获得滚动偏移量,当偏移量 > x 时滚动到下一个,如果滚动停止并且偏移量 < x 则滚动回当前?或者我可以使用滚动时间而不是滚动偏移量?

4

1 回答 1

5

我猜您在使用笔记本电脑及其触控板而不是鼠标滚轮时遇到了麻烦。我对么?或者也许,使用 Apple 鼠标,它在滚动方面就像一个触控板。

好吧,只是让您知道,问题不在于$(window).scroll(function(e){函数,而在于MouseWheelHandler(). 该.scroll功能仅在选项autoScrolling设置为时使用,false如您在第一个条件中所见。

MouseWheelHandler()也就是说,每当它检测到鼠标滚轮或触控板上的任何滚动时,都会触发该函数。避免在第一个卷轴上触发它的一种方法是为它创建一个计数器。

您必须小心,因为触控板中的滚动比普通鼠标滚轮中的滚动要敏感得多,因此,在定义要使用的最小滚动数之前,请在两种设备上尝试。

我已经定义了一个设置为 0 的新变量:

var scrolls = 0;

然后,在里面MouseWheelHandler(),我添加了一个新的条件scrolls > 2

if(options.autoScrolling && scrolls>2){

这样,我们只会在滚动超过 3 次时触发事件,我相信这对于鼠标滚轮来说已经足够了。

如果我们不输入条件,那么我们增加变量:

}else{
    scrolls++;    
};

这是工作演示:http: //jsfiddle.net/prYUq/2/

这里是完整的修改功能:

var scrolls = 0;

 function MouseWheelHandler() {
     return function (e) {
         if (options.autoScrolling && scrolls > 2) {
             // cross-browser wheel delta
             e = window.event || e;
             var delta = Math.max(-1, Math.min(1, (e.wheelDelta || -e.detail)));
             e.wheelData

             console.log("e.wheelDelta: " + e.wheelDelta);
             console.log("-e.detail: " + e.detail);

             if (!isMoving) { //if theres any #
                 var scrollable = $('.section.active').find('.scrollable');

                 //scrolling down?
                 if (delta < 0) {
                     if (scrollable.length > 0) {
                         //is the scrollbar at the end of the scroll?
                         if (isScrolled('bottom', scrollable)) {
                             $.fn.fullpage.moveSlideDown();
                         } else {
                             return true; //normal scroll
                         }
                     } else {
                         $.fn.fullpage.moveSlideDown();
                     }
                 }

                 //scrolling up?
                 else {
                     if (scrollable.length > 0) {
                         //is the scrollbar at the start of the scroll?
                         if (isScrolled('top', scrollable)) {
                             $.fn.fullpage.moveSlideUp();
                         } else {
                             return true; //normal scroll
                         }
                     } else {
                         $.fn.fullpage.moveSlideUp();
                     }
                 }
             }
             scrolls = 0;

             return false;
         } else {
             scrolls++;
         };
     }
 }

如果您对该插件有特定问题或要求,请不要忘记此插件在 github 上的问题论坛:https ://github.com/alvarotrigo/fullPage.js/issues?state=open

我希望它有帮助。

于 2013-10-22T10:23:31.447 回答