当部分在页面上滚动时处于活动状态时,突出显示目录中的项目

2024-01-15

当您向下滚动页面时,我试图突出显示粘性目录中的当前部分项目。

目前的结构是这样的:

<div>
    <div>
        <div>
            <div>
                <h2 id="twitter-chats-for-ecommerce">Header</h2>
                <div>content...</div>
            </div>
        </div>
    </div>
</div>

目录如下:

<ul>
    <li><a href="#">Item 1</a></li>
    <li><a href="#">Item 1</a></li>
    <li><a href="#twitter-chats-for-ecommerce">Twitter Chats for Ecommerce</a></li>
</ul>

锚点通过 WordPress 中的古腾堡块(在本例中为 h2)自动应用于标头。

现有的 JavaScript 如下:

(function($) {

    /* Table of contents - highlight active section on scroll */

    window.addEventListener('DOMContentLoaded', () => {

        const observer = new IntersectionObserver(entries => {
        entries.forEach(entry => {
            const id = entry.target.getAttribute('id');
            if (entry.intersectionRatio > 0) {
            document.querySelector(`nav li a[href="#${id}"]`).parentElement.classList.add('active');
            } else {
            document.querySelector(`nav li a[href="#${id}"]`).parentElement.classList.remove('active');
            }
        });
        });
    
        // Track all sections that have an `id` applied
        document.querySelectorAll('h2[id]').forEach((section) => {
        observer.observe(section);
        });
        
    });

})( jQuery );

但正如您从下面的示例屏幕截图中看到的,当匹配的标题(在本例中为 h2)在页面上可见时,目录中的项目会突出显示。

因此,如果页面上有多个可见标题,则目录中会突出显示多个项目。

理想情况下,我猜它应该与该部分的 div 匹配,但 id 锚点被应用于标题,而我无法控制这一点。

有没有一种方法可以修改 JS 以某种方式只检测整个 div 部分而不仅仅是标题,这样它就只会在目录中突出显示一个项目 - 或者有比这更好的方法吗?

可以看到我想要实现的完美运行的示例here https://developer.atlassian.com/server/confluence/writing-a-confluence-theme/(请参阅右侧边栏中的“在此页面上”部分)。


我修改了 randomdude 的答案以突出显示最低的滚动到标题。这将持续突出显示该链接,直到用户向下滚动足够远到另一个链接。

const anchors = $('body').find('h1');

$(window).scroll(function(){
    var scrollTop = $(document).scrollTop();
    
    // highlight the last scrolled-to: set everything inactive first
    for (var i = 0; i < anchors.length; i++){
        $('nav ul li a[href="#' + $(anchors[i]).attr('id') + '"]').removeClass('active');
    }
    
    // then iterate backwards, on the first match highlight it and break
    for (var i = anchors.length-1; i >= 0; i--){
        if (scrollTop > $(anchors[i]).offset().top - 75) {
            $('nav ul li a[href="#' + $(anchors[i]).attr('id') + '"]').addClass('active');
            break;
        }
    }
});

分叉的小提琴链接:http://jsfiddle.net/tz6yxfk3/ http://jsfiddle.net/tz6yxfk3/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当部分在页面上滚动时处于活动状态时,突出显示目录中的项目 的相关文章

随机推荐

  • Autofac - 构建前解决

    使用 Unity 可以在构建容器之前解决依赖关系 Autofac 也可以吗 下面的代码演示了我的场景 我需要解决ICacheRepository为了 更新 单例CacheHelper 在 Unity 中 这可以简单地完成container
  • 4 个浮动 DIV 在使用 CSS 的缩小屏幕上对称响应

    1 2 3 4 我有四个向左浮动的 DIV 上图 使用简单的 CSS float left 宽度 128 像素 高度 128 像素 当我缩小屏幕时 最后一个 DIV 正确跳到下一行 1 2 3 4 但我真正想要的是最后两个块跳到下一行 以保
  • 将数据集导出到 Excel 2007 EPPlus

    我正在尝试将数据集导出到 excel 2007 我无法使用用于在内容类型中使用 mime 类型导出的正常代码 如下所示 Response ContentType application ms excel 如果我对 xls 使用 mime 类
  • 将时间分成间隔

    我有三个输入 开始时间 End time 间隔时间 Example start time 01 00 end time 01 30 intervel time 10 min 我需要像 01 00 01 10 01 20 01 30 这样的输
  • 如何在单个查询中更改所有表前缀

    我对 mysql 非常业余 你能告诉我如何在单个查询中更改整个数据库的表前缀 我可以手动执行此操作 但更改所有表前缀非常耗时 请帮帮我 就像 isc administrator log 到 cus administrator log 意味着
  • 发出局部变量并为其赋值

    我正在初始化一个整数变量 如下所示 LocalBuilder a ilGen DeclareLocal typeof Int32 我如何访问它并为其赋值 我想做这样的事情 int a b a 5 b 6 return a b Use the
  • 在 Python 中进行自动属性分配的最佳方法是什么?这是一个好主意吗?

    而不是每次定义类时都编写这样的代码 class Foo object def init self a b c d e f g self a a self b b self c c self d d self e e self f f sel
  • php刷新当前页面?

    我有一个页面 如果设置了变量 在会话中 它会执行一个动作 然后它会取消会话 现在它必须自我更新 这就是我被困住的地方 有没有办法获取当前页面的确切 url 或者有一个函数可以做到这一点吗 so header location header
  • 使用 SVG 仅填充半颗星

    对于我正在构建的评级系统 有没有办法向这个 svg 示例添加一个 css 类 以便它只显示填充的一半星号 参见jsbin http jsbin com cifip 2 http jsbin com cifip 2 在此示例中 当前填充为黄色
  • TinyMCE 增加字体系列下拉字体大小

    有谁知道如何增加 TinyMCE 中 字体系列下拉 列表项的字体大小 Thanks 您需要创建一个自己的 css 文件并使用 tinymce 配置参数 content css your css file css 您的 css 文件必须包含以
  • gradle 存储库指向具有多个库的本地目录

    我对本地存储库的 build gradle 中的构建依赖项有疑问 即使用本地目录 dependencies compile fileTree include jar dir libs 它只解决libs目录中的依赖关系还是解决lib目录中所有
  • 获取经过身份验证的 Facebook 用户的年龄,无需进一步的权限提示

    使用 Facebook Graph API 是否可以在不首先提示用户年龄 或年龄范围 的情况下获取用户的年龄 或年龄范围 user birthday or friends birthday允许 你不能 年龄要求user birthday o
  • 我需要帮助使用 Knockout 格式化数据绑定

    我对 Knockout 相当陌生 我正在寻找格式化输出的方法 我看到了一个类似这样的例子 但我的尝试当然是行不通的 这是 jsfiddle 的链接 http jsfiddle net cezmp http jsfiddle net cezm
  • Django的URL字段测试问题

    有人可以解释一下为什么这个网址吗http www nacolmeia com br do Home oferta EnERURLField 的 Django 生成的表单不被接受 Thanks 您是否在尝试验证该网站的同一台服务器上托管该网站
  • Faye 和 Nodejs:如何运行 Faye 服务器端客户端?

    我正在尝试开发一个 Faye 服务器端客户端以根据需要自动运行 在Faye的官方网站上 我只找到了关于服务器端客户端的文档 没有关于如何运行它的信息 请告诉我该怎么做 谢谢 文档中缺少一个关键部分 看来你需要打电话client connec
  • 为什么 PHP 4.4.9 抛出“解析错误:语法错误,意外的 T_STATIC”? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我刚刚意识
  • Spring:@Component 与 @Bean

    我明白那个 Component注解是在 spring 2 5 中引入的 目的是通过使用类路径扫描来摆脱 xml bean 定义 Bean于 spring 3 0 中引入 可与 Configuration为了完全摆脱 xml 文件并使用 ja
  • 线程状态阻塞和等待之间的区别[重复]

    这个问题在这里已经有答案了 我已通过以下帖子阅读了答案 WAIT 和 BLOCKED 线程状态之间的区别 https stackoverflow com questions 15680422 difference between wait
  • 我可以扩展 Button 以添加右键单击事件,同时也保留图形副作用吗?

    我正在尝试扩展 Button 以添加右键单击事件 我的客户想要一个按钮来执行不同的操作 具体取决于您是左键单击还是右键单击 我预计会有一个简单的右键单击事件 但事实证明没有 我希望 Button 的视觉行为与预先存在的 Click 事件相同
  • 当部分在页面上滚动时处于活动状态时,突出显示目录中的项目

    当您向下滚动页面时 我试图突出显示粘性目录中的当前部分项目 目前的结构是这样的 div div div div h2 Header h2 div content div div div div div 目录如下 ul li a href I