chrome 在滚动时会复制固定元素

Posted

技术标签:

【中文标题】chrome 在滚动时会复制固定元素【英文标题】:chrome gets fixed element replicated when scrolling 【发布时间】:2012-05-05 04:23:17 【问题描述】:

我使用的是chrome版本18.0.1025.162 m 我有一个带有 iframe 的 html 文件。

我无法更改包含页面或其 css (main.htm)我只能更改 iframe (show.htm) 及其 css。

问题是,当我向下滚动然后向上滚动时,管理栏 div 会被复制几次。 我附上 2 个屏幕截图,第一个是滚动前的屏幕,我还添加了代码,以便可以重现错误。

我认为这可能是 chrome 中的错误,我不确定。 我想知道这是否是一个错误,更重要的是,是否可以通过仅更改 iframe 来解决问题,并且它不包括从 iframe 中删除背景颜色。 (从 iframe 中删除背景颜色可以解决问题,但我需要背景颜色)

所以它看起来是这样的: 滚动前:

滚动后(管理栏在屏幕上复制)

现在代码重现 chrome 中的错误

第一个文件 - main.htm(我无法更改此代码)

<!-- main.htm -->
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<style type="text/css">
#adminbar 

    background-color: #464646;
    height: 28px;
    position: fixed;
    width: 100%;
    top: 0;   
 

 #body-content 
 
    float: left;
    width: 100%;
 
 </style>

 </head>
 <body >
 <div id="body-content">
    <iframe src="show.htm"  ></iframe>

    <div id="adminbar" class="" role="navigation">
    </div>
 </div>

 </body>
 </html>

还有show.htm

<!-- show.htm -->
<!DOCTYPE html>
<head>
<style type="text/css">
body 

    background: #e0e0e0;

</style>
</head>
<body>
 <br/>
<p style='margin-bottom:500px;'>bazinga</p>
<p style='margin-bottom:500px;'>bazinga</p>
<p style='margin-bottom:500px;'>bazinga</p>
</body>
</html>

【问题讨论】:

【参考方案1】:

我想我找到了解决方法。 我创建了一个文件 background.png,其中有一个像素具有我想要的颜色 (#e0e0e0)。

然后我替换这个:

body 

     background: #e0e0e0;

用这个:

body 

    background: #e0e0e0 url(background.png) repeat-x;
    background-attachment: fixed;

【讨论】:

【参考方案2】:

-webkit-transform: translate3d(0,0,0); 添加到您的正文内容CSS

CSS

#body-content 
   float: left;
   width: 100%;
   -webkit-transform: translate3d(0,0,0);

这似乎迫使 Chrome 使用您的 GPU 并解决渲染问题。

更新:既然不能改main.htm,那把show.htm的背景色改成同色的背景图呢?我对此进行了测试,并且有效。有这种可能吗?

【讨论】:

我无法编辑包含的文件,并且将此 css 添加到 iframe 并不能解决问题 抱歉,但改变背景颜色并不是承认失败的解决方法:) 好吧,如果它是一个 Chrome 错误(看起来像),那么在他们修补它之前,您可能会被困在一个解决方法中。【参考方案3】:

我重新创建了您的设置,然后将script 添加到show.htmbody。作为一项快速措施,我在main.htm 中的&lt;iframe /&gt; 中添加了name="if1",但您始终可以在不使用显式指定名称的情况下找到元素的句柄。

它似乎解决了您提供的虚拟设置的问题,如果并且仅当main.htm 一直滚动到顶部。觉得很奇怪,加入俱乐部吧!看看这是否适用于真实的东西......无论哪种方式,它都可能只是朝着正确的方向轻推! :)

<!DOCTYPE html>
<html>
<head>
<style type="text/css">
body 

    background: #e0e0e0;

</style>
</head>
<body>
<br/>
<p style="margin-bottom:500px;">bazinga</p>
<p style="margin-bottom:500px;">bazinga</p>
<p style="margin-bottom:500px;">bazinga</p>
<script type="text/javascript">
    window.onscroll = function()
        console.log("It's 'Doctor' Sheldon Cooper!");
        //parent.document.if1.document.body.style.webkitTransform = 'scale(1)';
        var _parentScale = parent.document.body.style.webkitTransform;
        parent.document.body.style.webkitTransform = _parentScale;
    
</script>
</body>
</html>​​​​​​​​​​​​​​​

我还尝试了以下方法,直到该睡觉了!

<script type="text/javascript">
    window.onscroll = function()
        console.log("It's 'Doctor' Sheldon Cooper!");
        //parent.document.if1.document.body.style.webkitTransform = 'scale(1)';
        var _me = document.body;
        _me.style.webkitTransform = _me.style.webkitTransform;
        //_me.style.display='none';
        _me.offsetHeight
        //_me.style.display='block';

        var _parent = parent.document.body;
        _parent.style.webkitTransform = _parent.style.webkitTransform;
        _parent.style.display=_parent.style.display;
        _parent.offsetHeight
        //_parent.style.display='block';
    
    parent.window.onscroll = function()
        console.log("But. You're in my spot!");
        //parent.document.if1.document.body.style.webkitTransform = 'scale(1)';
        var _me = document.body;
        _me.style.webkitTransform = _me.style.webkitTransform;
        //_me.style.display='none';
        _me.offsetHeight
        //_me.style.display='block';

        var _child = parent.document.if1.document.body;
        _child.style.webkitTransform = _child.style.webkitTransform;
        _child.style.display=_child.style.display;
        _child.offsetHeight
        //_child.style.display='block';
    
</script>

我还尝试使用以下脚本应用j08691 的答案,但结果有点出乎意料。我导致absolute 定位的顶栏没有被修复,除其他外!

    window.onload = function()
        console.log("It's 'Doctor' Sheldon Cooper!");
        var test = parent.document.getElementById("body-content");
        test.style.webkitTransform = "translate3d(0,0,0)";
    

可能已经存在,但如果不存在,您能否将其作为相关项目的错误报告提交?

【讨论】:

我尝试了您的解决方案,但它不起作用?我报告了错误code.google.com/p/chromium/issues/… 我知道这并不能完全解决问题,只是在某些限制下提供了一种解决方法! :) 再说一次,我只是提供我的发现,希望它可以帮助您找到解决方案,或者任何适合您的方法! 你最初是怎么遇到这个问题的?您的代码是否开放供建议,以便我们可以找到一种替代方法来实现结果,而无需尝试破解/修复已知错误? 我在工作期间遇到了它。我在这里提供的代码是我发现的导致错误的最小代码。 关于iframes 的另一种情况是,如果您将鼠标悬停在任何显示工具提示的东西上,只是一个标准的,并且您使用滚轮滚动,它会弄脏屏幕。【参考方案4】:

改进/简化 yossi 的回答:

body 

    background:url('bg.png');

无需声明bg-colorrepeat-x,只需要一张背景图片。

在 Chrome 18.0.1025.168、Mac OS X 10.6.8 上测试。

【讨论】:

【参考方案5】:

从您的#body-content css 中删除float: left;,它会正常工作。

这看起来是 chrome 中的渲染错误。如果您向后滚动很慢,您会注意到您从管理栏中获得了纯色作为 iframe 的颜色。

顺便说一句,OSX 上的 chrome 渲染完全相同。

【讨论】:

谢谢,但问题是,正如我所写,我只能控制 iframe,所以我无法更改浮动:左;在#body-content 上。 您能否在设置float: none; 的页面中添加另一个#body-content css? ok,是不是只能更改show.htm文件中的html? 是的,包括该文件中的 css。 添加另一个#body-content css的问题是它会使包含页面看起来很糟糕,我想保持包含页面的相同功能。【参考方案6】:
#adminbar 
background-color: #464646;
height: 28px;
position: fixed;
width: 100%;
top: 0;
right:0px

#body-content 
float: none;
width: 100%;

【讨论】:

就像我说的,将浮动更改为无会损害网站功能,我只能更改 iframe (show.htm) 我不知道其他方法...对不起【参考方案7】:

获取实际网站的实时演示/版本有助于进行更彻底的测试并解决错误。

无论如何,我都能重现该错误,然后修复它(有点):

这是“显示”css:

body 

    background: #e0e0e0;
    height:100%;
    width:100%;
    z-index:9999;
    position:fixed;

这是我的测试页面的链接:

sotkra.com/t_main.html

最后但同样重要的是,是的,这是一个错误,它是由 iframe 内容的滚动相对于实际的“基本”文档的闪烁引起的。我以前见过类似的问题,但同样没有关于它的文档。他们只是渲染错误,通常是由不特定的 css 或非常奇怪的情况引起的,除了浏览器之外没有人的错。

干杯 G

【讨论】:

yossi,请尝试上述方法,让我知道它是否对您“有效”,就像它是一个有效的解决方案一样。考虑到您的要求,它确实解决了问题,但是,由于无法看到实际的真实网站,我无法判断它是否看起来很时髦 这不起作用,因为我不能再向下滚动。我的 iframe 很长,所以我需要滚动,这首先会导致错误。 问题是iframe自身滚动造成的,标准的页面滚动不会导致这个问题。让我看看我是否可以摆脱 iframe 自己的滚动条 对不起,看起来除非 adminbar 和 iframe 共享固定位置属性,否则你不走运【参考方案8】:

使用渐变作为背景图片也可以。这对我来说更可取,因为我不必创建图像文件,也不会在客户端生成额外的请求。

body 
  background: #FFF -webkit-linear-gradient(top, #FFF, #FFF) repeat-x;
  background-attachment: fixed;

【讨论】:

以上是关于chrome 在滚动时会复制固定元素的主要内容,如果未能解决你的问题,请参考以下文章

在 Chrome 中滚动时出现负 z-index 问题的画布

页面滚动时 CSS3 动画打破固定定位

如何修复 Chrome 中的页面滚动延迟

animate() 在滚动停止之前不会触发

怎么用js固定某个元素,让它不随页面的滚动而滚动,始终固定在窗口的某个位置?

如何将伪元素固定在滚动元素中?