百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

JavaScriptjQuery动画与CSS动画性能比较

toyiye 2024-06-21 12:06 11 浏览 0 评论

一直以来,大家可能认为基于JavaScript的动画总是比CSS动画一样快或更快。事实是这样的吗?本文将介绍基于JavaScript的DOM动画库(如Velocity.js和GSAP)是否比基于jQuery和CSS的动画库更为出色。

jQuery

JavaScript和jQuery被错误地混为一谈。JavaScript动画很快。jQuery减慢了速度。为什么?因为 - 尽管jQuery非常强大 ,但jQuery的设计目标并不是成为一个高性能的动画引擎:

?jQuery不能避免布局的摆动(layout thrashing),因为它的代码库,为的是除了动画以外的许多用途。

?jQuery的内存消耗频繁地触发了暂时冻结动画的垃圾收集。

?jQuery使用setInterval而不是requestAnimationFrame(RAF)

需要注意的是布局中造成启动动画抖动,垃圾收集时导致动画的抖动,其根本原因就是产生较低的帧速率。

实现的例子

避免布局抖动包括简单地将DOM查询和DOM更新组合在一起:

var currentTop,currentLeft;

/* With layout thrashing. */

currentTop = element.style.top; /* QUERY */

element.style.top = currentTop + 1; /* UPDATE */

currentLeft = element.style.left; /* QUERY */

element.style.left = currentLeft + 1; /* UPDATE */

/* Without layout thrashing. */

currentTop = element.style.top; /* QUERY */

currentLeft = element.style.left; /* QUERY */

element.style.top = currentTop + 1; /* UPDATE */

element.style.left = currentLeft + 1; /* UPDATE */

在更新后进行的查询强制浏览器重新计算页面的样式数据(同时考虑新的更新效果)。这对于仅在16ms的微小间隔上运行的动画产生显着的开销。

同样,执行RAF也不需要对现有代码库进行重大的修改。我们来比较RAF的基本实现与setInterval的基本实现:

var startingTop = 0;

/* setInterval: Runs every 16ms to achieve 60fps (1000ms/60 ~= 16ms). */

setInterval(function() {

/* Since this ticks 60 times a second, we divide the top property's increment of 1 unit per 1 second by 60. */

element.style.top = (startingTop += 1/60);

}, 16);

/* requestAnimationFrame: Attempts to run at 60fps based on whether the browser is in an optimal state. */

function tick () {

element.style.top = (startingTop += 1/60);

}

window.requestAnimationFrame(tick);

RAF可以通过对代码的单一更改,为动画效果带来最大的提升。

CSS Transitions

通过将动画逻辑转载到浏览器本身,CSS Transitions优于jQuery,这是有效的:

1)优化DOM交互和内存消耗以避免抖动

2)利用RAF的原理

3)强制硬件加速(利用GPU提升动画效果)

然而,现实情况是,这些优化也可以直接在JavaScript中执行。GSAP已经做了很多年了;Velocity.js,一个新的动画引擎,同样是利用这样的技术。

根据JavaScript动画可以更优于CSS动画的事实,那我们首先来看看CSS动画库的缺点:

  • Transitions强制硬件加速GPU,导致高压力情况下的抖动和绑定。这些影响在移动设备上恶化。(具体而言,抖动是当数据在浏览器的主线程和其合成的线程之间传递时发生较大开销的结果。一些CSS属性,如transforms 和opacity,就是如此。)

  • transforms在Internet Explorer 10以下无法工作,导致桌面版网站的辅助功能问题,因为IE8和IE9仍然还有较大量的用户。

  • 因为transforms不被JavaScript本地控制(他们只是引发JavaScript),浏览器不知道如何优化同步的JavaScript代码,操纵他们的转换。

相反:基于JavaScript的动画库可以自己决定什么时候启用硬件加速,它们固有地在所有版本的IE中工作,它们非常适合批量动画优化。

JavaScript动画

当涉及到性能时,JavaScript占据上风。但是JavaScript能有多快呢?现在,来建立一个3D动画演示(可以访问:http://www.ikinsoft.com/3ddemo/Velocity.html)。

问题仍然存在:JavaScript如何达到高水平的性能?以下是基于JavaScript的动画能够执行的优化列表:

  • 在整个动画链中同步DOM→补间堆栈,以最大限度地减少布局抖动。

  • 通过链接调用来缓存属性值,以便最小化DOM查询的发生(这是执行DOM动画的基本技能)。

  • 同一个调用中的同级单元的缓存单元转换率(例如,px到%,em等)。

  • 当视觉上看不到更新时,跳过样式更新。

Velocity.js利用这些实践来缓存要重复使用的动画的最终值,作为随后的动画的起始值,从而避免重新使用元素的起始值的DOM:

$element

/* Slide the element down into view. */

.velocity({ opacity: 1, top: "50%" })

/* After a delay of 1000ms, slide the element out of view. */

.velocity({ opacity: 0, top: "-50%" }, { delay: 1000 });

在上面的例子中,第二个Velocity调用知道它opacity值为1,最高值为50%并自动开始运行。

浏览器最终可以执行许多这些相同的优化,但是这样做将会大大缩小开发者制作动画代码的方式。因此,由于同样的原因,jQuery不使用RAF,因而浏览器永远不会进行优化,甚至有可能破坏规范或偏离预期行为的机会。

总结

本文对比了JS及其框架和CSS3的动画性能,并深入剖析了其内在原因。技术结论大致如下:

  1. jQuery出于设计原因,在动画性能上表现最差

  2. CSS3由于把动画逻辑推给了浏览器,优化了内存消耗、DOM操作和默认利用了RAF,所以要比jQuery动画性能更好

  3. CSS3可能会引起浏览器主线程和复合器线程之间过度数据交互,从而导致性能下降

  4. 纯JS实现的动画,在利用RAF和注意布局摆动处理时,可以获得媲美CSS3的动画性能,而在浏览器兼容性上比CSS3更好

应用选型建议:

  • 对于简单页面动画,建议优先选择CSS3动画

  • 对于复杂动画,建议使用GSAP或Velocity

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码