我正在开发一个支持触摸的 html5+css3 图片库。目标设备主要是平板电脑和其他移动设备。图片很大(大约 1000x1500),一个画廊可以有 100 到 200 张图片。画廊基本上是一个旋转木马,用户可以左右滑动以在画廊中移动。它的工作方式是将图像布置在一个 div(名为#ribbon)中,当您向左滑动时,该 div 会向左过渡,从而将下一个图像滑入视图。
<div id="carousel">
<div id="ribbon">
<div class="slide"><img src=""></div>
<div class="slide"><img src=""></div>
为了限制带宽消耗和初始加载时间,实际上只将前 10-15 个图像容器插入到 html 中。当您滑动到轮播的中心时,第一个图像容器会跳到轮播的末尾,并在动画结束时加载新的图像。在 Safari 和 iOS 上,这就像黄油一样顺畅。
我知道不要不必要地触摸 DOM,尤其是在 CSS 转换运行时,代码在这方面应该是最佳的。但是,在 Chrome(桌面和 Android)中,每次设置下一个图像 src 时,动画都会出现打嗝。我可以在开发人员工具中看到这一点,显然导致打嗝的事件是图像大小调整和渲染。
为了尝试使动画更流畅,每次拖动事件开始时,所有图像(当前、左、右除外)都设置为白色 gif 像素。当您快速浏览图库时,这也很有帮助,因为它会跳过加载不必要的图像。
有没有办法缓解这个问题?
jsFiddle 示例
一个简化的例子。不确定这是否足以证明问题,但我尝试计时滑动事件以中断图像解码和渲染。
补充说明
- 我尝试通过画布调整图像大小并将图像 src 设置为 canvas.toDataUrl(),但它似乎没有帮助。也许我应该尝试网络工作者?
- 我已经在使用 3D 变换。
- 应用了所有 CSS hack,translate3d,perspective: 1000(这在 Chrome 中似乎有很大帮助)。
- 背面可见性:隐藏会导致不需要的副作用,例如只显示图像的一部分。
- 在 img 元素本身上启用 3D 有助于 chrome,但对 iOS 中的动画性能有不利影响。幸运的是,有一个 window.chrome 对象可以很容易地检测到 chrome。