您的位置:首页 > 其它

关于IE6不支持position:fixed的解决办法

2013-11-23 14:32 141 查看
转自: http://www.wxwdesign.cn/article/skills/ie6_position_fixed_debug.htm

在制作页面的过程中,有时候需要把某一块内容固定在网页某个位置处,滚动条拉动的过程,内容相对浏览器始终保持“位置不变”。示例如下:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style type="text/css">
body{ margin:0px; padding:0px; font-size:12px; line-height:22px;}
p{ margin:0px; padding:36px;}
.fixed{ position:fixed; right:60px; top:100px; border:#666666 3px solid; background-color:#CCCCCC; padding:26px;}
</style>
<title>position_fixed测试</title>
</head>

<body>
<p>测试内容.........</p>
<p>测试内容.........</p>
<p>测试内容.........</p>
<p>测试内容.........</p>
<p>测试内容.........</p>
<p>测试内容.........</p>
<p>测试内容.........</p>
<p>测试内容.........</p>
<p>测试内容.........</p>
<p>测试内容.........</p>
<p>测试内容.........</p>
<p>测试内容.........</p>
<p>测试内容.........</p>
<p>测试内容.........</p>
<p>测试内容.........</p>
<div class="fixed">我的位置是固定的!拉动滚动条看效果。</div>
</body>
</html>


运行代码后发现,在Firefox、IE7.0、opera等浏览器中,效果都是正常的,唯独IE6中,本来要固定的内容却掉到了“测试内容.......”的下面去了。IE6不支持“position:fixed;”,解决这个bug的办法有两种,一种是CSS方法,另外一种是JS方法。

下面先介绍CSS解决办法:

html{overflow:hidden;}
body{height:100%;overflow:auto;}
固定的内容{position:absolute;} 示例中为:.fixed{position:absolute;}


HTML代码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><style type="text/css">body{ margin:0px; padding:0px; font-size:12px; line-height:22px;}p{ margin:0px; padding:36px;}.fixed{ position:fixed; right:60px; top:100px; border:#666666 3px solid; background-color:#CCCCCC; padding:26px;}</style><!--[if IE 6]><style type="text/css">html{overflow:hidden;}body{height:100%;overflow:auto;}.fixed{position:absolute;}</style><![endif]--><title>position_fixed测试</title></head><body><p>测试内容.........</p><p>测试内容.........</p><p>测试内容.........</p><p>测试内容.........</p><p>测试内容.........</p><p>测试内容.........</p><p>测试内容.........</p><p>测试内容.........</p><p>测试内容.........</p><p>测试内容.........</p><p>测试内容.........</p><p>测试内容.........</p><p>测试内容.........</p><p>测试内容.........</p><p>测试内容.........</p><div class="fixed">我的位置是固定的!拉动滚动条看效果。</div></body></html>

[Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行]

再次测试,发现IE6也能fixed了,似乎bug解决了,但新的bug又出现了。,如果你的网页同时有两个浮动内容,你就会发现新的bug了。示例如下:


HTML代码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><style type="text/css">body{ margin:0px; padding:0px; font-size:12px; line-height:22px;}p{ margin:0px; padding:36px;}.float2{ position:absolute; padding:26px; border:#999999 3px solid; background-color:#3399FF; right:200px; top:200px;}.fixed{ position:fixed; right:60px; top:100px; border:#666666 3px solid; background-color:#CCCCCC; padding:26px;}</style><!--[if IE 6]><style type="text/css">html{overflow:hidden;}body{height:100%;overflow:auto;}.fixed{position:absolute;}</style><![endif]--><title>position_fixed测试</title></head><body><p>测试内容.........</p><p>测试内容.........</p><p>测试内容.........</p><p>测试内容.........</p><p>测试内容.........</p><p>测试内容.........</p><p>测试内容.........</p><p>测试内容.........</p><p>测试内容.........</p><p>测试内容.........</p><p>测试内容.........</p><p>测试内容.........</p><p>测试内容.........</p><p>测试内容.........</p><p>测试内容.........</p><div class="float2">浮动的内容2</div><div class="fixed">我的位置是固定的!拉动滚动条看效果。</div></body></html>

[Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行]

在代码里添加了.float2{position:absolute;},结果IE6有问题了,float2的位置也变成fixed了,原来的absolute不能实现了。看来CSS的解决办法并不完美。

解决方法二:JavaScript

var n=100; //top值
var obj=document.getElementById("fixed"); //position:fixed对象
window.onscroll=function(){obj.style.top=(document.body.scrollTop||document.documentElement.scrollTop)+n+'px';}
window.onresize=function(){obj.style.top=(document.body.scrollTop||document.documentElement.scrollTop)+n+'px';}

示例如下:


HTML代码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><style type="text/css">body{ margin:0px; padding:0px; font-size:12px; line-height:22px;}p{ margin:0px; padding:36px;}.float2{ position:absolute; padding:26px; border:#999999 3px solid; background-color:#3399FF; right:200px; top:200px;}.fixed{ position:absolute; right:60px; top:100px; border:#666666 3px solid; background-color:#CCCCCC; padding:26px;}</style><script language="javascript" type="text/javascript">window.onload=function(){var n=100; //top值var obj=document.getElementById("fixed"); //position:fixed对象window.onscroll=function(){obj.style.top=(document.body.scrollTop||document.documentElement.scrollTop)+n+'px';}window.onresize=function(){obj.style.top=(document.body.scrollTop||document.documentElement.scrollTop)+n+'px';}}</script><title>position_fixed测试</title></head><body><p>测试内容.........</p><p>测试内容.........</p><p>测试内容.........</p><p>测试内容.........</p><p>测试内容.........</p><p>测试内容.........</p><p>测试内容.........</p><p>测试内容.........</p><p>测试内容.........</p><p>测试内容.........</p><p>测试内容.........</p><p>测试内容.........</p><p>测试内容.........</p><p>测试内容.........</p><p>测试内容.........</p><div class="float2">浮动的内容2</div><div class="fixed" id="fixed">我的位置是固定的!拉动滚动条看效果。</div></body></html>

[Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行]

运行效果后发现,一切正常,唯一一点不足之处就是滚动条拉动的过程中,固定块内容会有点闪。不过相对于CSS会造成新的bug,JavaScript解决方法似乎更圆满一些了。

再附上一个固定内容在右下角的例子:


HTML代码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><style type="text/css">body{ margin:0px; padding:0px; font-size:12px; line-height:22px;}p{ margin:0px; padding:36px;}.float2{ position:absolute; padding:26px; border:#999999 3px solid; background-color:#3399FF; right:200px; top:200px;}.fixed{ position:absolute; right:0px; bottom:0px; border:#666666 3px solid; background-color:#CCCCCC; padding:26px; height:26px;}</style><script language="javascript" type="text/javascript">window.onload=function(){var obj=document.getElementById("fixed"); //position:fixed对象var n=document.documentElement.clientHeight-obj.offsetHeight; //top值window.onscroll=function(){obj.style.top=(document.body.scrollTop||document.documentElement.scrollTop)+n+'px';}window.onresize=function(){obj.style.top=(document.body.scrollTop||document.documentElement.scrollTop)+n+'px';}}</script><title>position_fixed测试</title></head><body><p>测试内容.........</p><p>测试内容.........</p><p>测试内容.........</p><p>测试内容.........</p><p>测试内容.........</p><p>测试内容.........</p><p>测试内容.........</p><p>测试内容.........</p><p>测试内容.........</p><p>测试内容.........</p><p>测试内容.........</p><p>测试内容.........</p><p>测试内容.........</p><p>测试内容.........</p><p>测试内容.........</p><div class="float2">浮动的内容2</div><div class="fixed" id="fixed">我的位置是固定的!拉动滚动条看效果。</div></body></html>

[Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行]

另外网上还有一种解决办法:CSS e­xpression

.fixed {
position: absolute;
clear: both;
top:e­xpression(eval(document.compatMode &&
document.compatMode=='CSS1Compat') ?
documentElement.scrollTop
+(documentElement.clientHeight-this.clientHeight) - 1
: document.body.scrollTop
+(document.body.clientHeight-this.clientHeight) - 1);
}

CSS e­xpression的问题就是很耗内存,本来CSS就是控制表现,行为应该有JavaScript来管理,让CSS来管理行为,显然不合适,不推荐此方法。

可能有人会说,JavaScript不如CSS兼容性好,但对于IE6的bug,我更推荐JavaScript解决办法:

如果有一部分用户使用IE6,同时他的浏览器又不支持JavaScript,那他将看到的是position:absolute;这个效果并不影响用户使用,只是位置不会跟随滚动条,对网页整体用户体验影响不大。并且IE7、IE8、Firefox等用户都不受影响,只有IE6用户不支持JavaScript会受影响,这个结果也正是我们想要的。
IE6对于所有前端人员来说,不少人会受其bug困扰已久(包括PNG不透明的问题),加速IE6的灭绝,是很多前端人员的心声,为了迫使IE6用户升级到IE7,可以说已经有很多人在努力(如果你用IE6访问该网站,会提示你升级浏览器)。所以对于IE6的bug,如果对整体影响不大,允许的前提下,我会尽量保留bug给用户,如果大家都这样做,用户使用IE6上网的时候,到处都是不完美(甚至不可用)内容,那用户自然会升级浏览器,IE6的灭绝也会加速,指日可待。
当然为了更好的兼容性和工作需求,有时候不得不做出妥协,向用户妥协,向IE6妥协,向非标准妥协,谁让我们是在为别人打工!

针对上面的问题,网上有了更好的解决办法,纯CSS实现,无闪动,效果很好:


HTML代码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312" /><title>无标题文档</title><style type="text/css">*{margin: 0px;padding: 0px;}body {background-image: url(http://global.tianya.cn/global/gnav/css/nothing.txt);background-attachment: fixed; /* prevent screen flash in IE6 */}#topNavWrapper {width: 980px;text-align: left;height: 31px;margin: 0px auto;z-index:100;_position: relative ;_top:0px;}#topNav {width: 980px;float: left;display: block;z-index: 100;overflow: visible;position: fixed;top: 0px; /* position fixed for IE6 */_position: absolute;_top: e­xpression(documentElement.scrollTop + "px");background-image: url(http://global.tianya.cn/global/gnav/images/top_r.gif);background-repeat: no-repeat;background-position: right;height: 31px;}.show{ position:absolute; top:500px; left:400px; border:#ff0000 1px solid;}</style></head><body><div id="topNavWrapper"><ul class="jd_menu" id="topNav"></ul></div><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><div class="show">show</div></body></html>

[Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: