小编典典

当div#滚动到视图中时,jQuery在导航上更改CSS

css

该站点使用一个向下滚动的大页面。当您向下滚动并传递不同的部分时,当相应的div出现时,左侧的菜单导航会将css类更改为“当前”。

我猜想这可以通过jQuery使用$(window).height();来完成。

我对jQuery很陌生,我想写的是这样的东西(用外行术语):

  • 获取浏览器窗口的高度–如果div#content1从顶部到顶部100px,和/或从底部到底部200px,将更改菜单a#link1更改为’.current’–否则从所有菜单a链接中删除.current

…并重复4个不同的内容div。

谁能指出我正确的方向..?谢谢。


阅读 314

收藏
2020-05-16

共1个答案

小编典典

我没有看过代码示例(挑战自己:P更有趣),但是这就是我要这样做的方式- 。

我保存了每个元素块的位置,以最大程度地减少DOM调用的次数,然后仅在数组中进行搜索。帮助您了解一些变量。

$(window).height() // returns the viewport height
$(document).height() // returns the height of the entire document
$(window).scrollTop() // returns the Y position of the document that is at the top of the viewport

脚本:

var topRange      = 200,  // measure from the top of the viewport to X pixels down
    edgeMargin    = 20,   // margin above the top or margin from the end of the page
    animationTime = 1200, // time in milliseconds
    contentTop = [];

$(document).ready(function(){

 // Stop animated scroll if the user does something
 $('html,body').bind('scroll mousedown DOMMouseScroll mousewheel keyup', function(e){
  if ( e.which > 0 || e.type == 'mousedown' || e.type == 'mousewheel' ){
   $('html,body').stop();
  }
 });

 // Set up content an array of locations
 $('#sidemenu').find('a').each(function(){
  contentTop.push( $( $(this).attr('href') ).offset().top );
 });

 // Animate menu scroll to content
  $('#sidemenu').find('a').click(function(){
   var sel = this,
       newTop = Math.min( contentTop[ $('#sidemenu a').index( $(this) ) ], $(document).height() - $(window).height() ); // get content top or top position if at the document bottom
   $('html,body').stop().animate({ 'scrollTop' : newTop }, animationTime, function(){
    window.location.hash = $(sel).attr('href');
   });
   return false;
 });

 // adjust side menu
 $(window).scroll(function(){
  var winTop = $(window).scrollTop(),
      bodyHt = $(document).height(),
      vpHt = $(window).height() + edgeMargin;  // viewport height + margin
  $.each( contentTop, function(i,loc){
   if ( ( loc > winTop - edgeMargin && ( loc < winTop + topRange || ( winTop + vpHt ) >= bodyHt ) ) ){
    $('#sidemenu li')
     .removeClass('selected')
     .eq(i).addClass('selected');
   }
  });
 });

});
2020-05-16