首页
技术笔记
网址导航
Json在线解析
二维码
Ip地址查询
在线流程图
新用户注册
|
会员登录
在线工具
开发笔记
毒鸡汤
网址导航
免费在线流程图
16赞
683
当前位置:
开发笔记
>
开发工具
> 正文
JS动画比CSS3动画性能谁更好?
作者:小妖694_807 | 2021-08-15 15:19
之前一直以为css3的才是最厉害的,但是最近做HTML5页面发现在微信上的效果不是太好。最近发现的github上比较火的velocity.js,作者宣称要做DOM动画方面的领导者,完全颠覆了我的认识啊。相关链接:CSSvs.JSAnimation:WhichisFaster?
之前一直以为css3的才是最厉害的,但是最近做HTML5页面发现在微信上的效果不是太好。
最近发现的github上比较火的velocity.js,作者宣称要做DOM动画方面的领导者,完全颠覆了我的认识啊。
相关链接:
CSS vs. JS Animation: Which is Faster?
回复内容:
稍微做过一点点 Web App,目前深陷在 Android Webview 里不能自拔,来谈一点看法。
1. 在现代PC 浏览器上,CSS3 Animation 和 Transition 好写好用,流畅丝滑,而且动画过程0 GC。当然js 控制DOM动画如果控制好了,不要频繁reflow,动画也流畅。
2. 在 iOS Safari 上,CSS3 动画和js动画都容易搞流畅,只要别reflow。
3. 在 iOS Webview 上,不能用jit,js性能下降严重,如果CSS3动画能解决还是别用js。某个版本iOS之后这个限制解除了好像,不太了解。
4. 低版本 Android 用的是很老的 Webkit,没有硬件加速,CSS3支持不完全,2d Canvas有bug,性能比chrome 差老远了,如果动画复杂又大块,DOM树复杂,还用了box-shadow 之类很耗性能的样式,很难做流畅。
这种情况请考虑 Chrome on Android,或者crosswalk。
5. Android 4.4 以后,系统自带chromium,体验能做到与iOS safari不相上下。
====
另外多提一句GC。
GC 你听过吧?如果不用CSS3 Animation 和 Transition,就要用 requestAnimationFrame() 。在动画的过程中会不断调用js,消耗内存,一段时间之后触发GC,如果GC时间超出frame budget,动画会卡顿。
如果非要用js动画,那么也请考虑使用无reflow 的 transform属性,加上 translateZ(0) 强制指定硬件加速。 JS 动画也是通过更改 CSS 实现的。
而且从设计的角度来说,CSS 本身就是设计用来表现样式,JS 控制逻辑。JS 动画是 CSS3 出现之前的曲线救国。
个人觉得,简单的动画还是用 CSS 做,特别复杂的再用 JS。
codepen 上面的趋势是去 JS 化,动画一律用 CSS 实现。借助 LESS 等预编译语言可以做出很复杂的动画。
性能的话,短期手机浏览器可能对 CSS3 支持不太好,但长期一定是会优于 JS 的。 其实这个。。。。。看引擎的。。。。
chrome上css3明显流畅过js,IE11上的js动画如丝般顺滑。。。。 动画的性能的关键,不在于js执行的效率,而在于dom结构。所以css原生动画,与js动画并不会相差太大。
优化动画性能,就要减轻dom,使用合理的定位方式,等等。 这种对比应该还是要来个例子。
这是前几天我翻译一篇文章时看到的对比Building Great Mobile Menus (为你的网站创建移动菜单)
对了,我的翻译只是为了自己总结学习,有精简很多。。建议看原文=-=
不是涉及复杂的计算,css明显快,但是涉及到复杂的计算,比如点是不确定的,你还是要用js。
其实这种对比个人感觉没什么意义(可能是我水),在项目中, 大多数情况下-0-你都要用js来计算。 js+canvas(html5)+水平>css3>js+dom 就说一点,JS动画比CSS3动画有控制,且没有兼容性问题 从原理上来说的话
CSS == iOS
JS == Android
(以20马赫快速逃跑中 个人项目体会:
在没有RAF时,css方式流畅度占优。
有RAF后两者相当。
js方式要求开发人员对js足够熟悉,以避免引入其他问题 其实这点差别在实际大部分使用情况下并木有卵区别……
推荐阅读
程序员
在嵌入代码和非嵌入代码之间维护单个代码库
如何解决《在嵌入代码和非嵌入代码之间维护单个代码库》经验,为你挑选了1个好方法。 ...
[详细]
程序员
我们可以直接将Parquet文件加载到Hive吗?
如何解决《我们可以直接将Parquet文件加载到Hive吗?》经验,为你挑选了2个好方法。 ...
[详细]
程序员
如何在app进入前台之前准备UI更新
如何解决《如何在app进入前台之前准备UI更新》经验,为你挑选了0个好方法。 ...
[详细]
程序员
如何在Ipython(py 2.7)笔记本中更改markdown单元格的字体大小和颜色
如何解决《如何在Ipython(py2.7)笔记本中更改markdown单元格的字体大小和颜色》经验,为你挑选了1个好方法。 ...
[详细]
程序员
Django Queryset过滤列表中的参数
如何解决《DjangoQueryset过滤列表中的参数》经验,为你挑选了1个好方法。 ...
[详细]
程序员
Lua coroutines - setjmp longjmp clobbering?
如何解决《Luacoroutines-setjmplongjmpclobbering?》经验,为你挑选了1个好方法。 ...
[详细]
程序员
主持人是否知道MVP模式中的活动/上下文是个坏主意?
如何解决《主持人是否知道MVP模式中的活动/上下文是个坏主意?》经验,为你挑选了2个好方法。 ...
[详细]
程序员
AngularJS 1.4.8 - 当我在选项之前以编程方式设置模型时,选择 - 无限$ digest()循环中的ngOptions在ngOptions中
如何解决《AngularJS1.4.8-当我在选项之前以编程方式设置模型时,选择-无限$digest()循环中的ngOptions在ngOptions中》经验,为你挑选了0个好方法。 ...
[详细]
程序员
时间(NULL)是否会返回失败?
如何解决《时间(NULL)是否会返回失败?》经验,为你挑选了2个好方法。 ...
[详细]
程序员
如何在Visual Studio 2015上隐藏团队活动行?
如何解决《如何在VisualStudio2015上隐藏团队活动行?》经验,为你挑选了1个好方法。 ...
[详细]
程序员
在Spring启动时编写自定义查询
如何解决《在Spring启动时编写自定义查询》经验,为你挑选了1个好方法。 ...
[详细]
程序员
用javascript替换图像上的src
如何解决《用javascript替换图像上的src》经验,为你挑选了1个好方法。 ...
[详细]
程序员
Java JComboBox故障图形
如何解决《JavaJComboBox故障图形》经验,为你挑选了0个好方法。 ...
[详细]
程序员
创建数据库连接昂贵吗?
如何解决《创建数据库连接昂贵吗?》经验,为你挑选了0个好方法。 ...
[详细]
程序员
如何解析.txt文件?
如何解决《如何解析.txt文件?》经验,为你挑选了1个好方法。 ...
[详细]
程序员
从MVC控制器使用Web API时返回JSON结果
如何解决《从MVC控制器使用WebAPI时返回JSON结果》经验,为你挑选了1个好方法。 ...
[详细]
程序员
将内容推送到数组
如何解决《将内容推送到数组》经验,为你挑选了1个好方法。 ...
[详细]
程序员
使用boto3完成multipart_upload?
如何解决《使用boto3完成multipart_upload?》经验,为你挑选了0个好方法。 ...
[详细]
程序员
forEach回调不会使用getElementsByClassName执行
如何解决《forEach回调不会使用getElementsByClassName执行》经验,为你挑选了1个好方法。 ...
[详细]
程序员
Javascript正则表达式
如何解决《Javascript正则表达式》经验,为你挑选了1个好方法。 ...
[详细]
吐了个 "CAO" !
吐个槽吧,看都看了
会员登录
|
用户注册
小妖694_807
这个屌丝很懒,什么也没留下!
关注作者
Tags | 热门标签
eclipse
emacs
git
github
intellij-idea
macos
phpstorm
pycharm
sublime-text
svn
vim
visual-studio
visual-studio-code
webstorm
windows
编辑器
RankList | 热门文章
1
我的解决方案在哪里永久禁用延迟加载?
2
在django框架之外使用django模型
3
istream_iterator迭代二进制文件中的字节
4
Yocto/bitbake/OpenEmbedded:build/conf/local.conf内容的最佳位置?
5
使用WindowManager.LayoutParams.TYPE_KEYGUARD时,最小目标必须小于14
6
在MongoDB中查找具有字符串ID数组的文档
7
使用Jackson序列化UUID集
8
错误:[$ compile:nonassign]与指令'uibTab'一起使用的表达式是不可赋值的
9
GCC没有工作,但G ++确实如此
10
在TensorFlow中使用矩阵乘法函数
11
Pycharm Community Edition:"无法显示帧变量"
12
搜索2d阵列中最大的空间
13
css3列和溢出隐藏
14
水平UICollectionView单行布局
15
SQL:选择具有相同单词的字符串
16
使用Action Listener获取JButton的文本
17
将变量传递给嵌套的Handlebars模板/部分
18
SBT插件在非托管jar文件中
19
设置onSeekBarChangeListener会导致null对象异常
20
如何在Lisp中格式化REPL输出的数字精度?
DevBox开发工具箱 | 专业的在线开发工具网站
京公网安备 11010802040832号
|
京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有