滚动时突出显示菜单(如果到达 div)

Posted

技术标签:

【中文标题】滚动时突出显示菜单(如果到达 div)【英文标题】:highlight menu on scrolling (if reach div) 【发布时间】:2015-02-21 00:52:37 【问题描述】:

如果 div 滚动//或单击,我想突出显示菜单点。

http://jsfiddle.net/WeboGraph/vu6hN/2/(这是我想要的一个例子)

我的代码: (JS)

    $(document).ready(function()
      $('nav a').on('click', function(event) 
          $(this).parent().find('a').removeClass('active_underlined');
          $(this).addClass('active_underlined');
      );

      $(window).on('scroll', function() 
          $('.target').each(function() 
              if($(window).scrollTop() >= $(this).position().top) 
                  var id = $(this).attr('id');
                  $('nav a').removeClass('active_underlined');
                  $('nav a[href=#'+ id +']').addClass('active_underlined');
              
          );
      );
    );

我的(html 导航)

        <nav>
           <div id="cssmenu">
              <ul id="horizontalmenu" class="underlinemenu">
                  <li><a data-scroll href="#fdesigns"  class="active_underlined">FDesigns</a> </li>
                  <li><a data-scroll href="#skills">skills</a> </li>
                  <li><a data-scroll href="#workflow">WORKFLOW</a> </li>
                  <li><a data-scroll href="#portfolio">Portfolio</a> </li>
                  <li><a data-scroll href="#about">About</a> </li>
                  <li><a data-scroll href="#kontakt">Kontakt</a> </li>
              </ul>   
          </div>
        </nav> 

我的(css)

.active_underlined a 
  color: #fff;
  border-bottom: 2px solid #ebebeb;


a.active_underlined 
  color: #fff;
  border-bottom: 2px solid #ebebeb;

这里是项目的链接:http://www.f-designs.de/test_onesite

【问题讨论】:

那个小提琴似乎工作正常。究竟是什么问题? f-designs.de/test_onesite 这是我的网站,它不适用于小提琴上面的代码是我想要在我的页面上的示例 position() 方法在您的 .target 项目上返回 (0,0) 的位置。这意味着if($(window).scrollTop() &gt;= $(this).position().top) 始终为真。 【参考方案1】:

在 2018 年发现此问题,并在尝试使用更新版本的 jquery (+1.0) 进行复制时遇到语法错误。在最后一行$('nav a[href=#'+ id +']') 中,属性没有正确转义,需要像$('nav a[href="#'+ id +'"]') 一样(注意添加了“”)。

我在这里找到了这个https://api.jquery.com/attribute-contains-selector/

【讨论】:

【参考方案2】:

使用$(this).offset().top 而不是$(this).position().top

Fiddle

.position() 获取匹配元素集中第一个元素相对于偏移父元素的当前坐标,而.offset() 获取匹配元素集中第一个元素相对于文档的当前坐标.

在您的网站中,所有类在 .target 内的 DIV 都在其中,因此类 .target 的所有元素都返回值 .position().top 等于 0。

通过使if 条件如下来减小偏移值,以便当元素到达菜单时class 发生变化:

if($(window).scrollTop() >= $(this).offset().top - $("#cssmenu").height())

【讨论】:

嘿,谢谢它的工作原理,但是现在如果我单击菜单,则在单击的元素被突出显示之前的元素(也许我必须设置 .offset top 在浏览器顶部之前计算一些像素?)你可以请帮帮我? 更新答案。您只需从偏移量减少cssmenu 高度。顺便说一句,您的网站看起来很棒。 @gaurav kalyan,如果你喜欢我的网站,谢谢 :) 你能给我一个更详细的答案//解释我必须做什么吗?谢谢和圣诞快乐 我也建议使用@tris timb 的答案。

以上是关于滚动时突出显示菜单(如果到达 div)的主要内容,如果未能解决你的问题,请参考以下文章

向下滚动到部分时突出显示菜单项

滚动时突出显示多个菜单锚链接

切换 div 并突出显示当前菜单项

滚动时多个菜单锚链接会突出显示

突出显示滚动条上的特定区域

ListView 项目在滚动后保持突出显示