【问题标题】:How to implement `scroll-spy` in such a way that multiple targets can be active at once?如何以可以同时激活多个目标的方式实现“滚动间谍”?
【发布时间】:2013-10-28 17:13:47
【问题描述】:

我最近一直在玩 Bootstrap,目前正在为我的网站创建一个新模板。我在这个问题上做了很多搜索,但我找到的大部分内容都是为那些根本无法让scrollspy 工作的人。

我想做的是创建一个侧面导航,它为字母表中的每个字母都有一个单独的目标。您单击一个链接可将您带到内容面板的该部分。内容面板将是一个按字母顺序排列的列表。手动滚动页面应该会自动将导航栏中的链接设置为active,从而突出显示字母(或者我决定通过 CSS 对它们执行的任何操作)。

对于那些熟悉 iPhone 的人来说,这很像他们在查看有组织的列表(例如 Contacts 应用程序)时实现的。假设视口显示了几个按字母顺序排列的名称,从视口顶部的D 和底部的H 开始。

使用scrollspy,只会突出显示最近的目标。下面的例子说明了我的意思。

示例:http://jsfiddle.net/panchroma/ExWDq/embedded/result/

我希望我已经足够具体,以便您了解我想要做什么。如果我在任何地方失去了你,请告诉我,我会尝试重新解释得更好。

scrollspy 是用来完成这项任务的工具吗?

如果我知道一种方法来检查一个元素是否在屏幕上可见,我也许可以利用它在 Javascript 中制作一些可以完成我需要的一切的东西,但我希望能够使用scrollspy为此。

感谢阅读。 :)

【问题讨论】:

    标签: javascript css twitter-bootstrap scrollspy affix


    【解决方案1】:

    我对 scrollspy 不熟悉,但你所追求的功能并不复杂:

    调整here 提供的函数,这应该会给你一个集合中哪些元素当前可见的列表。您可以根据这些信息应用/删除任何您想要的 CSS 类。

    您可以在浏览器中的“滚动”事件上运行此处理程序,但您可能想要“throttle”或“debounce”它。我相信有提供等效的 jQuery 插件,但每个只有十几行代码。

    function getVisible( $els ) {
        var docViewTop = $(window).scrollTop();
        var docViewBottom = docViewTop + $(window).height();
    
        return $els.filter(function(i, elem) {
            var elemTop = $(elem).offset().top;
            var elemBottom = elemTop + $(elem).height();
    
            // Fully or partially visible, pick one
    
            // element is _fully_ visible
            return ((elemBottom <= docViewBottom) && (elemTop >= docViewTop));
    
            // element is _partially_ visible
            return ((elemBottom <= docViewBottom) || (elemTop >= docViewTop));
        });
    }
    

    【讨论】:

    • 这将完美运行!我想我必须为每个部分添加一个与字母表中的字母相对应的类,然后使用 jQuery.each() 函数循环遍历它们,为每个项目调用 getVisible()。这对我来说是一个足够好的解决方案,但如果有人知道 Bootstrap 可以做到这一点的方式,我也会对它是如何完成的感兴趣。非常感谢你。 ++
    • 实际上这个函数的意图是你对你的all部分发出一个查询并将结果传递给这个函数。它将返回可见部分的列表。您可以使用data-sectionName 属性标记每个部分,以将其映射回导航。
    • 感谢您的澄清。我对整个$els.filter() 部分没有太多考虑,但现在我明白了它在做什么。那么,这比我想象的要有效得多。 :)
    猜你喜欢
    • 2018-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多