【发布时间】:2012-04-16 12:46:00
【问题描述】:
以下代码在屏幕上放置一个白框。如果您在 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; }
丑陋,而且对我的应用程序来说不太实用,因为我正在为面板内外设置动画,而且我真的想要在屏幕上显示圆角。
另一个:
.panel { -webkit-transform: translateZ(0); }
这会将面板放入硬件管道中,从而正确地进行合成。虽然这适用于这个简单的演示,但在我的真实 Web 应用程序中使用硬件管道会导致内存不足错误。 (种类繁多,种类繁多。)
关于如何摆脱这条线索的任何其他想法?
【问题讨论】:
-
你试过
-webkit-backface-visibility: hidden;吗? -
当然这是一个错误。你如何做动画并不重要。
-
这是一个老问题,但my answer here 解释了原因。简而言之,Quartz 抗锯齿绘制了一排微弱的半透明像素,这些像素位于元素的计算高度和宽度之外,因此它们永远不会在重新绘制时被清除并构建每个动画帧。如果您愿意,我可以建议一个不依赖硬件加速的简单修复?
-
@jesmith 太好了!简单地说,我的想法是通过在每个方向上将盒子的计算尺寸增加一个像素来强制 WebKit 重新绘制额外的像素。不幸的是,我没有旧的 iOS 设备可供测试,所以您介意为我尝试一些建议吗?第一个建议:将
box-shadow: 0 0 1px rgba(0,0,0,.05);添加到.panel规则集中。视觉影响应该是最小的,但它会强制在每个边缘上绘制额外的一行像素。 (如果这不起作用,请尝试稍微增加 alpha。) -
@JordanGray,效果很好。我很感激。
标签: css ios animation webkit mobile-safari