jquery 滚轴滚动 导航定位和锚点定位

 自己写的,只测试了ie9+, firefox,chrome 

 以下js更好

    var fixbar={
      init:function(){
        "use strict";
        // 滚轴 导航位置变化
        var that=this;
        this._navbar=$("#navbar");
        this._navbody=$("#navbody");
       
        this._navbodyTop=this._navbody.offset().top; //导航目标标签 距离页面顶部高度
        console.log(this._navbodyTop+"====")
        this._navbarH=this._navbar.outerHeight(); //导航高度
        this._navbodyH=this._navbarH;// 给内容默认导航的高度

        this._navbodyBottom=this._navbodyTop; //内容页的最底端距离页面顶部高度
        this._navbodyBottomFix=this._navbodyTop; //内容页的最底端距离页面顶部高度 - 导航的高度
        this._navbarTop=0; //导航 距离内容页顶部的高度

        this._imgh=[]; //内容页 图片距离页面顶部的高度
        // this._lastimg= this._navbody.find("img:last-child");
        // if(this._lastimg[0].complete){console.log(1); //ie使用
        //   this.setH();
        // }else{   console.log(0); 
          // this._lastimg.load(function(){  that.setH();});
          $(window).load(function(){  that.setH();});
          // this.scrollGoto();
        // }
        this.linkhref();   
        $(window).scroll(function() {
            that.scrollGoto(); 
        });
      },
      setH:function(){ 
          //导航定位
          this._navbodyH=this._navbody.outerHeight();
          this._navbodyBottom=this._navbodyTop+this._navbodyH;
          this._navbodyBottomFix=this._navbodyTop+this._navbodyH-this._navbarH;
          this._navbarTop=this._navbodyH-this._navbarH-10;
          // 导航锚点定位
          var that=this;
          this._navbody.find("img").each(function(){
              that._imgh.push($(this).offset().top-100);
          });
          this.scrollGoto();
      },
      scrollGoto:function(){            
          this._scrollT=$(window).scrollTop(); 
          if(this._scrollT>this._navbodyTop){
            //修改导航位置
            if(this._scrollT<this._navbodyBottomFix){
              this._navbar.addClass("fixed").removeAttr("style");
            }else{
              this._navbar.removeClass("fixed").css({"margin-top":this._navbarTop+"px"});
            }
            //修改导航锚点样式
            if(this._scrollT<this._navbodyBottom){
              var lii=0;
              for(var i=0;i<this._imgh.length;i++){  
                if(this._imgh[i]<this._scrollT){ 
                  lii=i;
                }else{
                  break;
                }
              }
              this._navbar.find("li").eq(lii).addClass("on").siblings("li").removeClass("on");
            }
          }else{ 
            this._navbar.removeClass("fixed").removeAttr("style");
            this._navbar.find("li").eq(0).addClass("on").siblings("li").removeClass("on");
          }  
      },
      linkhref:function(){
        //点击跳转
        var that=this;
        this._navbar.find("li").click(function(){
          // var thisli=$(this);
          this._gotoTop=that._navbody.find("img[data-loc="+$(this).attr("data-href")+"]").offset().top;
          if(undefined!=this._gotoTop){
            // $(window).scrollTop(gotoTop,5000);
            $(this).addClass("on").siblings("li").removeClass("on");
            $('html,body').animate({scrollTop:this._gotoTop+"px"},500);
          }
        });
      }
    } 

    $(function(){
       fixbar.init();   
    })

缺点:1.未封装的方法 2.点击最后一个li导航时,定位到倒数li导航会定位到倒数第二个去

    $(function (){
      "use strict";
        //左侧导航 start
        // 滚轴 导航位置变化
        var $navbar=$("#navbar"), $navbody=$("#navbody");
       
        var navbodyTop=$navbody.offset().top; //导航目标标签 距离页面顶部高度
        var navbarH=$navbar.outerHeight(); //导航高度
        var navbodyH=navbarH;// 给内容默认导航的高度

        var navbodyBottom=0; //内容页的最底端距离页面顶部高度
        var navbodyBottomFix=0; //内容页的最底端距离页面顶部高度 - 导航的高度
        var navbarTop=0; //导航 距离内容页顶部的高度


        var imgh=[]; //内容页 图片距离页面顶部的高度
        var $lastimg= $navbody.find("img:last-child");
        if($lastimg[0].complete){console.log(1); //ie使用
          setH();
        }else{   console.log(0); 
          $lastimg.load(function(){setH();});
        }
        function setH(){ console.log(2); 
            //导航定位
            navbodyH=$navbody.outerHeight();
            navbodyBottom=navbodyTop+navbodyH;
            navbodyBottomFix=navbodyTop+navbodyH-navbarH;
            navbarTop=navbodyH-navbarH-10;
            // 导航锚点定位
            $navbody.find("img").each(function(){
                imgh.push($(this).offset().top-100);
            });
            scrollGoto();
        }

        $(window).scroll(function() {
              scrollGoto(); 
        });

        //定义滚动操作
        function scrollGoto(){              
          var scrollT=$(window).scrollTop(); //alert(scrollT);
          // console.log(scrollT); //alert(scrollT);
          if(scrollT>navbodyTop){ //console.log(navbodyBottomFix);
            //修改导航位置
            if(scrollT<navbodyBottomFix){
              $navbar.addClass("fixed").removeAttr("style");
            }else{
              $navbar.removeClass("fixed").css({"margin-top":navbarTop+"px"});//.css({});
            }
            //修改导航锚点样式
            if(scrollT<navbodyBottom){
              for(var i=0;i<imgh.length;i++){
                if(imgh[i]>scrollT){
                  $navbar.find("li").eq(i-1).addClass("on").siblings("li").removeClass("on");
                  break;
                }
              }
            }
          }else{ //console.log(1);
            $navbar.removeClass("fixed").removeAttr("style");
            $navbar.find("li").eq(0).addClass("on").siblings("li").removeClass("on");
          }  
        }
       
        //点击跳转
        $navbar.find("li").click(function(){
          var gotoTop=$navbody.find("img[data-loc="+$(this).attr("data-href")+"]").offset().top;
          if(undefined!=gotoTop){
            // $(window).scrollTop(gotoTop,5000);
            $(this).addClass("on").siblings("li").removeClass("on");
            $('html,body').animate({scrollTop:gotoTop+"px"},500);
          }
        });
        //左侧导航 end
    })
    </script>

原文地址:https://www.cnblogs.com/jcz1206/p/6617816.html