我一直在研究一个使用 CSS3 过渡的幻灯片脚本,或者当它们不可用时使用 jQuery 的动画。我创建了一个自定义函数来执行幻灯片动画,这很合适。一切似乎都运行良好,但我在测试过程中遇到了一个重大障碍。
由于某种原因,在大型幻灯片的过渡前后应用 jQuery CSS 会有很大的延迟。例如,下面链接中的幻灯片大约有 9900 像素宽(容器宽度,其中大部分是隐藏的)。使用 CSS3 过渡和变换属性操纵容器以显示适当的幻灯片。在下面粘贴的第 75 - 82 行之间应用 CSS 会出现延迟。特别是,应用“过渡”CSS 会导致问题。将“过渡”CSS 添加到样式表(而不是使用 JS 应用它),延迟就会消失。然而,这并不是一个真正的解决方案,因为我们只想在特定属性上使用 CSS3 转换,这可能会有所不同(在样式表中使用“全部”会转换一些我们不想动画但定期更改的 CSS)。
动画功能: http: //pastebin.com/9wumQvrP
幻灯片演示: http ://www.matthewruddy.com/demo/?p=2431
真正的问题在于 iOS,其中幻灯片(有时甚至是浏览器)变得完全无法使用。我无法查明任何错误,并且真的用尽了我调试 JS 的知识。在玩了一会儿之后,我确信它与这部分功能有关,并且在插件中完全禁用 CSS3 支持可以完全消除问题。
我完全陷入困境,非常感谢任何人可以提供的任何帮助。
- - 编辑 - -
我尝试使用原生 Javascript 而不是 jQuery 的 .css 函数来应用 CSS。结果相同,没有更好的性能。另外值得注意的是,这在 Firefox 中根本没有发生,而且似乎只是 Webkit 浏览器的问题。
任何有解决方案的人都乐意为几瓶啤酒捐款!我真的想不通这个!
--- 第二次编辑 ---
好的,所以一直在调试,我可以看到速度变慢是由浏览器重绘周期导致的,该周期需要很长时间。有没有更好的方法来处理它已经在做的事情?绝对定位元素是减少重绘的一种已知方法,但这并不真正有效,因为幻灯片是响应式的。绝对定位幻灯片图像或幻灯片本身会导致其折叠。
--- 第三次编辑 ---
一天后,我取得了一些进展。在元素样式表中添加“transition: all 0s ease” CSS 已经摆脱了通过原帖中提到的自定义动画功能添加内联 CSS 过渡属性引起的重绘。这会带来显着的性能提升,尤其是在转换本身完成后移除内联 CSS 转换属性时。
好东西!但是,现在在转换后移除内联 CSS 转换(用于创建硬件加速转换效果本身)并应用左侧定位时,仍然会出现减速。当两者同时发生时,就会出现减速。
将它们分成两个单独的任务(删除翻译,然后在未指定时间的 setTimeout 中添加左侧位置),再次摆脱重绘 = 性能增益,看起来问题已解决。但有时,CSS 过渡属性没有足够快地被否定,并且翻译删除被动画化。不好,不知道在哪里可以解决它。