jQuery实现可兼容IE6的滚动监听功能
程序员文章站
2022-09-08 14:12:08
本文实例讲述了jquery实现可兼容ie6的滚动监听功能。分享给大家供大家参考,具体如下:
其实这东西本打算用原生的javascript来写,但是原生的javascrip...
本文实例讲述了jquery实现可兼容ie6的滚动监听功能。分享给大家供大家参考,具体如下:
其实这东西本打算用原生的javascript来写,但是原生的javascript取class与监听滚动条的滚动过于麻烦,因此上了jquery,没关系,反正兼容ie6就行。
将实现如下的效果:
也就是在网页中有点常见的滚动监听。相应的标题,滚到哪里,则左边的滚动条当前标题前的。。。就变成》》》,,当然了,左边的标题同样是可以点击,马上滚到该滚的地方。
首先是网页布局部分,代码如下,请忽略大堆的javascript介绍,只是为了占格子,说明效果。
<!doctype html public "-//w3c//dtd html 4.01//en" "http://www.w3.org/tr/html4/strict.dtd"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <title>滚动监听</title> <script type="text/javascript" src="js/jquery-1.11.1.js"></script> <script type="text/javascript" src="js/ie6fixed.js"></script> </head> <body> <div> <div style="float:left;width:20%;"> <div id="scrollspy" style="position:fixed;"> <div id="debug"></div> </div> </div> <div id="content" style="float:left;width:80%"> <p class="title">英文介绍</p> <p>javascript is also used in environments that are not web-based, such as pdf documents, site-specific browsers, and desktop widgets. newer and faster javascript virtual machines (vms) and platforms built upon them have also increased the popularity of javascript for server-side web applications. on the client side, javascript has been traditionally implemented as an interpreted language, but more recent browsers perform just-in-time compilation. it is also used in game development, the creation of desktop and mobile applications, and server-side network programming with runtime environments such as node.js.</p> <p class="title">由来</p> <p>netscape在最初将其脚本语言命名为livescript,后来网景在与昇阳公司合作之后将其改名为javascript[7]。javascript最初受java启发而开始设计的,目的之一就是“看上去像java”[8],因此语法上有类似之处,一些名称和命名规范也借自java。但javascript的主要设计原则源自self和scheme[9]。javascript与java名称上的近似,是当时网景为了营销考虑与太阳微系统达成协议的结果。为了获取技术优势,微软推出了jscript来迎战javascript的脚本语言。为了互用性,ecma国际(前身为欧洲计算机制造商协会)创建了ecma-262标准(ecmascript)。现在两者都属于ecmascript的实现。尽管javascript作为给非程序人员的脚本语言,而非作为给程序人员的脚本语言来推广和宣传,但是javascript具有非常丰富的特性。</p> <p class="title">区别</p> <p>不同于服务器端脚本语言,例如php与asp,javascript主要被作为客户端脚本语言在用户的浏览器上运行,不需要服务器的支持。所以在早期程序员比较青睐于javascript以减少对服务器的负担,而与此同时也带来另一个问题:安全性。而随着服务器的强壮,虽然现在的程序员更喜欢运行于服务端的脚本以保证安全,但javascript仍然以其跨平台、容易上手等优势大行其道。同时,有些特殊功能(如ajax)必须依赖javascript在客户端进行支持。随着引擎如v8和框架如node.js的发展,及其事件驱动及异步io等特性,javascript逐渐被用来编写服务器端程序。</p> <p class="title">标题2</p> <p>netscape在最初将其脚本语言命名为livescript,后来网景在与昇阳公司合作之后将其改名为javascript[7]。javascript最初受java启发而开始设计的,目的之一就是“看上去像java”[8],因此语法上有类似之处,一些名称和命名规范也借自java。但javascript的主要设计原则源自self和scheme[9]。javascript与java名称上的近似,是当时网景为了营销考虑与太阳微系统达成协议的结果。为了获取技术优势,微软推出了jscript来迎战javascript的脚本语言。为了互用性,ecma国际(前身为欧洲计算机制造商协会)创建了ecma-262标准(ecmascript)。现在两者都属于ecmascript的实现。尽管javascript作为给非程序人员的脚本语言,而非作为给程序人员的脚本语言来推广和宣传,但是javascript具有非常丰富的特性。</p> </div> </div> </body> </html>
基本思想如下:
这里,
(1)在第12行故意放一个空格,是因为不要让<div style="float:left;width:20%;"></div>这个div空空是也,以致于没有了宽度。
(2)为了使ie6支持position:fixed
属性,引入了如下的一个ie6fixed.js,这东西的出处已经无从可考,新建一个js文件,拷贝下面的代码保存,在编辑网页的时候为了使ie6支持position:fixed引入这段脚本,同时对要在ie6实现position:fixed的脚本处,使用$("#div名称").tofixed();便兼容。
ie6fixed.js:
(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>
更多关于jquery相关内容感兴趣的读者可查看本站专题:《jquery切换特效与技巧总结》、《jquery拖拽特效与技巧总结》、《jquery扩展技巧总结》、《jquery常见经典特效汇总》、《jquery动画与特效用法总结》、《jquery选择器用法总结》及《jquery常用插件及用法总结》
希望本文所述对大家jquery程序设计有所帮助。