自己写的,只测试了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>