【问题标题】:Adding a class to a link inside a <li> element on scrolling在滚动时将类添加到 <li> 元素内的链接
【发布时间】:2014-09-19 12:54:17
【问题描述】:

当页面的某个部分处于活动状态时,是否可以将类添加到 li 元素内的链接?

我有一个单页网站,并且希望在通过滚动到达页面的特定部分时更改链接的颜色。

这是我的 HTML:

<header id="header"> 
        <section class="container">
                <nav>
                    <a class="logo" href="index.html">Logo</a>
                    <div id="menu">
                        <ul id="links"> 
                            <li><a href="#services">Services</a></li>
                            <li><a href="#about">About</a></li>
                            <li><a href="#clients">Clients</a></li>  
                            <li class="last"><a href="#contact">Contact</a></li>
                        </ul>
                    </div>
                </nav>
        </section>
    </header>  

这是 CSS:

#menu li a {
    color:#7a7a7a;
    text-decoration: none;
    font-size: 12px;
    margin-right:20px;
}

#menu li.last a {
    color:#7a7a7a;
    text-decoration: none;
    font-size: 12px;
    margin-right:0px;
}

#menu li.current a {
color: #0086be;
}

我想做的是在到达页面的特定部分时将 .current 类添加到 li 元素内的链接。

我相信这只能通过 Javascript 实现,谁能指出实现这一目标的正确途径?

提前致谢

【问题讨论】:

  • 你的意思是当mouseOver时悬停它?
  • 你可以使用简单的 jquery 来实现。参考jsfiddle.net/ggNrr
  • Css 无法添加或删除元素的属性/类。
  • 目前还不清楚您到底要做什么。您想响应页面上的滚动位置,还是鼠标位置?
  • 基本上我只是想在到达页面位置时更改链接的颜色。例如;我正在滚动页面,当我通过不同的部分(ID 为#services、#about、#clients、#contact)时,导航栏上的链接颜色会发生变化。

标签: javascript html css class add


【解决方案1】:

我认为您希望在引导程序中使用 scrollspy 之类的东西, 你可以使用它或者你可以找到https://gist.github.com/pascaldevink/2380129bypascaldevink

或者这里是小提琴http://jsfiddle.net/ia_archiver/Kb7xq/

您将需要 jquery,

 $.fn.scrollspy = function ( option ) {
    return this.each(function () {
      var $this = $(this)
        , data = $this.data('scrollspy')
        , options = typeof option == 'object' && option
      if (!data) $this.data('scrollspy', (data = new ScrollSpy(this, options)))
      if (typeof option == 'string') data[option]()
    })
  }
  $.fn.scrollspy.Constructor = ScrollSpy
  $.fn.scrollspy.defaults = {
    offset: 10
  }
  $(function () {
    $('[data-spy="scroll"]').each(function () {
      var $spy = $(this)
      $spy.scrollspy($spy.data())
    })
  })

}(window.jQuery);

【讨论】:

    【解决方案2】:

    使用悬停功能可以实现这一点。即在页面的特定部分悬停时,您将类添加到 li 内的链接。例如

      $('#specificPartOfPageId').hover(function(){
          $('#links').children().children('a').addClass('current');
      });
    

    这会将 .current 类添加到该 UL 元素内的每个链接。
    希望这会有所帮助。

    【讨论】:

    • 这真的很有道理,我想这正是我想要做的,但尝试过并没有奏效。
    【解决方案3】:

    如果我理解正确,我想这就是您需要的:jsFiddle。 CSS 和 HTML 代码保持不变,这是我使用的 jQuery 代码:

    $(window).scroll(function() {    
    
    var scroll = $(window).scrollTop();
    
    if (scroll > 500) {
    $("#links li:first-child").addClass("current");
    }
    
    if (scroll > 750) {
    $("#links li:first-child").removeClass("current");
    $("#links li:nth-child(2)").addClass("current");
    }
    
    var scrollBottom = $(window).scrollTop() + $(window).height();
    
    if (scroll < 500) {
    $("#links li:first-child").removeClass("current");
    }
    
    if (scroll < 750) {
    $("#links li:nth-child(2)").removeClass("current");
    }
    
    });
    

    基本上,当您向下滚动到 500 像素时,li:first-child 会自动分配给 current 类。您可以根据需要添加更多 if 查询来修改 jQuery 以满足您的需要。您可以使用 li:first-childli:nth-child(2) 等不同的子选择器来定位列表中的不同 &lt;li&gt;

    【讨论】:

    • 差不多了!问题是,在达到 500 像素后,链接仍保留在 .current 类中,我想删除该类以恢复原始颜色。例如,在 500 到 750 像素之间,我希望链接为蓝色(添加 .current 类),但超出范围我希望它返回灰色(删除 .current 类)。
    • 请使用新的 jsFiddle 链接检查我的更新答案。基本上在 500px-750px 之间,li:first-child 被分配 current 类,在 750px 之后,当我相信你的下一页将开始时,li:nth-child(2) 被赋予 current 类。同样,当您滚动回顶部时,当您通过它们的区域时,这些类将被删​​除。
    • 更新小提琴:jsfiddle.net/1dmzbtvs/24。在这个小提琴中,当您向上或向下滚动时,您可以看到导航菜单中的所有 4 个项目都会改变颜色。
    • 非常感谢您的惊人努力,我真的很感激!这可行,但我认为这可能不是最好的方法,因为屏幕分辨率......小屏幕用户将不得不滚动比大屏幕用户更多的滚动,导致链接过早改变颜色页面的特定部分尚不可见,大屏幕用户甚至不会滚动到页面的最后部分。
    猜你喜欢
    • 1970-01-01
    • 2016-10-15
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    相关资源
    最近更新 更多