【问题标题】:Switch tabs based on mouse scroll根据鼠标滚动切换标签
【发布时间】:2013-06-06 01:10:19
【问题描述】:

我想在包含多个选项卡的网页上添加一个小部件。当用户滚动页面并且小部件进入查看并且他继续向下滚动时,选项卡应该被一一激活(页面不会进一步向下滚动)。显示最后一个选项卡后,页面应照常恢复滚动。使用 JS/jQuery 是否可行?

更新: 由于这似乎是一个过于宽泛的问题: 问题是,我不知道如何使用滚动偏移量并防止页面向下滚动,直到我决定它可以恢复其正常行为

更新 2 我创建了This fiddle

$(document).ready(function(){

    $('#tabbed').mouseover(function(){
        $(this).focus();
    }).scroll(function(){
        console.log("scrolling tabs");
    });

    $(window).scroll(function(evt){
        var scrollPos = $(this).scrollTop()
        console.log(scrollPos); 

        // BULLETPROOF WAY TO DETECT IF THE MOUSE IS OVER THE
        // SCROLLABLE DIV AND GIVE IT FOCUS HERE?
    });
});

它在其内容中包含一个长页面和一个可滚动的 div。唯一的问题是,只有当我移动鼠标时,div 才会开始捕捉滚动事件。如果我能找到一种在鼠标悬停时激活滚动 div 的防弹方法,我就在那里。有什么想法吗?

【问题讨论】:

  • 这是可行的,如果您可以尝试一下并且有问题,那么我们可以提供帮助
  • @Arun P Johny 我编辑了我的问题。
  • 你可以在stackoverflow.com/questions/4770025/…得到一些见解

标签: javascript jquery


【解决方案1】:

您无法阻止使用 javascript 滚动。仅当鼠标悬停在 iframe 和 div 上时才能使用滚动。

您可以取消与滚动相关的鼠标滚轮和按键事件,但用户将能够使用滚动条进行滚动(更多 here)。

另一种方法是留下一个空白区域并将您的小部件固定在该区域内,例如working example

$(window).bind('scroll', function()
{
    var scroll = $(window).scrollTop(),
        innerHeight = window.innerHeight || $(window).height(),
        fooScroll = $('#fooScroll'),
        emptyArea = $('#emptyArea'),
        offset = emptyArea.offset(),
        fixedClass = 'fixed';

    if(scroll > offset.top)
    {
        if(scroll < offset.top + emptyArea.height() - fooScroll.height())
        {
            fooScroll.addClass(fixedClass);
            fooScroll.css("top", 0);
        }
        else
        {
            fooScroll.removeClass(fixedClass);
            fooScroll.css("top", emptyArea.height() - fooScroll.height());
        }
    }
    else
    {
        fooScroll.removeClass(fixedClass);
        fooScroll.css("top", 0);
    }
});

然后您可以在页面滚动时更改选项卡。

【讨论】:

    【解决方案2】:

    你应该能够做到这一点。每当用户向上或向下滚动时,您都可以使用jQuery scroll event 运行您自己的代码。此外,只要在触发滚动事件时调用e.preventDefault(),就可以防止整个窗口向上或向下滚动。

    【讨论】:

    • 你无法阻止我发现的滚动事件。
    • 啊,对不起,我只是假设我会猜。我自己没有这样做过。不确定这是否会有所帮助,但也许您可以尝试在传递给滚动的回调结束时也返回 false ?这将防止滚动事件冒泡到其他处理程序。
    • 我在问这个问题之前尝试了那些东西,它们都不起作用。不过感谢您的建议
    • 您可能已经知道的其他内容:显然在谷歌搜索后我发现您想要做的称为视差滚动(或者至少视差滚动与您想要的类似)。 Stellar.js 显然是一个对此有所帮助的库。
    猜你喜欢
    • 1970-01-01
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 2015-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多