4

这可能是我多年来网站编码中遇到的最奇怪的事情,所以我想我会由一些比我聪明的人来运行它,试图解释为什么会发生这种情况。如果没有解释,我可能会将其作为错误报告提交。我花了很长时间才真正找出问题的原因。

以下行为我只能在 Firefox(当前版本 15,可能还有其他版本)中产生。Internet Explorer、Chrome 或 Safari 中不存在问题。很难解释,我只是在这里创建了一个演示:http: //sandbox.uatu.net/dom-changes.php

一般的想法是,在一组非常特定的条件下,当滚动可滚动框时,Firefox 会阻止 DOM 更改,无论滚动是由用户完成还是由脚本自动完成。这是设置:

<div id="superContainer">
   <div id="subContainer">
       <div id="mainPage">
           scrollable box in here
       </div>
   </div>
</div>

重要属性:

  • superContainer 具有高度和宽度尺寸

  • subContainer 有一个高度维度

  • subContainer 的不透明度设置小于 1

  • subContainer 有背景颜色

  • mainPage 的 position 属性为 absolute

无论如何,如果您访问该演示页面,您会看到尝试滚动框会冻结所有页面动画。实际上,您可以在 Firebug 中观察其中一些元素,并看到属性正在实时更改,但 Firefox 只是拒绝重新绘制页面上的任何内容。

如果您将这些属性中的任何一个切换到关闭位置,一切都很好。正是这种特殊的设置组合似乎产生了问题。

有人对为什么有任何想法吗?我无法告诉你这让我有多疯狂——我整个周末基本上都在排除故障,在我发现它的网站上完全重构了我的代码。

4

1 回答 1

1

在我看来,不透明度+绝对位置是这里的罪魁祸首,请阅读 w3 关于透明度的规范以了解引擎如何渲染和威胁不透明度。

http://www.w3.org/TR/css3-color/#transparency

由于不透明度小于 1 的元素是由单个屏幕外图像合成的,因此其外部的内容无法在其内部的内容块之间按 z 顺序分层。出于同样的原因,实现必须为不透明度小于 1 的任何元素创建新的堆叠上下文。如果未定位不透明度小于 1 的元素,则实现必须在其父堆叠上下文中同时绘制它创建的层如果它是具有“z-index:0”和“不透明度:1”的定位元素,将使用的堆叠顺序。如果定位了不透明度小于 1 的元素,则应用“z-index”属性,如[CSS21]中所述,除了“auto”被视为“0”,因为总是创建新的堆叠上下文。请参阅第 9.9 节[CSS21]的附录 E以获取有关堆叠上下文的更多信息。本段中的规则不适用于 SVG 元素,因为 SVG 有自己的渲染模型[SVG11],第 3 章)。

如果你从 #mainPage 中删除 position: absolute ,你会注意到 bug 消失了,你可能还是想提交 bug 并为你的实现考虑一个计划 B。

于 2012-10-08T22:51:58.873 回答