IE6不支持position:fixed bug的完美解决

IE6不支持position:fixed bug的完美解决
废话不多说,先看一下下面这段代码:

复制代码代码如下:
!DOCTYPE html
html
head
meta http-equiv="Content-Type" content="text/html; charset=utf-8" /
titleIE6 position:fixed bug/title
style
*{padding:0;margin:0}
p{height:2000px}
#gs{border:1px solid #000;position:fixed;right:30px;top:120px}
/style
!--[if IE 6]
style type="text/css"
html{overflow:hidden}
body{height:100%;overflow:auto}
#gs{position:absolute}
/style
![endif]--
/head
body
div id="rightform"
p11111111111111111/p
input id="gs" name="gs" type="text" value="" /
/div
/body
/html

以上这段代码在网上很常见,通过设置html{overflow:hidden}和body{height:100%;overflow:auto}来实现ie6下position:fixed效果,但这种办法有个缺陷,那就是:这会使页面上原有的absolute、relation都变成fixed的效果,在这里我就不做demo了,如果有怀疑,可以自己去试验一下。
于是我找了下资料,发现可以通过一条Internet Explorer的CSS表达式(expression)来完美的实现ie6下position:fixed效果,css代码如下:

复制代码代码如下:
/* 除IE6浏览器的通用方法 */
.ie6fixedTL{position:fixed;left:0;top:0}
.ie6fixedBR{position:fixed;right:0;bottom:0}
/* IE6浏览器的特有方法 */
* html .ie6fixedTL{position:absolute;left:expression(eval(document.documentElement.scrollLeft));top:expression(eval(document.documentElement.scrollTop))}
* html .ie6fixedBR{position:absolute;left:expression(eval(document.documentElement.scrollLeft+document.documentElement.clientWidth-this.offsetWidth)-(parseInt(this.currentStyle.marginLeft,10)||0)-(parseInt(this.currentStyle.marginRight,10)||0));top:expression(eval(document.documentElement.scrollTop+document.documentElement.clientHeight-this.offsetHeight-(parseInt(this.currentStyle.marginTop,10)||0)-(parseInt(this.currentStyle.marginBottom,10)||0)))}

上面代码可以直接使用了,如果要设置元素悬浮边距,要分别为设置两次,比如我要让某个元素距顶部10个像素,距左部也是10个像素,那就要这样子写:

复制代码代码如下:
/* 除IE6浏览器的通用方法 */
.ie6fixedTL{position:fixed;left:10px;top:10px}
/* IE6浏览器的特有方法 */
* html .ie6fixedTL{position:absolute;left:expression(eval(document.documentElement.scrollLeft+10));top:expression(eval(document.documentElement.scrollTop+10))}

这样一来,IE6下实现position:fixed的效果解决了,而且也不会影响到其他的absolute、relation,但还有一个问题,就是悬浮的元素会出现振动
IE有一个多步的渲染进程。当你滚动或调整你的浏览器大小的时候,它将重置所有内容并重画页面,这个时候它就会重新处理css表达式。这会引起一个丑陋的振动bug,在此处固定位置的元素需要调整以跟上你的(页面的)滚动,于是就会跳动。
解决此问题的技巧就是使用background-attachment:fixed为body或html元素添加一个background-image。这就会强制页面在重画之前先处理CSS。因为是在重画之前处理CSS,它也就会同样在重画之前首先处理你的CSS表达式。这将让你实现完美的平滑的固定位置元素!
然后我发现background-image无需一张真实的图片,设置成about:blank就行了。
下面附上完整代码

复制代码代码如下:
/* 除IE6浏览器的通用方法 */
.ie6fixedTL{position:fixed;left:0;top:0}
.ie6fixedBR{position:fixed;right:0;bottom:0}
/* IE6浏览器的特有方法 */
/* 修正IE6振动bug */
* html,* html body{background-image:url(about:blank);background-attachment:fixed}
* html .ie6fixedTL{position:absolute;left:expression(eval(document.documentElement.scrollLeft));top:expression(eval(document.documentElement.scrollTop))}
* html .ie6fixedBR{position:absolute;left:expression(eval(document.documentElement.scrollLeft+document.documentElement.clientWidth-this.offsetWidth)-(parseInt(this.currentStyle.marginLeft,10)||0)-(parseInt(this.currentStyle.marginRight,10)||0));top:expression(eval(document.documentElement.scrollTop+document.documentElement.clientHeight-this.offsetHeight-(parseInt(this.currentStyle.marginTop,10)||0)-(parseInt(this.currentStyle.marginBottom,10)||0)))}

推荐阅读

    如何删除世界之窗浏览器收藏的网页

    如何删除世界之窗浏览器收藏的网页,世界之窗,删除,网页浏览器,点击,网站,浏览器,多线程,世界之窗(Theworld)是一款以IE为内核的浏览器,其免

    IE浏览器优化方法大全

    IE浏览器优化方法大全,浏览器,大全,图像,内存,浏览,优化,方法,很多人都喜欢使用IE浏览器,可是却很少人知道要去优化这款浏览器,只是用到出问

    IE浏览器不让修改首页的小技巧

    IE浏览器不让修改首页的小技巧,修改,快捷方式,参数,小技巧,浏览器,首页,选择,众所周知,修改IE默认主页地址是恶意网页常用的一招。IE被修改

    玩转浏览器IE7的5个顶级使用技巧

    玩转浏览器IE7的5个顶级使用技巧,标签页,选择,点击,浏览器,打印,选项卡,图标,你是否还不太习惯IE7的样子或者工作方式呢?你可以通过一些简

    条件注释判断浏览器(ie系列)

    条件注释判断浏览器(ie系列),浏览器,系列,条件,注释,识别,版本,外都可,!--[if IE 6] 仅IE6可识别 ![endif]--条件注释判断浏览器.!--[if I

    XP SP2中修复IE浏览器新技巧

    XP SP2中修复IE浏览器新技巧,注册,重新安装,安装,修复,浏览,器新,什么原因,网络浏览器(IE)记录上存在许多的问题,使得某些部分甚至整个浏览器

    IE浏览器专有css属性之zoom详解

    IE浏览器专有css属性之zoom详解,属性,浏览器,对象,元素,浮动,升级,浮点,zoom:1;一般是拿来解决IE6的子元素浮动时候父元素不随着自动扩大

    让IE6支持HTML5元素的方法

    让IE6支持HTML5元素的方法,方法,元素,支持,文件,网站,脚本,前提,作者已经把这段代码放到了Google code project上,只需要在你的head中调用