分享

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

 看见就非常 2013-02-08

  废话不多说,先看一下下面这段代码:

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>IE6 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">
    <p>11111111111111111</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)))}

  至于demo我想大家都看到了吧:)

IE6完美兼容position:fixed
IE6完美兼容position:fixed
手机收藏该文章
作者:胡尐睿丶
如果你读了我的文章,觉得有帮助,你可以选择:支付宝赞助
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
分类: 前端技术
8
2
(请您对文章做出评价)
博主上一篇:【转载】通过JS破解图片防盗链限制
博主下一篇:借助Google Translate API实现网站多国语言翻译功能
首页上一篇:实例讲解遗传算法——基于遗传算法的自动组卷系统【实践篇】
首页下一篇:(译)如何使用cocos2d制作一个打地鼠的游戏:(第二部分。完)
posted @ 2011-05-20 18:42 胡尐睿丶 阅读(34189) 评论(38) 编辑 收藏
  
#1楼 2011-05-20 21:33 sxwgf  
这种方法用了expression,请教lz有不用expression的方法吗?
  
#2楼[楼主] 2011-05-20 22:49 胡尐睿丶  
@sxwgf
不用expression就是我文章开头那短代码,设置html{overflow:hidden}和body{height:100%;overflow:auto},但这样会造成页面上所有absolute都变成fixed的效果,所以还是推荐用expression
  
#3楼 2011-05-21 07:21 刘览器  
文章很有深度,签定完毕。。。
  
#4楼 2011-05-21 09:52 john23.net  
恩学习了

  
#5楼 2011-05-21 10:57 钧梓昊逑  
我认为这不算是BUG
  
#6楼 2011-05-21 11:45 超级奶崽  
  
#7楼 2011-05-21 12:17 卖身葬小强  
禁用javascript这段css表达式会不会失效?
  
#8楼[楼主] 2011-05-21 12:43 胡尐睿丶  
@卖身葬小强
这问题不错,我没测试过,应该是会失效的,我没考虑到,看来还是得留个备用方案,当IE6在禁用js的情况下,采用我文章中的第一种办法
  
#9楼 2011-05-21 21:49 西狐  
坚定不移的,抛弃IE6
  
#10楼 2011-08-16 15:24 ilbefun  
请问50%边距要怎么写呢
  
#11楼[楼主] 2011-08-16 15:30 胡尐睿丶  
@ilbefun
什么叫50%边距?
  
#12楼 2011-08-30 22:08 翼飞  
relative写成relation了 汗一个 这个真不应该有
  
#13楼[楼主] 2011-08-30 22:23 胡尐睿丶  
@翼飞
我的错,绝对是我的错。
  
#14楼 2011-09-22 10:04 Rex.He  
真没看出有什么完美的..expression基本都不会使用的...
楼主一点都不考虑性能问题...
  
#15楼[楼主] 2011-09-22 10:08 胡尐睿丶  
@Rex.He
真要考虑性能,那就只能屏蔽IE6了,或者不管IE6了,但这真的是为用户考虑么?这又回到的开头的问题,我们考虑性能的最终目的还不是为了用户考虑。
  
#16楼 2011-09-22 10:15 Rex.He  
@胡尐睿丶
屏蔽IE6? 做东西就是为了满足客户需求...
expression性能损耗太大,使用position:absolute模拟会比较好
  
#17楼[楼主] 2011-09-22 10:19 胡尐睿丶  
@Rex.He
是用position:absolute模拟的啊,文章里我都写的很清楚了,但是top,left的值你要怎么计算?还不是要用JS实时计算出来。不然你怎么实现?
  
#18楼 2011-09-22 10:23 Rex.He  
expression 和 JS计算模拟 在性能上的问题
在于频率,expression在你任何位置任何时候微小的移动都会计算很多次,你可以测试下.... JS只针对在你的使用范围内,所以前端才不建议使用expression
  
#19楼[楼主] 2011-09-22 10:33 胡尐睿丶  
@Rex.He
原来是这样,受教了,我一直以为expression和js没区别,就干脆把js代码用expression写在css里了
  
#20楼 2011-11-23 10:49 nono_jia  
会和其他的js有冲突..单用还是可以的..
  
#21楼 2012-02-21 13:58 Zigzag  
真正最完美的方式,假设box需要fixed,如下
1
2
3
<div class="box">
 这是需要绝对定位的文字。
</div>

使用以下css来实现ie6的fixed:
1
2
3
4
5
6
7
.box {
  position: fixed;
  
}
* html .box { 
  position: absolute;
}
  
#22楼 2012-04-05 10:45 象牛  
引用Zigzag:
真正最完美的方式,假设box需要fixed,如下
1
2
3
<div class="box">
 这是需要绝对定位的文字。
</div>

使用以下css来实现ie6的fixed:
1
2
3
4
5
6
7
.box {
  position: fixed;
  
}
* html .box { 
  position: absolute;
}

厉害!!!!!!
  
#23楼[楼主] 2012-04-05 10:51 胡尐睿丶  
@Zigzag
你这哪里解决ie6 position: fixed; 的问题了?
  
#24楼[楼主] 2012-04-05 10:51 胡尐睿丶  
@象牛
演员?
  
#25楼 2012-04-05 10:54 象牛  
引用Zigzag:
真正最完美的方式,假设box需要fixed,如下
1
2
3
<div class="box">
 这是需要绝对定位的文字。
</div>

使用以下css来实现ie6的fixed:
1
2
3
4
5
6
7
.box {
  position: fixed;
  
}
* html .box { 
  position: absolute;
}

呃。。。。。。。。发现问题了。。。发现IE6下不会随屏幕动。。。或者是我没有理解你的意思吧
  
#26楼 2012-04-13 10:03 象牛  
引用胡尐睿丶:
@象牛
演员?

你说话用的着这么偏激吗?
  
#27楼 2012-04-28 10:39 前端组qianduanzu.com  
这样比较耗资源,有没有更好的解方案呢?
  
#28楼[楼主] 2012-04-28 10:41 胡尐睿丶  
@前端组qianduanzu.com
不管IE6是最好的解决方案=D
  
#29楼 2012-04-28 10:42 前端组qianduanzu.com  
@胡尐睿丶
哈哈,我博客就是。没管它IE6
  
#30楼 2012-05-03 10:28 chloe_t  
QAQ可惜老板用的IE6啊…………
  
#31楼 2012-06-04 11:14 天地人广告  
为什么我的下面的定位也总是跟着动??? WHY??
  
#32楼[楼主] 2012-06-04 11:16 胡尐睿丶  
@天地人广告
fixed不就是跟随滚动的
  
#33楼 2012-06-04 11:18 天地人广告  
@胡尐睿丶
我只要顶部跟着滚啊! 我用你的方法下面的那些用了绝对定位的也是和顶部一样的滚了!
  
#34楼[楼主] 2012-06-04 11:19 胡尐睿丶  
@天地人广告
检查你的样式,肯定有冲突了
  
#35楼 2012-06-04 11:24 天地人广告  
.ie6fixedTL{position:absolute;left:expression(eval(document.documentElement.scrollLeft+10));top:expression(eval(document.documentElement.scrollTop+10))}
是只要把这句放上就行了吧! 把.ie6fixedTL 改成我的??
  
#36楼 2012-10-11 14:52 iamzou  
Body如果本身有背景呢 而且不能fixed呢?
  
#37楼 2012-10-25 22:33 偷懒小小猫  
使用以下css来实现ie6的fixed:
7 .box {
position: fixed;
}
* html .box {
position: absolute;
}
* html .box 这种写法是专门针对IE6 吗 可是我记得hack是_box{。。}吧
  
#38楼 2013-02-02 10:39 Moon_Jacob  
想不到今天在这边把遇到的问题解决了,哈哈
ps:当初没和你们好好学习真是我的损失啊

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多