0

0

CSS 和 JS 动画哪个更快_html/css_WEB-ITnose

php中文网

php中文网

发布时间:2016-06-24 11:54:50

|

1288人浏览过

|

来源于php中文网

原创

  基于javascript的动画暗中同css过渡效果一样,甚至更加快,这怎么可能呢?而adobe和google持续发布的富媒体移动网站的性能可媲美本地应用,这又怎么可能呢?

  本文逐一遍览了基于Javascript的DOM动画库,如Velocity.js和GSAP,看其是如何比jQuery和CSS动画效果更具性能的.

 jQuery

  让我们先从基础的开始: JavaScript 和 jQuery 被错误的混为一谈了. JavaScript 动画是很快的. jQuery 把它放慢了下来。为什么?因为 ? 尽管jQuery非常强大 ? 但成为一个性能强劲的动画引擎从来都不是jQuery的设计目标:

  • jQuery 不能避免 布局颠簸 ,这得归因于它的代码库提供了动画之外的多种用途.

  • jQuery 的内存消耗经常会触发垃圾回收,那样会 时不时的让动画定格下来.

    立即学习前端免费学习笔记(深入)”;

  • jQuery 使用 setInterval 而不是 requestAnimationFrame (RAF) 来 保护新技术不受其自身的影响.

  •   应该注意到布局颠簸就是在动画开始部分的不顺畅,垃圾回收就是造成动画期间不顺畅的元凶, 而没有使用RAF则会导致低帧率.

     实现示例

      避免造成布局颠簸的DOM查询和更新组合:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    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 */

      发生在更新之后的查询会强制浏览器对页面的计算式数据进行重新计算 (同时会把新的更新效果考虑在内). 这样就会对动画产生显著的开销,而这只是16毫秒微小间隔的运行超时.

      类似的,实现 RAF 并不必须是对你的现有代码库的显著返工. 让我们拿RAF的基础实现同setInterval比较一下:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    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 转换

      CSS转换通过把动画逻辑甩给浏览器本身去处理而超越了jQuery,这在以下几方面是有效果的:(1)优化DOM交互和内存消耗以避免卡顿(颠簸),(2)利用引擎的RAF原则,(3)强制硬件加速(利用GPU的能力来提高动画性能)。

      然而,现实是,这些优化也可以在JavaScript中直接执行。GSAP已经这样做了多年。Velocity.js,一个新的动画引擎,不仅利用了同样的技术,而且还向前多走了几步??我们不久会探讨这些。

      面对事实,JavaScript动画可以与CSS转换竞争只是我们康复计划的第一步。第二步是实现“JavaScript动画实际上可以比CSS转换更快”。

      现在我们开始谈谈CSS变换的弱点:

  • transition强制硬件加速会加大GPU消耗,高负荷情形下将导致运行不流畅。这种情况在移动设备上尤为明显。(特殊情况下,比如当数据在浏览器主线程和排版线程之间传递产生的瓶颈也会导致不流畅)。某些CSS属性,比如transform和opacity,则不受这些瓶颈影响。Adobe在这里精心总结了这些问题。

  • transition在IE10以下没有用,造成的自IE8和IE9以来的桌面站点可用性问题至今仍然广泛存在。

  • 由于transition并不是由JavaScript原生控制(而仅仅是由JavaScript触发),浏览器无法获知如何与控制这些transition的JavaScript代码同步地优化他们。

  •   相反的,基于JavaScript的动画库则可以自行确定合适开启硬件。它们原生支持各版本IE浏览器,并且它们尤其适合批量动画优化。

      我的建议是仅当你单独为移动端开发且仅实现简单动画时使用原生CSS变换。这种环境下,transition是一种原生有效的解决方案,可以使你在样式表中实现所有动画逻辑,而不用添加额外的JavaScript库,从而避免你的页面变得臃肿。然而,但你在设计复杂的UI,或者是开发存在不同状态的UI的App时,你就应该使用动画库以使动画保持流畅,同时是工作流程易于管理。Transit是一个在管理CSS变换方面做得尤其优秀的库。

     JavaScript 动画

      好了,那JavaScript可就在性能方面占据上风了. 但Javascript究竟具体快了多少呢? 好吧 ? 最初 ? 对于构建一个实在的 3D动画示例 是足够快的,通常在构建中你只会看到有使用WebGL. 而构建一个 多媒体小动画 也够了,通常你看到只会使用Flash或者After Effects构建. 而构建一个 虚拟世界 也够了,通常你只会看到使用canvas构建.

      为了对领先的动画库,当然还要包含Transit(它使用CSS渐变效果),进行直接的对比, 回头去看看Velocity在VelocityJS.org上的文档.

      问题仍然是: JavaScript是怎样具体的达成其高水平性能的? 下面是对基于Javascript动画能够被执行这一目标的优化的一个简短清单:

  • 同步 DOM → 在整个动画链中间入栈以最小化布局抖动.

    AI抖音
    AI抖音

    AI抖音,会思考的抖音

    下载
  • 为整个链式调用缓存属性值,以最小化DOM查询发生 (这些就是高性能DOM动画的坑).

  • 在同样的调用中缓存整个同级别元素的单元转换率 (比如 px 到 %, em, 等等.).

  • 当更新可能会在视觉上不可见时跳过样式更新.

  •   回顾一下我们先前学过的关于布局颠簸的知识,Velocity.js利用这些最佳实践来缓存动画结束值以复用为随后动画的开始值,从而避免了重新查询DOM以获取元素的开始值:

    1

    2

    3

    4

    5

    $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 和 top为50% 开始。

      浏览器本身最终能够执行许多这些相同的优化,但这样做会明显减少开发者能够制作的动画代码的方式。因此,出于同样原因,由于jQuery不使用RAF(如上所述),浏览器就不会强制优化它,甚至给出一个很小的机会去打破规格或偏离预期的行为。

      最后,我们对这两个JavaScript动画库(Velocity.js 和 GSAP)互相比较一下。

      GSAP was the first animation library to demonstrate JavaScript's impressive DOM animation performance. It does, however, have a few drawbacks:

  • In medium-to-high stress animations, GSAP's DOM interaction overhead causes dropped frames at the start of, and between, animations.

  • Whereas Velocity.js is released under the ultra-permissive MIT license, GSAP is closed-source and requires an annual licensing fee for many types of businesses.

  • Because GSAP is a full animation suite, it is triple the size of Velocity. However, since GSAP is so richly-featured, it does have the benefit of being a Swiss Army Knife of animation.

  •   My recommendation is to use GSAP when you require precise control over timing (e.g. remapping, pause/resume) and motion (e.g. bezier curve paths). These features are crucial for game development and certain niche applications, but are typically not needed in web app UI's.

     Velocity.js

      引用 GSAP 丰富的特性并不代表Velocity自身在特性上是轻量级的. 相反,在压缩后仅有的7kb中,Velocity不仅仅复制了jQuery $.animate()的所有功能, 它还把颜色动画,转换,循环,easing效果,类动画还有滚动都打包了进去.

      总之,Velocity是jQuery,jQuery UI,以及CSS渐变效果的最佳组合.

      此外,从便利的角度看,Velocity在hood(盖子,大概意思是公共的接口)之下使用jQuery的 $.queue() 方法, 如此就可以实现同 jQuery 的 $.animate(), $.fade(), 和 $.delay() 函数的无缝互操作. 而且,由于Velocity的语法同 $.animate() 的语法是相同的, 你不需要改变页面的任何代码.

      让我们快速地来看一看 Velocity.js. 在基础的层面,Velocity的行为同$.animate()一样:

    1

    2

    3

    4

    5

    6

    $element

         .delay(1000)

         /* Use Velocity to animate the element's top property over a duration of 2000ms. */

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

         /* Use a standard jQuery method to fade the element out once Velocity is done animating top. */

         .fadeOut(1000);

      在其最高级的层面,可以创建带有3D动画的复杂滚动场景 ? 几乎只要用到两行简单的代码:

    1

    2

    3

    4

    5

    $element

         /* Scroll the browser to the top of this element over a duration of 1000ms. */

         .velocity( "scroll" , 1000)

         /* Then rotate the element around its Y axis by 360 degrees. */

         .velocity({ rotateY:  "360deg"  }, 1000);

     结束

      Velocity的目标是仍旧成为 DOM 中的动画性能和便利性的领导者。本文侧重于前者。  Head on over to  VelocityJS.org更多地了解后者。

      之前,我们得出结论,记住,一个高性能的UI并不仅仅是选择更多的Lib。你的页面的其余部分也应进行优化。可以从Google talks了解更多,更梦幻的内容:

  • Jank Free

  • Rendering Without Lumps

  • Faster Websites

  • 相关文章

    HTML速学教程(入门课程)
    HTML速学教程(入门课程)

    HTML怎么学习?HTML怎么入门?HTML在哪学?HTML怎么学才快?不用担心,这里为大家提供了HTML速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!

    下载

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

    热门AI工具

    更多
    DeepSeek
    DeepSeek

    幻方量化公司旗下的开源大模型平台

    豆包大模型
    豆包大模型

    字节跳动自主研发的一系列大型语言模型

    通义千问
    通义千问

    阿里巴巴推出的全能AI助手

    腾讯元宝
    腾讯元宝

    腾讯混元平台推出的AI助手

    文心一言
    文心一言

    文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

    讯飞写作
    讯飞写作

    基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

    即梦AI
    即梦AI

    一站式AI创作平台,免费AI图片和视频生成。

    ChatGPT
    ChatGPT

    最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

    相关专题

    更多
    pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
    pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

    本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

    616

    2026.02.13

    微博网页版主页入口与登录指南_官方网页端快速访问方法
    微博网页版主页入口与登录指南_官方网页端快速访问方法

    本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

    194

    2026.02.13

    Flutter跨平台开发与状态管理实战
    Flutter跨平台开发与状态管理实战

    本专题围绕Flutter框架展开,系统讲解跨平台UI构建原理与状态管理方案。内容涵盖Widget生命周期、路由管理、Provider与Bloc状态管理模式、网络请求封装及性能优化技巧。通过实战项目演示,帮助开发者构建流畅、可维护的跨平台移动应用。

    91

    2026.02.13

    TypeScript工程化开发与Vite构建优化实践
    TypeScript工程化开发与Vite构建优化实践

    本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

    20

    2026.02.13

    Redis高可用架构与分布式缓存实战
    Redis高可用架构与分布式缓存实战

    本专题围绕 Redis 在高并发系统中的应用展开,系统讲解主从复制、哨兵机制、Cluster 集群模式及数据分片原理。内容涵盖缓存穿透与雪崩解决方案、分布式锁实现、热点数据优化及持久化策略。通过真实业务场景演示,帮助开发者构建高可用、可扩展的分布式缓存系统。

    54

    2026.02.13

    c语言 数据类型
    c语言 数据类型

    本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

    29

    2026.02.12

    雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法
    雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法

    本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。

    15

    2026.02.12

    豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法
    豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法

    本专题汇总豆包AI官方网页版入口及在线使用方式,涵盖智能写作工具、图片生成体验入口和官网登录方法,帮助用户快速直达豆包AI平台,高效完成文本创作与AI生图任务,实现便捷智能创作体验。

    598

    2026.02.12

    PostgreSQL性能优化与索引调优实战
    PostgreSQL性能优化与索引调优实战

    本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

    56

    2026.02.12

    热门下载

    更多
    网站特效
    /
    网站源码
    /
    网站素材
    /
    前端模板

    精品课程

    更多
    相关推荐
    /
    热门推荐
    /
    最新课程
    Bootstrap 4 中文开发手册
    Bootstrap 4 中文开发手册

    共0课时 | 570人学习

    布尔教育jQuery实战视频教程
    布尔教育jQuery实战视频教程

    共37课时 | 7.9万人学习

    jQuery基础视频教程
    jQuery基础视频教程

    共36课时 | 7.3万人学习

    关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
    php中文网:公益在线php培训,帮助PHP学习者快速成长!
    关注服务号 技术交流群
    PHP中文网订阅号
    每天精选资源文章推送

    Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号