带有原生滚动条的整页滑块

时间:2014-11-27 18:32:40

标签: javascript jquery html css fullpage.js

我正在构建一个保持原生滚动条的整页滑块,允许用户自由滚动,使用鼠标滚轮或导航点(左侧)切换到幻灯片。

一旦用户在最后一张幻灯片上并尝试进一步向下滚动,整个滑块向上移动以显示一个简单的可滚动部分。如果用户向下滚动然后尝试返回,则此新部分将再次移开并将滑块返回到视图中。

小提琴:http://jsfiddle.net/3odc8zmx/

我正在努力的部分:

  1. 只有前两个导航点有效。如果你看第一张幻灯片的区域,第三个工作。但是没有做任何事情,如果你在幻灯片2上。注意:紫色的是页面第二部分的快捷方式,与滑块无关。
  2. 当移动到最后一张幻灯片时(通过点,如果你在第一张幻灯片上),它会导致整个滑块向上移动,因为当用户滑过最后一张幻灯片时以上描述。我试图使用一个名为listen的变量来解决这个问题,当使用showSlide方法时,监听停止滚动事件监听...但即使我将其设置为false,它似乎也是真的,并且只有在动画之后才将其重置为true。 ..
  3. 使用鼠标滚轮向下滚动时,我可以到达第二部分并备份,但不能到达第一部分。 我想知道我是否可以使用showSlide方法来更好地处理它,而不是我已实现的当前脏的next和prev函数。
  4. 注意:如果用户已经自由滚动,当他们使用鼠标滚轮时,我希望滑块能够捕捉到最近的幻灯片以进行自我纠正...有关如何做到这一点的任何建议吗? / em>的

    有人能提供一些帮助吗?

    这是JS:

    var listen = true;
    
    function nextSlide()
    {
        $('#section1').stop(true,false).animate({
            scrollTop: $('#section1').scrollTop() + $(window).height()
        });
    }
    
    function prevSlide()
    {
        $('#section1').stop(true,false).animate({
            scrollTop: -$('#section1').scrollTop() + $(window).height()
        });
    }
    
    function showSlide(index)
    {
        var offset = $('#section1 div').eq(index).offset();
            offset = offset.top;
        if(offset){
            listen = false;
            $('.slide-dot').removeClass('active');
            $('.slide-dot').eq(index).addClass('active');       
            $('#section1').stop(true,false).animate({
                scrollTop: offset
            }, 500, function(){
                listen = true;
            });
        } else {
            alert('error');
        }
    }
    
    $(document).ready(function(){
    
        var fullHeight = 0;
    
        $('#section1 div').each(function(){
            fullHeight = fullHeight + $(this).height();
        });
    
        var lastScrollTop1 = 0;
        $('#section1').on('scroll', function(e){
            var st = $(this).scrollTop();
            if (st > lastScrollTop1){
                if( $('#section1').scrollTop() + $(window).height() == fullHeight) {
                    if(listen){
                        $('body').addClass('shifted');
                    }
                }
            }
            lastScrollTop1 = st;
        });
    
        $('#section1').on('mousewheel', function(e){
            e.preventDefault();
            var st = $(this).scrollTop();
            if (st > lastScrollTop1){
                nextSlide();
            } else {
                prevSlide();
            }
        });
    
        var lastScrollTop2 = 0;
        $('#section2').on('scroll', function(e){            
            var st = $(this).scrollTop();
            if (st > lastScrollTop1){
            } else {    
                if( st == 0 ){
                    $('body').removeClass('shifted');
                }
            }
            lastScrollTop1 = st;
        });
    
        $('.slide-dots').css({'margin-top':-$('.slide-dots').height() / 2});    
        $('.slide-dot').first().addClass('active');
    
        $(document).on('click', '.slide-dot', function(e){
            e.preventDefault();
            showSlide( $(this).index() );
        });
    
        $(document).on('click', '.slide-dot-fake', function(e){
            e.preventDefault();
            $('body').addClass('shifted');
        });
    
    });
    

    对于那些想知道为什么我没有使用类似fullPage.js的人,这是因为它无法处理我想要在两个区域之间转换的方式并且有两个滚动条(每个区域一个)。

2 个答案:

答案 0 :(得分:4)

您可以使用:

e.originalEvent.wheelDelta

而不是:

st > lastScrollTop1

mousewheel事件中针对您的第三个问题检查用户是否向上或向下滚动。并且还更改prevSlide中的+/-。我使用dm4web的小提琴来解决你的第一个问题。我用过:

scrollTop: offset - 1

而不是:

scrollTop: offset

对于你的第二个问题,因为当滚动到达第三个元素的最后一个像素时,它会自动转到下一个区域,因此1个像素就足够了。

这是小提琴:http://jsfiddle.net/3odc8zmx/3/

答案 1 :(得分:1)

正如@chdltest所建议的那样,你可以使用fullPage.js来实现。

此处an example。转到最后一节。

用于示例的代码:

<强>的Javascript

$('#fullpage').fullpage({
    sectionsColor: ['yellow', 'orange', '#C0C0C0', '#ADD8E6'],
    scrollOverflow: true,
    scrollBar: true,
    afterLoad: function (anchor, index) {

        //hiding the main scroll bar
        if (index == 4) {
            $('body, html').css('overflow', 'hidden');
        }

        //showing the main scroll bar
        if (index == 3) {
            $('body, html').css('overflow', 'visible');
        }
    }
});


CSS (如果您更喜欢使用普通样式)

/* Normal style scroll bar 
* --------------------------------------- */
 .slimScrollBar {
    display: none !important;
}
.fp-scrollable {
    overflow: auto !important;
}

使用fullPage.js代替您自己的代码的优点:

  • 在不同的设备和浏览器中进行了强有力的测试。 (IE,Opera,Safari,Chrome,Firefox ..)
  • 防止触控板,Apple笔记本电脑触控板或Apple Magic Mouse鼠标出现问题。
  • 旧浏览器的兼容性,例如IE 8,Opera 12 ......
  • 触控设备兼容性(IE Windows Phone,Android,Apple iOS,触控台式机......)
  • 它提供了许多其他有用的选项和回调。