fixed 定位在 IE6 下的实现技巧一则
从蓝色理想看到这贴:固定在右下角的离奇方法
受上面帖子的启发,也做了一个demo:ie6_fixed_position.html
代码:
<div id="a" style="width: 300px; height: 100px; background: red">test</div>
<script>
var ie6 = !window.XMLHttpRequest;
var a = document.getElementById('a');
a.style.position = ie6 ? 'absolute' : 'fixed';
a.style.right = 0;
a.style.bottom = 0;
if (ie6) {
window.onscroll = function() {
a.className = a.className;
};
}
</script>
原理分析:
position: absolute的元素,直接放在position:static的 body 中时,绝对定位的参考物是 body 的 viewport 部分。这使得元素 a 在窗口 resize 时,自动就能准确定位到右下角。注意:body 的 position 不能为 relative 等值,否则失效。- onscroll 时需要特殊处理一下,使得滚动时,也让绝对定位元素 a 的参考物能更新为当前的 viewport. 上面的
a.className = a.className就是这样一个 hack: 使得 a 的定位参考物动态更新为当前的 viewport. 类似的 hack 还有a.style.background = 'red'. 这些 hack 会引发 reflow, 但反之不一定,进一步的规律没找到,不过有一个 hack,也就够用了。
耐心总结,快乐分享,欢迎讨论。

July 9th, 2009 on 17:11
直接上客户升级到IE7或者Firefox,IE6的不要.
July 9th, 2009 on 17:21
顶玉伯兄,hack很有趣。
reflow是个很有研究价值的东西。学习了。
July 9th, 2009 on 18:05
hack也比较麻烦。和不用HACK代码量差不多。
以下是我不用hack的实现。
var top = $(window).height();
$this.$toolBar.css(“top”, top – 28 + “px”);
$(window).scroll(function () {
$this.$toolBar.css(“top”, top – 28 + $(document).scrollTop() + “px”);
});
July 9th, 2009 on 19:09
原来直接在CSS里用top: expression(offsetParent.scrollTop + offsetParent.clientHeight – [要定位的元素高度] + “px”)的,
专门给IE6载一张样式表,懒得麻烦……
CSS解决不了的东西,都给IE6另外写expression……
以后决定,给访问博客的IE6朋友,上演崩坏的动画……
July 9th, 2009 on 20:32
还是喜欢那个CSS的,
上面这方法,滚动的时候,那层还是会一动一动的(偶用IeTester测试)。。不喜欢,呵呵。
July 9th, 2009 on 22:16
expression方法直接无视掉…
July 10th, 2009 on 8:36
会发生抖动,不怎么好。
不过这种HACK方式还是值得借鉴的。
July 10th, 2009 on 8:45
expression处理不当会导致一直被触发,差一点的机器就开始卡了…
应用的时候JS比较多,毕竟是常规写法而不是hack
这个办法貌似很新颖哈哈
July 10th, 2009 on 9:26
俺来一个纯css的方法
http://lab.fouland.com/ie6_fixed.html
July 10th, 2009 on 9:59
“使得 a 的定位参考物动态更新为当前的 viewport”
关键就是这个
不知是不是bug呢
不知有没有其他触发方法呢
July 10th, 2009 on 14:46
evan的办法其实不错,各个浏览器都兼容,网易博客就是这么干的。
July 10th, 2009 on 23:40
难道是我的机器太好了,在ietester ie6模式下纹丝不动
July 10th, 2009 on 23:56
另外,比较喜欢那个CSS的方法,
html{overflow:hidden;}
body{height:100%;overflow:auto;}
a{position:absolute;}
不过这个方法很有趣。
July 13th, 2009 on 15:06
cssplay 上有
July 13th, 2009 on 17:49
这个现象很奇怪,我很早以前遇到并记录过:
http://yiminghe.javaeye.com/blog/388869
确实可已达到 fixed 的效果
July 17th, 2009 on 12:07
别丢人了。我用两很CSS就可以搞定,给你个更好的方法:
http://www.hosof.com/home/layer.html
9楼的哥们用的方法是隐藏了浏览器本身的滚动条,这样属于曲线救国路线,当然也是可行的,但有可能会导致一些其它代码出现问题,比如你要设置和获得滚动条高度。
July 29th, 2009 on 14:43
给你个更好的方法:
http://www.hosof.com/home/layer.html
要用expression啊~~
August 24th, 2009 on 15:36
由于使用频度高,所以转贴下咯~~~
嘿嘿
http://www.xintend.com/Article/VtuGpykkJpBOlqDfgmfX.aspx
September 28th, 2009 on 20:22
demo怎么打不开啊?
leave a reply