众所周知IE6不支持position:fixed,这个bug与IE6的双倍margin和不支持PNG透明等bug一样臭名昭著。前些天我做自己的博客模板的时候,遇到了这个问题。当时就简单的无视了IE6——尽管有几个使用IE6的朋友,一起BS我……但是对于大项目或商业网站,如果有用到这个属性的时候,是不可能直接无视的。
你是如何让position:fixed在IE6中工作的?
本文所使用的技巧是用了一条Internet Explorer的CSS表达式(expression)。你不可以直接使用该表达式,因为它可能会因为缓存而不更新。解决这一点的最简单的方式是使用eval包裹你的语句。
如何解决“振动”的问题?
显然IE有一个多步的渲染进程。当你滚动或调整你的浏览器大小的时候,它将重置所有内容并重画页面,这个时候它就会重新处理css表达式。这会引起一个丑陋的“振动”bug,在此处固定位置的元素需要调整以跟上你的(页面的)滚动,于是就会“跳动”。
解决此问题的技巧就是使用background-attachment:fixed为body或html元素添加一个background-image。这就会强制页面在重画之前先处理CSS。因为是在重画之前处理CSS,它也就会同样在重画之前首先处理你的CSS表达式。这将让你实现完美的平滑的固定位置元素!
这个方案并不是我提供的。我是在网上的某个地方读到这些的。如果你知道是谁原创了这个方法,请告诉前端观察。
我发现的另外一个小技巧是,你根本无需一个真实的图片!你可以使用一个about:blank替代一个spacer.gif图片,而且它工作的同样出色。
/*让position:fixed在IE6下可用! */ .fixed-top /* 头部固定 */{position:fixed;bottom:auto;top:0px;} .fixed-bottom /* 底部固定 */{position:fixed;bottom:0px;top:auto;} .fixed-left /* 左侧固定 */{position:fixed;right:auto;left:0px;} .fixed-right /* 右侧固定 */{position:fixed;right:0px;left:auto;} /* 上面的是除了IE6的主流浏览器通用的方法 */ * html,* html body /* 修正IE6振动bug */{background-image:url(about:blank);background-attachment:fixed;} * html .fixed-top /* IE6 头部固定 */{position:absolute;bottom:auto;top:expression(eval(document.documentElement.scrollTop));} * html .fixed-right /* IE6 右侧固定 */ {position:absolute;right:auto;left:expression(eval(document.documentElement.scrollLeft+document.documentElement.clientWidth-this.offsetWidth)-(parseInt(this.currentStyle.marginLeft,10)||0)-(parseInt(this.currentStyle.marginRight,10)||0));} * html .fixed-bottom /* IE6 底部固定 */{position:absolute;bottom:auto;top:expression(eval(document.documentElement.scrollTop+document.documentElement.clientHeight-this.offsetHeight-(parseInt(this.currentStyle.marginTop,10)||0)-(parseInt(this.currentStyle.marginBottom,10)||0)));} * html .fixed-left /* IE6 左侧固定 */{position:absolute;right:auto;left:expression(eval(document.documentElement.scrollLeft));} |
<!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="utf-8" /> <title>fixed menu</title> <style type="text/css"> body{background-color:#eee;font-size:12px;} *{padding:0;margin:0;} a{text-decoration:none;color:#888;} .floatMenu{position:absolute;z-index:5;box-shadow:0 0 2px rgba(000, 000, 000, .1);} .list{width:142px;height:80px;border:1px solid #ccc;padding:5px;overflow:hidden; background-color:#fff; background-image: -moz-linear-gradient(top, #fff, #f5f5f5); background-image: -webkit-linear-gradient(top, #fff, #f5f5f5); background-image: -o-linear-gradient(top, #fff, #f5f5f5); } .list li{float:left;width:140px;list-style:none;height:26px;line-height:26px;text-align:center;border:1px solid #eee;margin-top:-1px;background-color:#fff;} .list li a{display:block;} .list li a:hover{background-color:#f8f8f8;color:#000;} .box{margin:0 auto;padding:10px;height:3000px;width:200px;border:1px solid #ccc;background-color:#fff;} /*---menu1---*/ .float_menu1{top:50%;left:10px;} /*---menu2---*/ .float_menu2{bottom:10px;right:10px;} /*---menu3---*/ .float_menu3{top:10px;right:10px;} </style> </head> <body> <div class="box"> 一条内容 </div> <div class="floatMenu float_menu1"> <ul class="list"> <li><a href="">菜单选项01</a></li> <li><a href="">菜单选项02</a></li> <li><a href="">菜单选项03</a></li> </ul> </div> <div class="floatMenu float_menu2"> <ul class="list"> <li><a href="">菜单选项01</a></li> <li><a href="">菜单选项02</a></li> <li><a href="">菜单选项03</a></li> </ul> </div> <div class="floatMenu float_menu3"> <ul class="list"> <li><a href="">菜单选项01</a></li> <li><a href="">菜单选项02</a></li> <li><a href="">菜单选项03</a></li> </ul> </div> <script src="js/jquery-1.4.2.js" type="text/javascript"></script> <script type="text/javascript"> var docElm = $(document); function scrollMenu(scrollMenuName,yPos){ var menuElm = $(scrollMenuName); var menuYloc = parseInt($(window).height()/2-menuElm.height()/2); if(yPos=="top"||yPos=="bottom"){ menuYloc = parseInt(menuElm.offset().top); } menuElm.css({top:menuYloc,bottom:"auto"}); $(window).bind("scroll",function(){ var endYloc = menuYloc+docElm.scrollTop()+"px"; menuElm.animate({top:endYloc},{duration:500,queue:false}); }); } scrollMenu(".float_menu1"); scrollMenu(".float_menu2","bottom"); scrollMenu(".float_menu3","top"); </script> </body> </html> |
<!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="utf-8" /> <title>fixed menu</title> <style type="text/css"> body{background-color:#eee;font-size:12px; _background-image:url(about:blank);_background-attachment:fixed;} *{padding:0;margin:0;} a{text-decoration:none;color:#888;} .floatMenu{position:fixed;z-index:5;box-shadow:0 0 2px rgba(000, 000, 000, .1);} .list{width:142px;height:80px;border:1px solid #ccc;padding:5px;overflow:hidden; background-color:#fff; background-image: -moz-linear-gradient(top, #fff, #f5f5f5); background-image: -webkit-linear-gradient(top, #fff, #f5f5f5); background-image: -o-linear-gradient(top, #fff, #f5f5f5); } .list li{float:left;width:140px;list-style:none;height:26px;line-height:26px;text-align:center;border:1px solid #eee;margin-top:-1px;background-color:#fff;} .list li a{display:block;} .list li a:hover{background-color:#f8f8f8;color:#000;} .box{margin:0 auto;padding:10px;width:200px;height:3000px;border:1px solid #ccc;background-color:#fff;} /*---menu1---*/ .float_menu1{top:50%;left:10px;margin-top:-40px; /*---ie6---*/ _position:absolute; _margin-top:0; _top:expression(eval(document.documentElement.scrollTop+(document.documentElement.clientHeight-this.offsetHeight)/2)); } /*---menu2---*/ .float_menu2{bottom:10px;right:10px; /*---ie6---*/ _position:absolute; _margin-top:-10px; _top:expression(eval(document.documentElement.scrollTop+document.documentElement.clientHeight-this.offsetHeight)); } /*---menu3---*/ .float_menu3{top:10px;right:10px; /*---ie6---*/ _position:absolute; _margin-top:10px; _right:10px; _top:expression(eval(document.documentElement.scrollTop)); } </style> </head> <body> <div class="box"> 一条内容 </div> <div class="floatMenu float_menu1"> <ul class="list"> <li><a href="">菜单选项01</a></li> <li><a href="">菜单选项02</a></li> <li><a href="">菜单选项03</a></li> </ul> </div> <div class="floatMenu float_menu2"> <ul class="list"> <li><a href="">菜单选项01</a></li> <li><a href="">菜单选项02</a></li> <li><a href="">菜单选项03</a></li> </ul> </div> <div class="floatMenu float_menu3"> <ul class="list"> <li><a href="">菜单选项01</a></li> <li><a href="">菜单选项02</a></li> <li><a href="">菜单选项03</a></li> </ul> </div> </body> </html> |