17

显示然后隐藏动画指示器/微调器 gif 是向用户展示他们的操作已经完成并且在他们等待操作完成时正在发生某些事情的好方法 - 例如,如果操作需要从服务器加载一些数据(s ) 通过 AJAX。

我的问题是,如果减速的原因是处理器密集型功能,则 gif 冻结。

在大多数浏览器中,GIF 会在需要处理器的函数执行时停止动画。对用户来说,这看起来像是发生了崩溃或故障,而实际上它正在工作。

JSBIN 示例

注意:“这很慢”按钮会占用处理器一段时间 - 对我来说大约 10 秒,具体取决于 PC 规格。您可以使用 HTML 中的“data-reps”属性更改它执行此操作的程度。

在此处输入图像描述

  • 预期:点击时,动画运行。当该过程完成时,文本会发生变化(我们通常也会隐藏指示器,但如果我们让它旋转,示例会更清晰)。
  • 实际结果:动画开始运行,然后冻结直到过程结束。这给人的印象是某些东西被破坏了(直到它突然意外地完成)。

如果 JS 使处理器保持忙碌状态,是否有任何方法可以表明进程正在运行且不会冻结?如果没有办法让某些东西变成动画,我将求助于显示然后隐藏一条静态文本消息Loading...或类似的东西,但动画看起来更活跃。


如果有人想知道为什么我要使用处理器密集型的代码,而不是仅仅通过优化来避免问题:这是很多必然复杂的渲染。代码非常高效,但它所做的事情很复杂,所以它总是对处理器要求很高。它只需要几秒钟,但这足以让用户感到沮丧,并且有大量的研究可以追溯到很长一段时间内表明指标对 UX 有好处


第二个与 gif 微调器相关的问题是,在一个同步集中的所有代码都运行之前,微调器实际上不会显示 - 这意味着它通常不会显示微调器,直到隐藏微调器的时间。

  • JSBIN 示例
  • 我在这里找到的一个简单解决方法(在上面的另一个示例中使用)是在setTimeout( function(){ ... },50);以非常短的间隔显示指标后包装所有内容,以使其异步。这行得通(见上面的第一个例子),但它不是很干净——我相信有更好的方法。

我确信必须有一些标准方法来指示我不知道的处理器密集型加载指标 - 或者仅使用Loading...文本与setTimeout? 我的搜索一无所获。我已经阅读了 6 或 7 个关于听起来相似的问题的问题,但它们都被证明是无关的。


编辑评论中的一些很好的建议,这里是我的确切问题的更多细节:

  • 复杂的过程包括处理大的 JSON 数据文件(例如,加载文件后在内存中进行 JS 数据操作操作),以及渲染 SVG(通过 Raphael.js)可视化,包括复杂、详细的可缩放世界地图,基于来自 JSON 的数据处理。所以,有些需要 DOM 操作,有些则不需要。
  • 不幸的是,我确实需要支持 IE8,如有必要,我可以为 IE8 / IE9 用户提供最小的回退,如Loading...文本,并为其他所有人提供现代的东西。
4

2 回答 2

7

如果动画是使用变换实现的,而不是通过更改属性来实现,现代浏览器现在会独立于 UI 线程运行 CSS 动画。可以在http://www.phpied.com/css-animations-off-the-ui-thread/找到关于此的文章。

例如,http ://projects.lukehaas.me/css-loaders/ 中的一些 CSS 微调器是通过转换实现的,并且在 UI 线程繁忙时不会冻结(例如,该页面上的最后一个微调器)。

于 2015-11-21T01:24:44.527 回答
2

我过去也遇到过类似的问题。最终,它们已通过优化或在响应用户操作的较小卡盘中进行工作而得到修复。在您的情况下,不同的缩放级别会触发不同的渲染算法。您只会处理用户可以看到的内容(可能还有缓冲区边距)。

我相信对您来说,跨浏览器的唯一简单解决方法是使用 setTimeout 让 ui 线程有机会运行。将您的工作分成一组操作,并使用多个 setTimeout 调用将它们链接在一起。这将减慢总处理时间,但至少会给用户提供反馈。显然,此建议要求您的处理可以轻松分割。如果是这种情况,您还可以考虑为改进的 UX 添加进度条。

于 2013-12-19T20:26:04.943 回答