(function($){ var isIE = !!window.ActiveXObject; var isIE6 = isIE && !window.XMLHttpRequest; var isIE8 = isIE && !!document.documentMode && (document.documentMode == 8); var isIE7 = isIE && !isIE6 && !isIE8; if (isIE6 || isIE7) { //ie6 | ie7 | ie8 not in standards mode $().ready(function(){ var body = document.body; var BLANK_GIF; if (body.currentStyle.backgroundAttachment != "fixed") { if (body.currentStyle.backgroundImage == "none") { body.runtimeStyle.backgroundImage = "url(" + BLANK_GIF + ")"; // dummy body.runtimeStyle.backgroundAttachment = "fixed"; } } }); } $.fn.extend({ toFixed: function(position){ var isIE = !!window.ActiveXObject; var isIE6 = isIE && !window.XMLHttpRequest; var isIE8 = isIE && !!document.documentMode && (document.documentMode == 8); var isIE7 = isIE && !isIE6 && !isIE8; if (isIE6 || isIE7) { } else { return this; } return this.each(function(){ var t = $(this); var id = t.get(0).id || 'fixed_' + parseInt(Math.rand() * 10000); var rect = { w: t.width(), h: t.height(), l: t.css('left'), r: t.css('right'), 't': t.css('top'), b: t.css('bottom') }; if (rect.l != 'auto') { rectl = parseInt(rect.l); } else { rectl = 0; } if (rect.r != 'auto') { rectr = parseInt(rect.r); } else { rectr = 0; } if (rect.t != 'auto') { rectt = parseInt(rect.t); } else { rectt = 0; } if (rect.b != 'auto') { rectb = parseInt(rect.b); } else { rectb = 0; } var _pos = { left: rect.l, right: rect.r, top: rect.t, bottom: rect.b }; _pos = $.extend(_pos, position); var css = t.attr('style') + ';'; css += 'position:absolute;bottom:auto;right:auto;clear:both;'; if (rect.l != 'auto' && rect.r != 'auto') css += 'width:expression(eval(document.compatMode && document.compatMode==\'CSS1Compat\') ? documentElement.clientWidth - ' + rectl + ' - ' + rectr + ' : document.body.clientWidth - ' + rectl + ' - ' + rectr + ' );'; if (rect.l == 'auto' && rect.r != 'auto') css += 'left:expression(eval(document.compatMode && document.compatMode==\'CSS1Compat\') ? documentElement.scrollLeft + (documentElement.clientWidth-this.clientWidth - ' + rectr + ') : document.body.scrollLeft +(document.body.clientWidth-this.clientWidth - ' + rectr + '));'; else css += 'left:expression(eval(document.compatMode && document.compatMode==\'CSS1Compat\') ? documentElement.scrollLeft + ' + rectl + ' : document.body.scrollLeft + ' + rectl + ');'; if (rect.t == 'auto' && rect.b != 'auto') css += 'top:expression(eval(document.compatMode && document.compatMode==\'CSS1Compat\') ? documentElement.scrollTop + (documentElement.clientHeight-this.clientHeight - ' + rectb + ') : document.body.scrollTop +(document.body.clientHeight-this.clientHeight - ' + rectb + '));'; else css += 'top:expression(eval(document.compatMode && document.compatMode==\'CSS1Compat\') ? documentElement.scrollTop + ' + rectt + ' : document.body.scrollTop + ' + rectt + ');'; t.attr('style', css); }); } }); })(jQuery);
随后,以下的核心脚本才是本页面实现的关键所在:
<script type="text/javascript"> $("#scrollspy").toFixed();//让scrollspy这个div在IE6同样可以position:fixed; //开始先遍历标题,生产目录 var title_counter=0; $(".title").each(function(){ title_counter++; //对于每一个class为title的标题设置锚点,同时在#scrollspy同生产每一个锚点的链接 $(this).attr("id","title"+title_counter); $("#scrollspy").append("<p><a href='#title"+title_counter+"'>。。。"+$(this).html()+"</a></p>"); //这里使用到<div>与<p>的组合,而不是<ul>与<li>,<ul>与<li>没有position:fixed;属性。不能不随滚动的移动而移动。 }); //之后是显示滚动条滚动事件,滚动条一旦滚动都会触发这个事件 $(window).scroll(function() { var height_now=$(window).scrollTop();//取当前滚动条的高度位置 title_counter=0; var title_now=0;//再次遍历左边的目录 $(".title").each(function(){ $("#scrollspy>p:eq("+title_counter+")>a").html("。。。"+$(this).html());//先将所有目录前的符号重新变成。。。 if(height_now>$(this).offset().top){ title_now++;//$(this).offset().top取出各个标题的高度位置,看当前滚动条的高度位置迈过了多少个标题 } title_counter++; }); $("#debug").html("当前高度:"+height_now+"px,标题数:"+title_counter+",当前标题为:"+title_now);//这行只是为了输出信息给大家看清楚,可以没有 if(title_now>title_counter-1){//主要是防止某些浏览器滚动到最底部,无法定位到最后一个标题的现象 title_now=title_counter-1; } $("#scrollspy>p:eq("+title_now+")>a").html("》》》"+$(".title:eq("+title_now+")").html());//对当前滚动条的高度位置迈过的最后一个标题前的。。。换成》》》 }); </script>