css - Webkit 动画在屏幕上留下垃圾像素

标签 css ios animation webkit mobile-safari

以下代码在屏幕上放置了一个白框。如果您在 iPad 上运行它(您也可以调整像素以在 iPhone 上运行它),当您触摸该框时,它会快速离开屏幕,并在其底部边缘留下白色像素痕迹。

<!DOCTYPE HTML>
<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="width=device-height, user-scalable=no, maximum-scale=1, minimum-scale=1" />
    <title>Line Bug Demo</title>
    <style>
body {
  background: black;
}
.panel {
  background: white;
  position: absolute;
  z-index: 2;
  width: 1000px;
  height: 500px;
  top: 34px;
  left: 12px;
  -webkit-border-radius: 20px;
  -webkit-transition: left 0.333s ease-in-out;
}
.panel.hide {
  left: -1000px;
}
    </style>
  </head>
  <body>
    <div class="panel" onclick="this.setAttribute('class', 'panel hide')"></div>
  </body>
</html>

解决这个问题的关键是使用边框半径,并制作动画。如果你只是把它从屏幕上弹出,就没有踪迹。如果没有边界半径,则没有轨迹。

以下是我目前发现的解决方法:

.panel.hide { -webkit-border-radius: 0; }

丑陋,而且对我的应用程序来说不是很实用,因为我正在为面板内外设置动画,而且我真的想要在屏幕上显示圆 Angular 。

另一个:

.panel { -webkit-transform: translateZ(0); }

这会将面板放入硬件管道,从而正确地进行合成。虽然这适用于这个简单的演示,但在我的真实 Web 应用程序中使用硬件管道会导致内存不足错误。 (激烈的、巨大的、直接的变化。)

关于如何摆脱这条线索的任何其他想法?

最佳答案

解决方案

box-shadow: 0 0 1px rgba(0, 0, 0, 0.05);

如果您觉得这太明显,您可以使用框的背景颜色作为 box-shadow 颜色。

或者,根据这个answer on a similar issue in Chrome (感谢 Sebastian 在提示的评论中),您可能想尝试:

outline: 1px solid transparent;

发生了什么事?

我给了一个 fairly lengthy explanation别处,但这里是简短的版本。出于性能原因,WebKit 仅重绘页面中它认为可能已更改的部分。然而,iOS(pre-7)Safari 实现的边框半径抗锯齿超出了盒子的计算尺寸几个像素。因为 WebKit 不知道这些像素,所以它们不会被重绘;相反,它们被留在后面并在每个动画帧上累积。

通常的解决方案——正如我在其他答案中所建议的那样——是强制该元素需要硬件加速,以便它被绘制为一个单独的层。但是,过多的小元素或一些大元素会导致将大量图 block 推送到 GPU,从而对性能产生明显影响。

使用 box-shadow 更直接地解决了这个问题:它扩展了框的重绘尺寸,迫使 WebKit 重绘额外的像素。移动浏览器中 box-shadow 的已知性能影响与使用的模糊半径直接相关,因此一个像素的阴影应该几乎没有影响。

关于css - Webkit 动画在屏幕上留下垃圾像素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9983520/

相关文章:

css - 如何检测操作系统在浏览器中是否处于暗模式?

jquery - Android WebView Javascript 接口(interface)与浏览器冲突

c# - 用于 Web 应用程序的开源照片马赛克

ios - 如何使用 AVCaptureVideoPreviewLayer 从相机应用程序实现 2 倍变焦

CSS:动画并将图像一个接一个地滑动到屏幕上?

html - 使用背景颜色的多色圆形 div?

ios - 是否可以强制设备的日期测试本地通知?

iphone - 工具栏上的 xcoded 静音按钮可使 App 的声音静音

javascript - Div从左上角滑动到右上角的动画

animation - 变换 : rotate. 上的 CSS3 动画获取旋转元素当前度数的方法?