前端动画性能比较(js动画{ translate vs left/top } vs css动画)

前言

上一篇《从chrome开发工具中直观了解浏览器的渲染过程》我们介绍了如何通过chorme开发者工具查看浏览器渲染页面过程,这篇文章我们介绍如何观察动画性能。

前端离不开动画效果,例如轮播图、轮盘抽奖、跑马灯等,如果页面涉及
成千上万个元素变化,或者需要面向低端性能设备时,页面的性能优化就至关重要了,本文以最简单的js动画和css动画配合chrome的开发者工具做可视化比较,能直观了解各种方法的性能差异。

准备工作

在这里插入图片描述
如上图,我们准备了一个demo,上面有一个item元素,我们会操作它会从左到右运动;

  • 第1组/行动画按钮,是使用js操作left来运动;
  • 第2组/行动画按钮,是使用js操作translateX来运动;
  • 第3组/行动画按钮,是使用css操作translateX来运动;

单帧动画比较

前端性能优化其中有一个说法就是使用translate来代替left,原因是前者能减少重排,真的吗?现在我们测试看看。
我们先使用最简单的一帧动画来测试,分别使用css动画translateX、js动画translateX和left来控制item前进10px。
使用chrome开发者工具中的performance来查看:
在这里插入图片描述

  • css动画translateX前进10px的渲染过程如下图:
    在这里插入图片描述
  • js动画translateX前进10px的渲染过程如下图:
    在这里插入图片描述
  • js动画left前进10px的渲染过程如下图:
    在这里插入图片描述
    可以看出,css动画translate步骤最多,同时translateX比left少了“Layout(重排)”步骤,理论上比left性能要好。当然这是单帧的,动画关键还是要看连续效果性能。

连续动画比较

1、由于现在电脑性能都比较好,所以我们要模拟电脑性能比较低的情况下工作,设置cup为4x:
在这里插入图片描述

2、打开fps插件观察帧频率,在开发者工具中按ctrl+shift+p,然后搜索fps:
在这里插入图片描述

3、1个item体现不出性能瓶颈,我们添加50个item,然后一起运动看看效果,视觉上也基本观察出差别了,当然也可以仔细看fps:
在这里插入图片描述

先执行js动画left播放,再执行js动画translate播放,最后执行css动画translate播放,通过performance来观察:
在这里插入图片描述
如上图,黄色框部分为fps,绿色柱越低表示帧频率越低(越卡),黄色柱下面的火焰图是cup工作情况,火焰颜色越多表示cup要处理的程序越多,性能越低。
可见,动画性能从高到排序为:
css动画translate > js动画translate > js动画left

总结

如果要动画流畅,特别是对于移动端来说:
1、尽量使用css动画
2、使用js动画时,尽量使用css3属性 来代替原始属性(例如translate代替left/top)
3、如有必要,可以使用gpu加速(元素添加3d属性hack – transform:translateZ(0) ,更多方法和原理可以自行百度)
总的方针是减少页面重排、重绘来提高动画性能。

GitHub和在线演示

GitHub地址

在线演示地址

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
前端响应超时时,可以通过以下步骤关闭页面动画: 1. 在页面加载时,设置一个计时器来监控响应时间。 2. 如果超过指定的时间,就认为响应超时了。 3. 在超时时,可以使用 JavaScript 来关闭页面动画。比如,可以使用 jQuery 的 `fadeOut()` 函数来淡出页面元素,或者使用 CSS 的 `display:none` 属性来隐藏页面元素。 4. 如果需要提示用户响应超时,可以在页面上显示一个错误消息,告诉用户页面加载失败了。 以下是一个简单的示例代码: ```html <!DOCTYPE html> <html> <head> <title>关闭页面动画示例</title> <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> <style> .loading { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); } </style> </head> <body> <div class="loading"> <img src="loading.gif" alt="Loading..."> </div> <script> // 设置响应超时时间(单位:毫秒) var timeout = 10000; // 启动计时器 var timer = setTimeout(function() { // 响应超时,关闭页面动画 $('.loading').fadeOut(); // 显示错误消息 alert('网络连接超时,请检查您的网络设置!'); }, timeout); // 模拟 Ajax 请求 $.ajax({ url: 'http://example.com/api', type: 'GET', success: function(response) { // 响应成功,清除计时器 clearTimeout(timer); // 关闭页面动画 $('.loading').fadeOut(); // 处理响应数据 console.log(response); }, error: function(xhr, status, error) { // 响应失败,清除计时器 clearTimeout(timer); // 关闭页面动画 $('.loading').fadeOut(); // 显示错误消息 alert('网络请求失败,请稍后重试!'); } }); </script> </body> </html> ``` 在上面的示例中,我们使用 jQuery 来模拟了一个 Ajax 请求,并且设置了一个响应超时时间为 10 秒。如果在 10 秒内没有收到响应,就会触发超时事件,关闭页面动画并显示错误消息。如果响应成功,就会清除计时器,关闭页面动画,并处理响应数据。如果发生了其他错误,也会关闭页面动画并显示错误消息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值