IE6 reflow bug
最近遇到的一个 bug,在利用 relative/absolute 定位方式布局的页面里面,经常会出一些类似问题。大概描述一下:一个 relatively positioned 容器 A ,里面放有一个 absolutely positioned 容器 B。如果在页面渲染结束之后 A 由于因为某种原因尺寸发生了改变(这种改变是一种被动的改变,例如由于内部内容的增加减少引起的撑大或者缩小等),这种改变可能是由 JavaSciprt 或者 :hover 等造成,那么 B 元素有些时候(不是全部)在某些版本的 IE 中不会根据 A 元素新的尺寸来重新计算位置。
IE5 似乎没有这个问题,IE6 有,我的 IE7 还是 beta2,版本号是 7.0.5346.5,也没有这个问题,一个朋友用的 beta3 版本号是 7.0.5450.4 居然说也有问题,我没有测试,用这个版本 IE 的朋友可以帮忙看看。最后还算不错,折腾出一个解决方式,用一段 JavaScript 脚本让 IE reflow:
function reflow(){
var b = document.body;
b.style.zoom = b.style.zoom=="1"?"100%":"1";
}
原理就是对 zoom 重新赋值让 body reflow,当然 reflow 的方法应该很多,只要让 IE 可以重新计算就成。这里使用 zoom 的方式是因为它不会有什么视觉上的改变,唯一的变化就是添加了 layout, 但 body 默认是有 layout 的,所以 zoom 的使用应该没有什么大的负作用。
可能光看文字看不大清楚,我这里简单做了一个例子(请用 IE6 查看)来形象一点说明这个 bug,其中第一种情况是由于 JavaScript 引起的改变,第二种情况是由于 :hover 引起的改变,两种情况最后都是用的 js 脚本解决的问题。个人感觉这种方法比较 ugly,不过 google 没找到什么相关的东西(可能我不会找),只好先凑合用了,不知谁有更好的解决方法。



good boy, good job.
Comment by Realazy — 2006.7.26 @ 13:40
good 9
Comment by PorkFat — 2006.7.29 @ 09:53
I have always spent much time to correct layout problems..
nice article and the example was very helpful .You have saved my time.
I ‘m learning chinese since one year, that’s why I couldn’t whrite in chinese.
Comment by Flüge USA — 2009.2.20 @ 17:25
今天又重新翻看了你的博客,最大的收获就是这篇(第一次是刚订阅时,当时功力太弱忽略了此文)。哎,前面项目大量采用relatively positioned/absolutely positioned以及它们混在表格中,在IE 6/7中出现过这种BUG,一直没找到根治的方法,没想到你06年就搞定了,牛叉!国内CSS界数你最牛了,嘿嘿~
Comment by ytzong — 2009.4.19 @ 00:43
@ytzong 能帮上忙很高兴,这个 bug 我很久没有遇到了,不知道是怎么回事,可能无意中触发了别的东西可以避免,可以再研究研究,也许有更好的 fix,呵呵。后面那啥实在过誉了……汗
Comment by old9有 — 2009.4.20 @ 09:22