Chrome 下动画卡顿问题的另一种可能
【现象】
动画出现了明显的卡顿,且仅仅出现在 chrome 中。
【原因排查】
一开始使用了css动画的时候已经出现了卡顿。找到如下的文章:CSS3 动画卡顿解决方案、深入浏览器理解CSS animations 和 transitions的性能问题、解决Chrome动画”卡顿”的办法
文章中提到高度变化会引起 Relayout、Repaint。

做了如下修改:
- 移除改变高度的动画,换成 transform 的动画,以减少 Relayout、Repaint 的次数。
- 使用 transform: translateZ(0), 强制开启GPU渲染。
- 加上 will-change 属性,通知浏览器预处理。
动画的确略变流畅了。
然而高度变化还是很有必要,并觉得只由js去控制代码可维护性更好些,最后还是决定放弃了 css,改用js去做动画。考虑到 jQuery 封装的 animate() 十分简单易用,于是采用了 jQuery。
此时动画卡顿问题再次出现,而且在 IE、firefox 中非常流畅。查看资料,jQuery 的 animate 使用了老旧的SetInterval方法实现动画,并没用使用 RAF(Reques tAnimation Frame),不会开启 GUI。(后来发现此说法可能不对,在 jQuery 3 中源码中可以看出其使用了 RAF,jQuery 1中则同前描述)
最后决定改用velocity.js,velocity.js 已经可以脱离 jQuery 直接使用。看官方文档,宣传语是 “快” 。然而并没有什么用,使用之后,Chrome 一如既往的卡,IE 和 Firefox 则是一如既往的流畅。
开启 chrome 调试,查看timeline,发现了神奇的事情。

每次 network 发请求的时候,FPS 都会出奇地降至10一下。
尝试把请求删除,动画恢复正常。虽没有行云流水般流畅,但是肉眼看来已经没大问题了。

最后把请求放在动画结束之后在执行,搞定。
velocity(Div, 'slideUp', {
duration: 500,
complete: function () {
... // DOM 操作
$.ajax(...);
... // setTimeout 操作
}
});
【结论】
问题虽然解决,还需进一步调查原因:
1、尝试把发送请求函数中的 DOM 操作删除,未见明显改善;
2、尝试把发送请求函数中的 setTimeout 定时器删除,未见明显改善;
3、尝试把发送请求函数中的 for in 循环删除,不再卡顿。
在 for in 中做了一个字符串拼接,这个字符串拼接的字符,传值到请求中
for (j in data) {
if (data.hasOwnProperty(j)) {
h.push(encodeURIComponent(j) + '=' + encodeURIComponent(data[j]));
}
}
$.ajax({
...
data: h,
...
});
测试push等性能并无问题,最终问题又回到了ajax请求中来了。至于为何异步请求会引起动画响应变慢,暂时不得而知。
Chrome 下动画卡顿问题的另一种可能的更多相关文章
- CSS3 动画卡顿性能优化解决方案--摘抄
最近在开发小程序,与vue类似,它们都有生命周期这回事. onLoad 监听页面加载 onReady 监听页面初次渲染完成 onShow 监听页面显示 到底是什么意思? 所以这又触碰到了我的知识盲区, ...
- performance面板使用,以及解决动画卡顿
https://googlechrome.github.io/devtools-samples/jank// 官方案例 https://juejin.im/post/5b65105f518825 ...
- javascript 手势(swipeLeft,swipeRight)滑动中使用css3动画卡顿,开启硬件加速
今天,在做一个移动端项目,遇到了css3动画卡顿的现象. 例图: 在手势滑动中(swipeLeft,swipeRight)遇到了动画卡顿的现象,最后使用了css3动画-webkit-transform ...
- React-Native Navigator 过渡动画卡顿的解决方案
在RN0.44版本之前,路由导航跳转几乎是使用的是Navigator组件,在0.44版本以后就不推荐使用了,官方推荐的是react-navigation,当然还是可以在废弃的库中找到: import ...
- mac下idea卡顿问题解决
idea在加载相对来说比较大的系统时,经常性出现卡顿,就是直接卡死,以至于写起代码特别难受. 最后找到的解决方案是修改idea.vmoptions中的内存大小 执行 find / -name idea ...
- 解决Chrome动画”卡顿”的办法
为动画DOM元素添加CSS3样式-webkit-transform:transition3d(0,0,0)或-webkit-transform:translateZ(0);,这两个属性都会开启GPU硬 ...
- 【小知识点】解决Chrome动画”卡顿”的办法
为动画DOM元素添加CSS3样式-webkit-transform:transition3d(0,0,0)或-webkit-transform:translateZ(0);这两个属性都会开启GPU硬件 ...
- ionic1页面切换动画卡顿优化
https://github.com/shprink/ionic-native-transitions https://www.npmjs.com/package/ionic-native-trans ...
- iphone 下滚动条卡顿解决办法
-webkit-overflow-scrolling:touch; -webkit-text-size-adjust:none;
随机推荐
- 开源OSS.Social微信项目解析
前言:OSS.Social是个开源的社交网站接口集成项目,当前也有很多其他不错的项目,不过始终没有我想要的那种简单清晰,只能撸起袖子,从头打造一个.当前正在进行的是对微信项目的开发,这里把对接口的整 ...
- ArcGIS API for JavaScript 4.2学习笔记[3] 官方第二章Mapping and Views概览与解释
目录如下: 连接:第二章 Mapping and Views 根据本人体会, [这一章节主要是介绍地图(Map)和视图(View)的.] 其中,Get started with MapView(2D) ...
- 关于echarts地图下钻。
在去年十二月份,前端老大交代个任务,关于地图下钻.这里做了个简单的青岛地图下钻,初学echarts,做的不精,凑合看看吧. 第一步呢,先引入echarts等文件,这是最基本的. 第二步,到官网下载 ...
- Yii框架中的form表单
<?php//引入命名空间use yii\helpers\Html;?><?php //表单:Html::beginForm(提交地址,提交方法,属性数组);?><?=H ...
- 深入浅出ThreadLocal
前言 ThreadLocal为变量在每个线程中都创建了一个副本,所以每个线程可以访问自己内部的副本变量,不同线程之间不会互相干扰.本文会基于实际场景介绍ThreadLocal如何使用以及内部实现机制. ...
- HTTP学习目录
前面的话 除了HTML.CSS.javascript这三门前端基础知识之外,HTTP恐怕是前端工程师最需要掌握的知识了,它是前端和后端沟通的桥梁,前端工程师需要能够调试HTTP.修复网络传输中可能遇到 ...
- linux上安装Oracle 11g R2 标准版 64位
一.Oracle 安装前的准备 检查一下包,必须全部安装: binutils-2.20.51.0.2-5.43.el6.x86_64 compat-libstdc++-296-2.96-144.el6 ...
- Python之字符串详解1
1. 查看类型 name = 'allen' print(type(name)) #查看类型 <class 'str'> #类型为str age = 19 print(type(name) ...
- JavaScript中几个相似方法对比
一.substring与substr substring substr 概述 返回字符串两个索引之间(或到字符串末尾)的子串 返回字符串从指定位置开始到指定长度的子串 语法 参数 indexSta ...
- win7下安装maven3.1.1
1.下载maven的安装包,下载地址http://maven.apache.org/download.cgi ,在这个页面中,你可以选择要下载的最新版本的maven gz包.我下载的是maven3.1 ...