【现象】

动画出现了明显的卡顿,且仅仅出现在 chrome 中。

【原因排查】

一开始使用了css动画的时候已经出现了卡顿。找到如下的文章:CSS3 动画卡顿解决方案深入浏览器理解CSS animations 和 transitions的性能问题解决Chrome动画”卡顿”的办法

文章中提到高度变化会引起 Relayout、Repaint。

做了如下修改:

  1. 移除改变高度的动画,换成 transform 的动画,以减少 Relayout、Repaint 的次数。
  2. 使用 transform: translateZ(0), 强制开启GPU渲染。
  3. 加上 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 下动画卡顿问题的另一种可能的更多相关文章

  1. CSS3 动画卡顿性能优化解决方案--摘抄

    最近在开发小程序,与vue类似,它们都有生命周期这回事. onLoad 监听页面加载 onReady 监听页面初次渲染完成 onShow 监听页面显示 到底是什么意思? 所以这又触碰到了我的知识盲区, ...

  2. performance面板使用,以及解决动画卡顿

    https://googlechrome.github.io/devtools-samples/jank//    官方案例 https://juejin.im/post/5b65105f518825 ...

  3. javascript 手势(swipeLeft,swipeRight)滑动中使用css3动画卡顿,开启硬件加速

    今天,在做一个移动端项目,遇到了css3动画卡顿的现象. 例图: 在手势滑动中(swipeLeft,swipeRight)遇到了动画卡顿的现象,最后使用了css3动画-webkit-transform ...

  4. React-Native Navigator 过渡动画卡顿的解决方案

    在RN0.44版本之前,路由导航跳转几乎是使用的是Navigator组件,在0.44版本以后就不推荐使用了,官方推荐的是react-navigation,当然还是可以在废弃的库中找到: import ...

  5. mac下idea卡顿问题解决

    idea在加载相对来说比较大的系统时,经常性出现卡顿,就是直接卡死,以至于写起代码特别难受. 最后找到的解决方案是修改idea.vmoptions中的内存大小 执行 find / -name idea ...

  6. 解决Chrome动画”卡顿”的办法

    为动画DOM元素添加CSS3样式-webkit-transform:transition3d(0,0,0)或-webkit-transform:translateZ(0);,这两个属性都会开启GPU硬 ...

  7. 【小知识点】解决Chrome动画”卡顿”的办法

    为动画DOM元素添加CSS3样式-webkit-transform:transition3d(0,0,0)或-webkit-transform:translateZ(0);这两个属性都会开启GPU硬件 ...

  8. ionic1页面切换动画卡顿优化

    https://github.com/shprink/ionic-native-transitions https://www.npmjs.com/package/ionic-native-trans ...

  9. iphone 下滚动条卡顿解决办法

    -webkit-overflow-scrolling:touch; -webkit-text-size-adjust:none;

随机推荐

  1. Dubbo源码学习文章目录

    目录 Dubbo源码学习--服务是如何发布的 Dubbo源码学习--服务是如何引用的 Dubbo源码学习--注册中心分析 Dubbo源码学习--集群负载均衡算法的实现

  2. 二叉搜索树Java实现(查找、插入、删除、遍历)

    由于最近想要阅读下 JDK1.8 中 HashMap 的具体实现,但是由于 HashMap 的实现中用到了红黑树,所以我觉得有必要先复习下红黑树的相关知识,所以写下这篇随笔备忘,有不对的地方请指出- ...

  3. LoRaWAN协议(七)--完整数据流程

    以下的GW指Gateway 所用指令: root@lora-iot-sk:~# tcpdump -i lo -nn -x 'length>100' 入网流程 GW -> NS join_r ...

  4. 关于github中的README.md文件

    0x01 README.md文件是用Markdown语言编写的,md=Markdown; 在线编辑工具: https://stackedit.io/editor# https://maxiang.io ...

  5. 用手机或外部设备在同一局域网下访问虚拟主机wampsever的方法版本号是2.4.9

    1,首先在虚拟服务器电脑上可以打开http://localhost/ 2,在外部设备访问时报错为:You don't have permission to access / in on this se ...

  6. spring和UEditor结合

    前言 春节无聊,就去弄一下富文本编辑器,然后百度了一番,很多说百度的UEditor不错,然后去官网照着文档弄一遍,是挺简单好用的.然后想把这玩意结合到自己的一个spring项目里面,果然还是在点上传图 ...

  7. 《Java从0开始的成长之路》

    大纲 这篇博文是我整理寒假一个月来的总结 作用一:主要是方便我以后复习,并尝试对Java虚拟机深度挖掘,希望各位前辈给予指点,我会潜心钻研,只希望水平更进一步. 作用二:闭关锁国终将遭遗弃,希望汇聚网 ...

  8. p1221网络布线(最小生成树 Prim(普里母)算法) p1222 Watering Hole

    描述 Description 农民约翰被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的农场.当然,他需要你的帮助.约翰已经给他的农场安排了一条高速的网络线路,他想把这条线路 ...

  9. Java多线程编程(四)—浅谈synchronized与lock

    一.共享资源竞争问题 在Java语言的并发编程中,由于我们不知道线程实际上在何时运行,所以在实际多线程编程中,如果两个线程访问相同的资源,那么由于线程运行的不确定性便会在这种多线程中产生访问错误.所以 ...

  10. 读书笔记 effective c++ Item 24 如果函数的所有参数都需要类型转换,将其声明成非成员函数

    1. 将需要隐式类型转换的函数声明为成员函数会出现问题 使类支持隐式转换是一个坏的想法.当然也有例外的情况,最常见的一个例子就是数值类型.举个例子,如果你设计一个表示有理数的类,允许从整型到有理数的隐 ...