尽量使用translate而不是改变top/left进行动画(翻译)

前言

本文翻译自 Why Moving Elements With Translate() Is Better Than Pos:abs Top/left,本文有改动,添加了一些作者自己的理解,不当之处还请看客指出。

翻译正文

目前我们对文档中的某个元素进行移动有两种方式,

1,使用transform提供的translate族函数进行缓动

2,对元素进行绝对定位,在制定时间内改变top/left值

但是,这两种方式有什么区别呢?

长话短说,作者在通过模拟测试,并在chrome上检测了动画的FPS,发现了两者的显著区别:性能。

左上方的图片是通过改变元素top/left进行动画的帧率,而右上方则是调用translate函数的帧率。我们可以明显看出左图的每一帧都执行了相对较长时间的paint,在每一帧内,cpu都需要计算该元素的其他样式,特别是相对需要复杂计算的盒阴影,渐变,圆角等样式,最后都需要将这些样式应用到该元素内。从这个角度看,如果对于较为老旧的移动设备进行相对复杂的动画,那么效果肯定不理想。

而通过调用translate,会启动硬件加速,即在GPU层对该元素进行渲染。这样,CPU就会相对解放出来进行其他的计算,GPU对样式的计算相对较快,且保证较大的帧率。我们可以通过2d和3d的transform来启用GPU计算。

总结

最后,总结下对元素进行动画的一些要点:

1,尽量使用keyframes和transform进行动画,这样浏览器会自身分配每帧的长度,并作出优化

2,如果非要使用js来进行动画,使用requestAnimateFrame

3,使用2d transform而不是改变top/left的值,这样会有更短的repaint时间和更圆滑的动画效果

4,移动端的动画效果可能会比pc端的差,因此一定要注意性能优化,尽量减少动画元素的DOM复杂性,待动画结束后异步执行DOM操作

时间: 2024-08-11 01:36:23

尽量使用translate而不是改变top/left进行动画(翻译)的相关文章

条款十二: 尽量使用初始化而不要在构造函数里赋值

看这样一个模板,它生成的类使得一个名字和一个t类型的对象的指针关联起来. template<class t> class namedptr { public: namedptr(const string& initname, t *initptr); ... private: string name; t *ptr; }; 在写namedptr构造函数时,必须将参数值传给相应的数据成员.有两种方法来实现.第一种方法是使用成员初始化列表: template<class t>

尽量少嵌套无用的div;外部文件尽量使用link而不要使用用@import

最近的工作又学到了很多东西,在这里记录一下. 1,尽量少嵌套无用的div,这个问题领导很严肃的跟我提过很多次,因为我很喜欢用很多div,而且有很多div都是无存在意义的.后来领导给了我一些资料,我看了一下,发现这样做确实存在很大的问题,原因如下:(以下蓝底文字摘自搜狐WEB标准) 2.1 节约运营成本 采用 WEB 标准制作,我们可以做到表现和形式及内容的分离,我们采用XHTML 语言来表现(数据),用CSS 来控制(页面元素呈现的)形式.写的好的页面,XHTML 代码中基本上都是用户要看的数据

Javascript学习------top/left简单动画,效果与jquery的动画差不多

在网上查看jquery的动画帧率为13毫秒 我用下面的小例子验证了一下: 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <title>top/left简单动画</title> 5 <style type="text/css"> 6 * { margin: 0px; padding: 0px; } 7 </style> 8 <script src="http:

$translate改变语言没有立即执行翻译

现在很多软件都已支持多语言,我们项目中也不例外.angular 的 $translate 很好用,进行简单的配置就能使用多种语言,这里不详细讲解它的配置什么的,百度一下太多了... 我们使用 $translate.use(language) 来实现语言的切换,然后它会自动的去加载对应的 .json 文件,实现语言的翻译切换,真的很好用哦~ 我们还可以通过 $translate.use() 的方式来对现应用的语言进行获取. 那么就进入详细问题的出现以及解决过程环节啦! 起初项目完结后的回归测试没有

为什么在写css时尽量使用class而不使用id来标记元素

虽然一直以来写css代码都是用得class类名来标记元素,但这更多是自己的习惯,今天对这个问题做个分析总结. 下面是为什么这么做的具体原因 一:元素的class类名可以有很多个,而id名只能有一个.通过给一个元素添加多个class类名,可以更为灵活的控制元素的样式 <div class="size color"></div> //尺寸为200 * 200,背景颜色为pink .size { width: 200px; height: 200px; } .colo

第9项:尽量使用try-with-resources而不是try-finally(Prefer try-with-resources to try-finally)

??Java库包含许多必须通过调用close方法手动关闭的资源. 示例包括InputStream,OutputStream和java.sql.Connection. 关闭资源经常被客户忽视,可预见的可怕性能后果. 虽然其中许多资源使用终结方法作为安全网,但终结方法不能很好地工作(第8项). ??在之前的做法中(Historically),try-finally语句是保证资源正确关闭的最佳方式,即使出现异常或在return的时候(even in the face of an exception o

animation之translate、scale、alpha、rotate动画效果呈现

动画类型 Android的animation由四种类型组成 XML中 alpha 渐变透明度动画效果 scale 渐变尺寸伸缩动画效果 translate 画面转换位置移动动画效果 rotate 画面转移旋转动画效果 JavaCode中 AlphaAnimation 渐变透明度动画效果 ScaleAnimation 渐变尺寸伸缩动画效果 TranslateAnimation 画面转换位置移动动画效果 RotateAnimation 画面转移旋转动画效果 Android动画模式 Animation

Core Animation 文档翻译 (第七篇)—改变Layer的默认动画

前言 核心动画使用action对象实现它的可视化动画.一个action对象是指遵循CAAction协议并定义了Layer相关的动画行为的对象.所有的CAAnimation对象实现了这个协议,无论何时Layer的属性发生变化的时候就会执行对应的action对象(包含CAAnimation对象). 可动画的属性是action的一种类型,我们可以定义几乎所有我们想要的actions,为了达成这个目的,我们就需要定义自己的action并把它们关联到Layer对象 ? 自定义遵守CAAction协议的Ac

Gradle 1.12翻译——第十九章. Gradle 守护进程

有关其他已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或访问:http://gradledoc.qiniudn.com/1.12/userguide/userguide.html 本文原创,转载请注明出处:http://blog.csdn.net/maosidiaoxian/article/details/41343615 关于我对Gradle的翻译,以Github上的项目及http://gradledoc.qin