【问题标题】:Smooth Scroll with Keyboard Navigation使用键盘导航平滑滚动
【发布时间】:2013-11-13 20:16:26
【问题描述】:

我正在尝试使用 Waypoints 和 Stellar jQuery 插件添加一些键盘导航。我有我的平滑滚动所有设置,因此当您单击链接时,它会将您带到适当的数据幻灯片位置。

我正在尝试实现键盘导航,以便在按下向上和向下键时,它会将您带到下一张或上一张数据幻灯片。我以为我在正确的轨道上,但似乎没有走到一起。

看起来我正在让 keydown 功能正常工作,但不是滚动到相应的数据幻灯片位置。

任何帮助将不胜感激!谢谢!

航点/平滑滚动导航

slide.waypoint(function (event, direction) {

    dataslide = $(this).attr('data-slide');

    if (direction === 'down') {
        $('.navigation li[data-slide="' + dataslide + '"]').addClass('active').prev().removeClass('active');
    }
    else {
        $('.navigation li[data-slide="' + dataslide + '"]').addClass('active').next().removeClass('active');
    }

});

mywindow.scroll(function () {
    if (mywindow.scrollTop() == 0) {
        $('.navigation li[data-slide="1"]').addClass('active');
        $('.navigation li[data-slide="2"]').removeClass('active');
    }
});

function goToByScroll(dataslide) {
    htmlbody.animate({
        scrollTop: $('.slide[data-slide="' + dataslide + '"]').offset().top
    }, 2000, 'easeInOutQuint');
}

links.click(function (e) {
    e.preventDefault();
    dataslide = $(this).attr('data-slide');
    goToByScroll(dataslide);
});

button.click(function (e) {
    e.preventDefault();
    dataslide = $(this).attr('data-slide');
    goToByScroll(dataslide);

});

我的键盘导航代码:

 mywindow.keydown(function(e) {
    if(e.keyCode == 40) { //DOWN
        e.preventDefault();
        alert('Down Arrow Has Been Pressed');
        goToByScroll();
    }
    else if (e.keyCode == 38) { //UP
        e.preventDefault();
        alert('Up Arrow Has Been Pressed');
        goToByScroll();
    }       
});

【问题讨论】:

    标签: javascript jquery smooth-scrolling jquery-waypoints


    【解决方案1】:

    当您使用键盘导航时,您没有使用参数调用您的 goToByScroll 函数 - 看起来这就是它不起作用的原因。您需要跟踪您的活动数据幻灯片,以便您可以将该变量传递给您的密钥处理程序中的 goToByScroll 函数。

    看起来像这样(这真的很粗糙):

    var currentDataSlide = 0;
    
    function goToByScroll(dataslide) {
        htmlbody.animate({
            scrollTop: $('.slide[data-slide="' + dataslide + '"]').offset().top
        }, 2000, 'easeInOutQuint');
    
        currentDataSlide = dataslide;
    }
    mywindow.keydown(function(e) {
        if(e.keyCode == 40) { //DOWN
            e.preventDefault();
            alert('Down Arrow Has Been Pressed');
            goToByScroll(currentDataSlide + 1);
        }
        else if (e.keyCode == 38) { //UP
            e.preventDefault();
            alert('Up Arrow Has Been Pressed');
            goToByScroll(currentDataSlide - 1);
        }       
    });
    

    这并不完美,但我们的想法是跟踪您的位置(滑动方式)并在您使用键处理程序时传递该变量。

    【讨论】:

    • 这也是我关心的问题。正在跟踪当前的数据幻灯片。这不就是这里发生的事情吗:dataslide = $(this).attr('data-slide');有没有办法通过“下一张”或“上一张”幻灯片?
    • if (direction === 'down') { $('.navigation li[data-slide="' + dataslide + '"]').addClass('active').prev( ).removeClass('active'); } else { $('.navigation li[data-slide="' + dataslide + '"]').addClass('active').next().removeClass('active');因此,例如,他们使用 next 或 prev 函数来确定哪张幻灯片也让苹果处于活动状态。相同的原则是否适用于传递下一张和上一张幻灯片。但是我们如何将它传递给滚动函数呢?
    • 如果是这种情况,并且 dataslide 是您的跟踪变量,那么请查看您的键盘处理程序 - 将 dataslide 传递给密钥处理程序中的滚动功能。你没有在那里传递任何东西——你只是在没有所需参数的情况下调用 gotobyscroll()。
    • 我意识到我需要传递一个参数,但我不认为 dataslide 是正确的参数。我更新了代码以传递 dataslide + 1 和 dataslide - 1 用于下一个和上一个。它的行为并不完全正确。如果您在幻灯片的开头并按向下键。它会触发,您会收到警报消息,但不会将滑块向下移动。如果您在当前幻灯片的中间,请按向上或向下键。它滚动到当前幻灯片的顶部。这是查看实时预览的链接。显然,这仍在开发中。 myedencreative.com/vantage_point
    • 现在我已经看到了你的完整代码,答案是否定的 - dataslide 设置在你的航点处理程序中,我对那个库一无所知。尝试在 document.ready 语句之后的其他声明附近添加 var currentSlide = 0,并在参数中使用 currentSlide。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多