最近用 HTML4 和 CSS 复刻了一个 Windows 98 适用的 System Diagnostics 工具界面(点击这里访问该测试页面)。代码写完之后,但在浏览器中首次加载页面时,遇到了一个问题。
页面中大量使用了 fieldset 和 legend 标签来模拟经典的 GroupBox 控件。问题的现象是,当页面刚刚打开时,legend 中的标题文字会莫名其妙地向上偏移,并没有像 MSW98 的标准控件里一样压进上框线里,显得稍微错位。
神奇的是,只要稍微拖动一下浏览器窗口大小,或者点一下最大化/还原,文字位置瞬间就正常了。
在定义的样式中,为了模拟 Win98 的 3D 效果,给 fieldset 设置了复杂的边框颜色组合以及内边距。在页面初次加载时,浏览器的布局引擎在 legend 的宽高尚未完全确立,或者字体尚未完全准备好时,就先绘制了边框,导致了垂直偏移量的计算错误。
而当调整窗口大小时,触发了全局的重排,此时 DOM 树已经稳定,引擎重新计算了一次位置,所以显示就恢复正常了。既然手动调整窗口能修好,那也许只需要用代码模拟这个过程。
尝试:使用 JS 在 onload 时刻强制触发一次重排。当读取一个元素的几何属性时,强迫浏览器清空渲染队列并重新计算布局。
window.onload = function() {
var fs = document.getElementsByTagName('fieldset');
for (var i = 0; i < fs.length; i++) {
var temp = fs[i].style.display;
fs[i].style.display = 'block';
var reflow = fs[i].offsetHeight;
fs[i].style.display = temp;
}
};
问题解决。以及,最后,圣诞节快乐和新年快乐噢。