以下是 Jack Doyle 的客座文章,他是 GreenSock动画平台 (GSAP) 的作者。Jack 在浏览器动画方面做了大量工作,并发现普遍认为“CSS更快”的说法并不正确。而且,情况比这更复杂。我让他来解释一下。
曾经有一段时间,大多数开发者使用 jQuery 来为浏览器中的元素添加动画。淡入淡出、展开收缩; 都是一些简单的东西。随着交互式项目的复杂度不断提升,移动设备的兴起,性能变得越来越重要。Flash逐渐淡出,才华横溢的动画师推动HTML5做它从未做过的事情。他们需要更好的工具来实现复杂的动画序列和顶级的性能。jQuery的设计根本无法满足这些需求。浏览器也逐渐成熟,并开始提供解决方案。
最广受赞誉的解决方案是 CSS动画(以及 过渡)。作为行业多年的宠儿,CSS动画在各种会议上被反复提及,诸如“硬件加速”和“移动友好”之类的短语也让听众们心驰神往。基于JavaScript的动画则被视为过时和“肮脏”的东西。但事实真是如此吗?
作为一名对动画和性能充满热情(实际上近乎痴迷)的人,我迫不及待地跳上了CSS的战车。然而,不久之后,我便开始发现了一些没人谈论的重大问题。我震惊了。
本文旨在提高大家对基于CSS的动画的一些重要缺陷的认识,以便您可以避免我遇到的麻烦,并更明智地决定何时使用JS,何时使用CSS进行动画。
缺乏独立的缩放/旋转/位置控制
对元素的缩放、旋转和位置进行动画处理非常常见。在CSS中,它们都被塞进了一个“transform”属性中,这使得无法真正独立地对单个元素进行动画。例如,如果您想独立地对“旋转”和“缩放”进行动画,并使用不同的时间和缓动效果,该怎么办?也许某个元素在不断脉动(缩放振荡),并且您希望在鼠标悬停时旋转它。这只有通过JavaScript才能实现。
查看 GreenSock (@GreenSock) 在 CodePen 上的示例 独立变换
在我看来,这是CSS的一个明显弱点,但如果您只做一些简单的动画,并且在任何给定时间都对整个变换状态进行动画处理,那么这将不是问题。
性能
网络上大多数比较都是将CSS动画与 jQuery 进行对比,因为jQuery非常普遍(就好像“JavaScript”和“jQuery”是同义词一样),但众所周知,jQuery在动画性能方面相当缓慢。更新的 GSAP 也是基于JavaScript的,但它的速度实际上比jQuery快20倍。因此,JavaScript动画声誉不佳的部分原因就是我所说的“jQuery因素”。
使用CSS进行动画的最常被提及的原因是**“硬件加速”**。听起来很不错,对吧?让我们把它分成两部分。
GPU参与
GPU 针对诸如移动像素和应用变换矩阵以及不透明度等任务进行了高度优化,因此现代浏览器会尝试将这些任务从CPU卸载到GPU。关键是将动画元素隔离到它们自己的GPU层上,因为一旦创建了一个层(只要其原生像素没有改变),GPU就可以轻松地移动这些像素并将其组合在一起。它可以保存像素块(作为层),然后只需说“将该块向右移动10像素,向下移动5像素”(或任何值),而不是每秒计算每个像素60次。
旁注:不要为每个元素都创建自己的层,因为GPU的显存是有限的。如果显存耗尽,性能会急剧下降。
在CSS中声明动画允许浏览器确定哪些元素应该获得GPU层,并相应地将它们分配。非常棒。
**但是您是否知道JavaScript也可以做到这一点?**使用具有3D特征的变换(如translate3d()
或matrix3d()
)会触发浏览器为该元素创建一个GPU层。因此,GPU加速**不仅仅**适用于CSS动画——JavaScript动画也可以从中受益!
还要注意,并非所有CSS属性都能在CSS动画中获得GPU加速。实际上,大多数都不能。变换(缩放、旋转、平移和倾斜)和不透明度是主要受益者。因此,不要假设只要使用CSS进行动画,所有内容都会自动获得GPU加速。事实并非如此。
将计算卸载到不同的线程
“硬件加速”的另一部分与能够使用不同的CPU线程进行动画相关的计算有关。同样,这在理论上听起来很棒,但并非没有成本,而且开发人员往往高估了其优势。
首先,只有不影响文档流的属性才能真正被分配到不同的线程。因此,再次强调,变换和不透明度是主要受益者。当您分离其他线程时,管理此过程会涉及一些开销。由于图形渲染和文档布局在大多数动画中(**远远地**)消耗了最多的处理资源(**而非**计算属性补间值的中间值),因此使用单独的线程进行插值的优势很小。例如,如果在特定动画期间**98%**的工作是图形渲染和文档布局,而**2%**是计算新的位置/旋转/不透明度/任何值,即使您将这些值计算速度提高了**10倍**,您也只会看到大约**1%**的整体速度提升。
性能比较
下面的压力测试创建了特定数量的图像元素(点),并将它们从中心动画到边缘周围的随机位置,并使用随机延迟,从而创建星场效果。增加点的数量,并查看 jQuery、GSAP 和 Zepto 的对比情况。由于Zepto将其所有动画都使用CSS过渡,因此它应该表现最好,对吧?
查看 GreenSock (@GreenSock) 在 CodePen 上的示例 速度测试:GSAP与Zepto (CSS过渡)与jQuery
结果证实了网络上广泛报道的内容——CSS动画明显快于jQuery。但是,在我测试的大多数设备和浏览器上,**基于JavaScript的GSAP的性能甚至优于CSS动画**(在某些情况下优势明显,例如在Microsoft Surface RT上,GSAP的速度可能至少是Zepto创建的CSS过渡的5倍,而在iPad 3 iOS7上,当使用GSAP而不是CSS过渡进行动画处理时,变换的速度明显更快)。
动画属性 | JavaScript更佳 | CSS更佳 |
---|---|---|
top、left、width、height | Windows Surface RT、iPhone 5s (iOS7)、iPad 3 (iOS 6)、iPad 3 (iOS7)、Samsung Galaxy Tab 2、Chrome、Firefox、Safari、Opera、Kindle Fire HD、IE11 | (无) |
变换 (translate/scale) | Windows Surface RT、iPhone 5s (iOS7)、iPad 3 (iOS7)、Samsung Galaxy Tab 2、Firefox、Opera、IE11 | iPad 3 (iOS6)、Safari、Chrome |
值得注意的事项
- 在对top/left/width/height(影响文档流的属性)进行动画处理时,JavaScript在所有情况下都更快(GSAP,而非jQuery)。
- 一些设备似乎针对变换进行了高度优化,而另一些设备则更好地处理了top/left/width/height动画。最值得注意的是,较旧的iOS6在使用CSS动画变换时效果更好,但较新的iOS7却发生了变化,现在它们的速度明显变慢了(我 在这里写了一篇博客)。
- CSS动画在浏览器计算层并将数据上传到GPU时,初始动画启动会有明显的延迟。这也适用于基于JavaScript的3D变换,因此“GPU加速”并非没有成本。
- 在高负载下,CSS过渡更容易出现条带/环状效果(这似乎是一个同步/调度问题,可能是由于它们在不同的线程中进行管理)。
- 在某些浏览器(如Chrome)中,当有大量点进行动画处理时,文本的不透明度淡入淡出效果会被完全破坏,但仅在使用CSS动画时!
尽管经过良好优化的 JavaScript 在速度上通常与 CSS 动画一样快,甚至可能更快,但 3D 变换在使用 CSS 进行动画时往往会更快,但这与浏览器处理 16 元素矩阵的方式有关(强制将数字转换为连接的字符串,然后再转换回数字)。希望这种情况会有所改变。不过,在大多数实际项目中,您根本不会注意到性能差异。
我建议您进行自己的测试,以查看哪种技术在您的特定项目中提供最流畅的动画。不要相信 CSS 动画总是更快的神话,也不要认为上面的速度测试反映了您在应用程序中看到的实际情况。测试,测试,测试。
运行时控制和事件
某些浏览器允许您暂停/恢复 CSS 关键帧动画,但仅此而已。您无法跳转到动画中的特定位置,也无法在中途平滑反转或更改时间尺度,或者在特定位置添加回调或将其绑定到丰富的回放事件集。JavaScript 提供了强大的控制,如下面的演示所示。
查看 GreenSock 在 CodePen 上创建的 Pen CSS 无法实现:控制 (@GreenSock)
现代动画与交互性密切相关,因此能够从可变的起始值动画到可变的结束值(例如,基于用户点击的位置)或动态更改内容非常有用,但声明性的基于 CSS 的动画无法做到这一点。
工作流程
对于两个状态之间简单的过渡(例如,鼠标悬停或展开菜单等),CSS 过渡非常棒。但是,对于顺序排列内容,您通常需要使用 CSS 关键帧动画,这会迫使您以百分比定义内容,例如
@keyframes myAnimation {
0% {
opacity: 0;
transform: translate(0, 0);
}
30% {
opacity: 1;
transform: translate(0, 0);
}
60% {
transform: translate(100px, 0);
}
100% {
transform: translate(100px, 100px);
}
}
#box {
animation: myAnimation 2.75s;
}
但是,当您进行动画制作时,您是否会以时间而不是百分比来思考?例如,“将不透明度淡入 1 秒,然后向右滑动 0.75 秒,然后弹回并静止 1 秒”。如果您花费数小时以百分比精心制作复杂的序列,然后客户说“将中间部分延长 3 秒”会发生什么?哎呀。您需要重新计算所有百分比!
通常,构建动画涉及大量实验,尤其是时间和缓动效果。这实际上是 seek()
方法非常有用的地方。想象一下,分段构建一个 60 秒的动画,然后微调最后 5 秒;每次想要查看对最后部分的编辑结果时,您都需要观看前 55 秒。太糟糕了。使用 seek()
方法,您可以在制作过程中将其放置到位以跳到您正在处理的部分,然后在完成后将其删除。节省大量时间。
基于画布的对象和其他第三方库对象动画正变得越来越普遍,但不幸的是,CSS 动画只能定位 DOM 元素。这意味着,如果您在 CSS 动画上投入了大量时间和精力,它将无法转换为其他类型的项目。您将不得不切换动画工具集。
CSS 动画中还缺少一些与工作流程相关的便利功能。
- 相对值。例如,“使旋转再增加 30 度”或“将元素从动画开始时的位置向下移动 100px”。
- 嵌套。想象一下,能够创建可以嵌套到另一个动画中的动画,而该动画本身可以继续嵌套,等等。想象一下控制该主动画,同时所有内容都保持完美同步。这种结构将促进模块化代码的生成和维护,从而更容易实现。
- 进度报告。某个动画是否已完成?如果没有,它在进度方面究竟处于什么位置?
- 目标终止。有时,终止影响元素“缩放”(或您想要的任何属性)的所有动画非常有用,同时允许其余动画继续进行。
- 简洁的代码。即使您没有考虑所有冗余的供应商前缀版本,CSS 关键帧动画也很冗长。任何尝试构建中等复杂内容的人都会证明,CSS 动画很快就会变得繁琐且难以管理。事实上,完成动画任务所需的 CSS 量可能超过 JavaScript 库的权重(JavaScript 库更容易缓存并在许多动画之间重复使用)。
有限的效果
您无法使用 CSS 动画真正实现以下任何操作
- 沿着曲线(如贝塞尔曲线)进行动画。
- 使用有趣的缓动效果,如弹性、弹跳或粗糙缓动。有一个
cubic-bezier()
选项,但它只允许 2 个控制点,因此非常有限。 - 在 CSS 关键帧动画中为不同的属性使用不同的缓动效果;缓动效果应用于整个关键帧。
- 基于物理的运动。例如,在此 可拖动演示 中实现的平滑的基于动量的轻弹和回弹。
- 为滚动位置设置动画。
- 方向旋转(例如,“以最短的方向,顺时针或逆时针,动画到正好 270 度”)。
- 为属性设置动画。
兼容性
基于 CSS 的动画在IE9 及更早版本中不起作用。我们大多数人都讨厌支持旧版浏览器(尤其是 IE),但现实情况是,我们中的一些人有客户需要这种支持。
许多浏览器都需要浏览器前缀,但您可以利用预处理工具来避免手动编写它们。
结论
CSS 动画“不好”吗?当然不是。事实上,当不需要与旧版浏览器的兼容性时,它们非常适合状态之间的简单过渡(例如鼠标悬停)。3D 变换通常表现出色(iOS7 是一个值得注意的例外),对于希望将所有动画和表示逻辑都放在 CSS 层的开发人员来说,CSS 动画非常有吸引力。但是,基于 JavaScript 的动画提供了更多的灵活性、更适合复杂动画和丰富交互性的工作流程,并且它通常与基于 CSS 的动画一样快(甚至更快),尽管您可能听说过其他说法。
与 jQuery.animate()
相比,我可以理解为什么 CSS 动画如此吸引人。有什么理由不抓住机会获得 10 倍的性能提升呢?但现在不再是在 jQuery 和 CSS 动画之间进行选择;像 GSAP 这样的基于 JavaScript 的工具开辟了全新的可能性,并消除了性能差距。
本文不是关于 GSAP 或任何特定库;重点是基于 JavaScript 的动画不应有坏名声。事实上,JavaScript 是真正强大、灵活的动画系统的唯一选择。此外,我想阐明 CSS 动画令人沮丧的部分(似乎没有人谈论这些),以便您最终能够对如何在浏览器中进行动画制作做出更明智的决定。
Web 动画规范能否解决问题?
W3C 正在开发一项名为 Web 动画 的新规范,旨在解决 CSS 动画和 CSS 过渡中的许多缺陷,提供更好的运行时控制和额外功能。从许多方面来看,这无疑是一项进步,但它仍然存在不足之处(其中一些可能无法克服,因为需要向后兼容现有的 CSS 规范,例如,独立变换组件控制不太可能实现)。不过,那是另一篇文章的内容。我们将拭目以待事情的发展。确实有一些聪明的家伙在研究该规范。
速度比较中的 GSAP 测试对其他人不起作用吗?我看到的只是一个点,没有动画。Mavericks 上的最新 Safari。
抱歉,JP - 那是 codepen 嵌入设置的问题,该设置会自动停止执行。现在应该已修复。
这篇文章有偏见,测试具有选择性。
这篇文章基本上是GSAP的免费广告。
如果有人正在使用HTML5、JS和CSS在网络上进行动画制作,并且没有考虑使用GSAP,那真是疯了。
我要关闭任何愚蠢的、匿名的、负面的帖子。
处理批评的糟糕方式。
不。
不什么?
我认为这就是他所说的“不”的意思:神话粉碎神话粉碎
这是不是一个不要争论的论点?多么奇怪的帖子。
Chris论点的问题在于,这篇文章是基于事实和实验(无论多么有选择性),但他的博文是基于他的理想主义和他对网络开发世界应该如何运作的看法。
Chris基本上是在说“是的,这些库可能运行良好,但如果网络平台存在问题,我们应该尝试修复网络平台,而不是依赖库”。
我原则上并不反对,但问题是,我们中的一些人生活在现实世界中,需要在2016年之前完成工作。作者提到了管道中有一些新的网络动画规范,但几年后它们才能在所有浏览器中使用(例如咳嗽),而且它们似乎在实施之前就已经过时了。
此外,CSS-tricks有一个评论区,允许Chris发表完全没有建设性的帖子,例如“不”,但他的网站本身却没有评论系统,因此不允许其他人批评他所说的任何内容。彻底失败。
我真的很惊讶那些讨厌的人,我以为这篇文章研究充分且全面。就我个人而言,我发现每当您超出简单动画时,JavaScript都是必要的(或者至少是最简单的)。庞大的“transform”属性是最难使用的。
我并不热衷于向页面添加更多JS库,但我目前看不到其他用于复杂动画的选项。
我认为JS动画的一个警告是电池使用情况。我的直觉告诉我所有这些JS计算都会消耗大量电量,但我没有测试来证明这一点。
我也想知道不同动画技术在功耗方面的差异。虽然在许多情况下,我认为差异可以忽略不计,但我可以预见到无限循环之类的东西值得优化。
以及对Jack:很棒的文章。你们进行这种基础研究,充分体现了GSAP的优秀之处。
我手头没有关于该问题的结论性测试,但我记得当史蒂夫抱怨Flash耗尽设备电池时,有人用Flash和HTML5/CSS/JS在Android设备上测试了类似的动画,后者需要更多的电量。我们可以用我们自己的测试来重现这一点。
我不认为电池消耗方面存在显著差异的真正原因。归根结底,硬件无论如何都必须执行类似的任务,正如文章所述,实际渲染最需要性能(=能量),实现方式并不那么重要。
但是即使如此,除了人们可以/将会玩更长时间的浏览器游戏之外,这些游戏无论如何都需要大量复杂的脚本,访问和使用网站通常最多需要几分钟。假设您的设备的电池循环至少为24小时,即使这些分钟使用的电量比替代方案多50%或100%,也几乎无关紧要,而且并非每台设备的行为都相同。
所以:别担心。即使它是真的,我真诚地怀疑,它也几乎无关紧要,并且只会促使供应商改进急需的JavaScript性能(以及能耗)。
我同意Matthew,这篇文章研究得很充分,我对社区对这篇非常实用的文章的回应感到非常失望,这不像是在设定规则或限制,它只是为那些一直在争论CSS动画与javascript/jquery动画之间使用的人提供了一个视角。
@iDad 它可能与浏览器优化动画的方式有很大关系。从那时起,JS的速度肯定大大提高了,因此它对电量的消耗可能发生了好转或恶化。也许GPU卸载可以平衡竞争环境。
我的想法是基于我制作的一个使用过渡的动画,我完成了大约50%的目标,并且动画流畅,浏览器没有出现卡顿。我遇到了开发障碍,然后用JS重做了它,发现浏览器CPU开始高速运转并且负载很重。仍然流畅且很棒,但似乎工作更努力了。
也就是说,电池使用量在许多讨论中都被忽略了。也许是有充分理由的,如果您只是使用一个网站一小段时间,它可能不是一个决定性因素。
关于CSS动画,执行“onComplete”函数怎么样?
在我的职业生涯中,我以许多不同的方式做过动画。测试并尝试了许多不同的方法和库。
我认为CSS动画和Javascript动画都有其作用(如本文所述)。我确实同意GSAP在Javascript性能和工作流程简易性方面处于顶级水平。它表明Javascript可以有效地用于实现一些CSS无法实现的真正令人惊叹的东西。
我个人认为这篇文章非常真实且有趣。
对于任何认为这篇文章只是GSAP的宣传的人,我认为他们完全错过了文章的重点。
完整免责声明:我是Jack的朋友(因为自从AS3时代起我就一直在使用他的工具),所以请根据您可能想到的任何偏见来理解我的评论。话虽如此,我已经使用GSAP几年了,现在我专门在JS中使用它。我坚信CSS用于表示逻辑而不是动画,这是我不使用CSS动画的主要原因之一。然而,最大的原因是CSS动画根本无法做到JS可以做到的一切。我不知道你们中有多少人和我处于同一条船上,但我的大部分工作都是为相对大型的企业客户完成的,向后兼容性是必须的。我无法想象仅使用CSS来编写我所做的一些东西(或者它们根本不可能实现)。
我知道您可能会说“旧版浏览器获得不同的体验是预期的”,但这并不一定必须如此。对于那些说“测试有偏差”或“这是GSAP的广告”的人,请亲自查看并进行自己的测试,然后得出自己的结论。我认为您会对提供的功能感到惊喜。而且,它在这里被发布为“广告”让您生气?它试图拓宽可能不知道它的人的眼界,这有什么不好?如果从这篇文章中得到的只是它是一个广告,那么您显然错过了重点。
Matt——你指出CSS用于表示逻辑而不是动画。事实上,CSS动画确实无法做到JS可以做到的一切。但为了否定你的陈述,JavaScript本身从未打算成为一种创意或动画语言。因此,我认为JavaScript和CSS本身都不能很好地处理动画。
我认为人们并没有争论GSAP是否为开发人员提供了价值。他们争论的是,这篇文章在说(CSS与JavaScript)与GSAP方面有偏见。这就是这篇文章危险的原因,因为它所做的只是推广一个框架。此外,这篇文章在将传统的JavaScript与原生的CSS3进行比较方面做得非常少。相反,它将GSAP与jQuery进行了比较。如果它是一个免费库,我认为人们会少关心推广。
我认为人们并没有错失重点。我认为他们感到困惑,因为作者在真正解释GSAP在做什么不同以及为什么它比仅仅使用jQuery与JavaScript与CSS组合更具性能方面做得不好。相反,这篇文章更像是自我推销。
公平地说,David——我没有涵盖关于如何编写更快的JavaScript的细节。坦率地说,我很难保持这篇文章相对简洁(我对这些东西非常热情,可以继续很长时间),如果我深入探讨了一堆优化JavaScript的技巧和方法,它就会变得太长而失去焦点。我认为这个话题应该单独写一篇文章。然而,在这篇文章中,我真正试图专注于揭示CSS动画的一些弱点,这些弱点似乎没有人谈论,并证明JavaScript动画不应受到负面评价,并展示一些只有JavaScript才能实现的独特功能。请注意,我还谈到了CSS的一些优势。
如果这篇文章给人以自我推销的感觉,我感到抱歉;我试图克制自己不去谈论GSAP独有的特定功能和优势,而是将大部分重点放在CSS动画和JavaScript动画这个更通用的主题上。我想我做得还不够好。并且需要说明的是,对于绝大多数用例,甚至商业用例,GSAP都是完全免费的。事实上,我认为许可证是整个软件包的优势之一,因为它在许多方面更适合企业,并且比其他常见的开源软件提供更稳定的持续创新和支持。这又是另一篇文章的主题了 :)
我完全同意David的观点,这篇文章感觉有点偏颇。但我可以理解GSAP确实非常快,并且实现它需要大量的努力。我尝试自己更好地理解所有这些动画内容,并且我非常希望Jack能写一篇技术文章来解释GSAP中让它如此快速的“黑魔法”。因为归根结底,这“仅仅”是JavaScript。
我将附和David的观点。JavaScript动画 !== GSAP。我将不得不花很多时间向学生解释这一点(如果我不那么善良,我可能会认为这是这篇文章的意图)。此外,我认为作者的语气存在问题,这很遗憾。我自己也曾遇到过语气方面的问题,它真的会决定公众对一篇文章的反应。也就是说,我的收件箱始终敞开,欢迎大家帮我检查一下好的动画文章的语气;)
有趣的文章,感谢分享!
很高兴看到GreenSock依然活跃!我在Flash盛行的时代就一直使用他们的工具,他们总是能提供真正可靠的数据、比较和示例。我很高兴看到这一点没有改变!很高兴看到像“CSS总是最佳选择”这样的谬误被揭穿。感谢这篇文章。
我很欣赏这篇文章强硬且有主见的立场,它以真实数据和实际示例作为支撑。对于复杂的动画和交互性,这种方法值得一试。
我个人在日常工作中不会使用很多动画。我使用的大多数动画都是页面上部分内容的淡入和淡出。也许还会缩放一两个按钮,没有那么极端。我唯一能想到会使用这种硬核动画的地方是游戏开发,如果这是你正在做的事情,你不应该使用标准的HTML元素来构建你的游戏,canvas是你的朋友。
我以前也这么认为——直到上周我开始为一个新项目捣鼓各种动画。一旦你将脚趾浸入CSS动画和过渡的池中,你就会看到一个全新的展现技巧的美丽世界。我制作了一个一些想法的演示(纯CSS)关于如何改进仅仅是普通的淡入/淡出。
我想知道这是否仅仅是浏览器当前状态的问题,就它们对css动画还不够智能而言。
我认为这篇文章中“用JavaScript动画”和“用CSS动画”之间的区别有点混淆。
更重要的是减少重排和重绘的次数,而这很大程度上取决于你对浏览器渲染过程的了解程度。
你可以制作糟糕的JavaScript动画,也可以制作糟糕的CSS动画。它们有不同的用例,但老实说,大多数时候问题不在于JavaScript的执行,而在于绘制/重排。
通过添加和删除类来控制css动画是一个愚蠢的选择!
CSS动画控制很糟糕
GSAP动画控制很棒
我以前使用GSAP和javascript动画,因为我来自AS3背景,编写javascript代码对我来说似乎很自然。
但我想指出一个非常重要的方面是,另一个顶级Canvas框架KineticJS将其动画引擎更改为GSAP,因为它提供了超过16%的性能提升。
我之所以说明这一点,是因为即使使用javascript,Canvas动画也是可能的,而这在CSS动画中是无法做到的。
当然,对于简单或复杂的UI增强,CSS动画是最佳选择。
真是巧合!我刚刚在研究GSAP,考虑到当前的一个项目,之前在一些动画密集型获奖网站的源代码中发现了它。
在研究过程中,我对GSAP奇怪的网络存在感到有点困惑:该库正在积极开发中,但网页和文档看起来非常旧;而且我很难找到关于它的充分讨论——我只能找到支持或沉默。我对支持没有意见(这是让你让其他人使用并为你提供库反馈的方式,如果你创建了它,你希望相信它)——但为什么其他人没有对GSAP发表意见?为什么没有博客文章和StackOverflow答案解释GSAP的优缺点,以及如何用它来解决jQuery和CSS无法充分解决的问题?为什么当前关于浏览器动画的讨论似乎忽略了这个工具?为什么HTML5 Rocks等众多关于动画性能的文章将它排除在讨论之外?我(以及许多其他人)倾向于依靠的前端布道者来向我介绍很棒的东西,他们似乎要么a)不知道它的存在,要么b)出于未知原因保持沉默。(我今天才想到要向ShopTalk节目提问,询问这两位是否对GSAP有任何看法。)
所以:我真的很高兴看到Chris发表这篇文章(感谢Jack撰写它),我希望它能促使GSAP和类似的工具被纳入关于动画的众多讨论中。
我已经使用greensock的工具好几年了,包括Flash和JavaScript,我可以说,它们非常值得花费。他们已经有一段时间没有更新他们的网站了,但文档是最新的,论坛也很活跃,并且非常有帮助。GS的回复非常及时且有帮助。你很少会看到问题没有得到解答或解决。库本身非常易于使用。我还没有做过很多JavaScript方面的开发,但切换过来非常简单。
GreenSock大约每6周或更长时间就会发布一篇新文章或一篇较长的新闻帖子。但我同意,GreenSock的“生态系统”非常非常小;与jQuery相比,找到使用JS GSAP的项目/博客/仓库非常困难。
我同意Greensock网站非常有用,充满了演示、文档、@Patrick Mullady赞扬的论坛等——那里不乏帮助我们掌握一个非常有用的工具的资料。(我现在也发现语法非常直观,因为我正在尝试使用它。)如果我的话听起来像是在抱怨,我并不是那个意思——只是对一个奇怪的事实发表评论,即我通常依赖的向我展示很棒东西的渠道到目前为止对GSAP保持沉默,据我所知,我认为这很奇怪,因为这些渠道总是谈论优化网页动画。这不是一个“问题”,因为没有人对此负责;它只是很奇怪,值得一提。
我已经在UI/UX领域工作了10多年了,直到现在才从这篇文章(以及css tricks上的其他一些文章)中听说过GSAP,哇!自从CSS动画问世以来,我一直是它的信徒,但在移动设备上进行测试时,我发现坦率地说——CSS动画很糟糕。我是一个试图推动html 5移动应用并远离原生世界的人。CSS动画给html5移动应用带来了坏名声……但GSAP为流畅的交付打开了一扇大门。我现在将GSAP作为我的主要动画工具,尽管我很好奇Animation API会带来什么,以及谷歌的新Polymer。
感谢GreenSock如此棒。
看,我爱GSAP,从AS2/AS3时代就开始使用它,并且真的很希望在使用基于HTML的动画时能够利用它明显优越的功能集。不幸的是,即使是最基本的动画(例如文章顶部的旋转绿色按钮)在iPad 3上也会出现帧率低的问题(不是最快的设备,但相当常见)。是的,该动画在CSS3中无法实现,但在GSAP或任何其他javascript补间引擎中也不流畅。
就我而言,不流畅与不可能无异。我宁愿简化动画,坚持CSS3目前可以实现的功能,也不愿使用在移动设备上卡顿的炫酷动画。
CSS3动画很麻烦,它们的功能有限,而且确实存在延迟,但它们在高分辨率移动设备上非常流畅。如果你主要为移动设备开发网络应用程序,并且性能对你来说至关重要,那么目前没有更好的选择。
Scott,我也有iPad 3,所以听到你的经历我非常惊讶。我使用GSAP制作了一些复杂的动画,在我的iPad上非常流畅。事实上,在某些情况下,它比CSS过渡要流畅得多!也许你的场景中还有其他因素在起作用。无论如何,这只是强调了测试、测试、测试的重要性。有时CSS可能确实更快(正如我在文章中提到的那样)。不过,我还是要礼貌地挑战一下GSAP在移动设备(如iPad)上始终较慢的笼统说法。通常(至少根据我的测试),情况恰恰相反。
Jack,我同意,我应该对GSAP进行更多测试,以找到并理解其性能与CSS3一样好甚至更好的情况。
这是一个关于我所谈到的性能不佳的视频示例:https://www.dropbox.com/s/lpfehb4d8waj6sg/IMG_3804.MOV
注意当我点击“skip rotationX”或“Spin rotation”时出现的卡顿和跳帧现象。这是一个如此简单的示例,我不明白为什么会出现任何卡顿。
根据我的经验,在iPad上让CSS3动画出现卡顿需要更多因素,而且当它发生时,表现方式也完全不同。与Javascript补间动画跳帧不同,CSS动画会多花一点时间开始,但一旦开始就会流畅播放。这听起来可能有点吹毛求疵,但我发现这种性能下降对用户来说更可取,也更令人愉悦。
以下是一个CSS3性能下降的示例:https://www.dropbox.com/s/8j6dqht3ugw3h2o/IMG_3809.MOV
当我点击顶部导航栏按钮时,iPad会尝试将内容加载到内存中,这会导致轻微的延迟(所有内容都是本地的,没有网络延迟)。对于内容简单的页面,元素加载速度很快,延迟很小。当我点击0:15处的按钮时,你会看到延迟时间更长,因为iPad试图将大量内容加载到内存中(大约20多张大图片)。但是你会看到,CSS3导致动画等待内容加载到内存中后再开始动画,然后动画流畅播放。如果我使用javascript进行该动画,则补间动画会在iPad仍在加载内容到内存时尝试进行动画,并且当iPad赶上时,动画已经进行了一段时间,从而导致视觉卡顿。
再说一遍,我应该花时间进一步测试,但想让你看看我说的内容。
我有一部三星Galaxy 3,当我测试Animate.css与GSAP时……
我几乎立即决定使用GSAP。
使用animate.css时动画非常卡顿,而使用gsap则流畅。
至于其他设备,我还没有测试过……
我一直以来都在Flash中使用Greensock。我从未见过不使用Greensock的Flash开发者。
当它移植到JS后,我非常兴奋。它给了我一个参考点和舒适感,让我克服了对JS的恐惧。它也给了我信心去学习其他语言。
关于StackOverflow上的评论,我经常在StackOverflow上查找代码问题。但是,当涉及到Greensock时,我总是使用Greensock论坛。它由Jack、Carl和许多其他了解代码库来龙去脉的人员进行管理。如果你正在寻求Greensock帮助,在StackOverflow上发布与Greensock相关的问题毫无意义。:)
认为这篇文章仅仅是一则广告是愚蠢的。尽管我非常乐意在任何一天为Greensock做广告。如果没有JS端口,我将很难从头开始快速学习JS以保持我的技能相关性。Greensock在某个时候帮助我保住了工作,我知道它也帮助了许多其他人做到了同样的事情……所以……谢谢。
通过Greensock论坛、StackOverflow、HTML5Rocks和CSS Tricks,我学到了比自己学习更多的知识。
和平与爱
我刚刚使用GSAP完成了一个动画和时间轴非常密集的网站,我很高兴地报告说我非常喜欢使用它,这并不奇怪,因为我多年来一直很乐意将TweenLite用作Actionscript开发人员。我不敢想象如果没有各种Greensock插件,我的开发人员职业生涯会多么艰难。
GSAP在JS圈子中没有像TweenLite在AS圈子中那样广为人知,这确实令人惊讶,希望这篇文章能够改变这一点,并且理应如此。
在我说任何话之前,我要声明我是一名Greensock论坛版主,所以我的评论可能会被认为有偏见。
这是关于CSS动画和JS动画,最重要的是,如果你不注意代码,使用任何一种都可能遇到瓶颈。你能做什么和不能做什么的限制是浏览器,而不是工具。程序员编写糟糕的代码不是因为JQuery,而是因为他们没有学习编写好的代码和语言最佳实践。JS动画库是工具,工具(例如扳手)可以以好的和坏的方式使用,但这并不是开发人员的错。此外,工具是为了简化工作而存在的,如果你想做更具挑战性的事情,即使使用CSS预处理器或Grunt,使用css动画也可能是一件苦差事。用CSS控制你的动画是不可能的,构建甚至不复杂的序列、回放控制、事件回调和其他一些功能在JS中是可能的,因为这些工具运行在RAF上,这是人们在讨论如何用JS制作动画时已经谈论了两年以上的事情。
考虑到所有这些,这里使用的示例使用GSAP是因为你找不到更好的工具集,这绝不是一篇自我引用的文章或对GSAP的无耻推销。这篇文章中没有提到GSAP的一些内容
<
ul>
可拖动工具,现在<a href=http://codepen.io/rhernando/pen/KAFow”>可以与变换后的对象一起使用。
SplitText工具
ThrowProps插件
ScrollTo插件
还可以考虑查看Codepen,特别是Greensock集合,看看你可以用GSAP做哪些惊人的事情,并将它们移植到CSS动画中,然后传播仇恨。
@David Clark,GSAP的优点是每个人都能看到的,而缺点与其他动画工具的缺点相同,可能是文件大小,但用于动画DOM元素的两个主要文件压缩后的大小为20kb,并且进行了GZIP压缩,因此这不会比单个中等大小的图片更延迟页面加载。
总有聪明人在研究规范,包括我们已经拥有的规范:/
希望如此 :)
好文章。Web Animations听起来像一个JavaScript API,可能对我没有用,因为我通常将我的演示代码分成一个样式表。但是,对于我们通常使用Flash做的事情,GSAP就足够了。只需要SVG 2.0最终赶上Flash。
请记住,GSAP有一个RaphaelJS和一个KineticJS插件,因此您可以使用GSAP处理Canvas和SVG。
还有一段时间前,论坛中出现了关于three.js的帖子,查看JSFiddle链接。
所以基本上技术已经存在,我们只需要等待浏览器赶上来。
在简短的审查后,代码库有点太大,无法确定,但是当点从中心开始时,每个点/动画是否都是新创建的?在这种情况下,此测试只能证明GSAP在此特定应用中更快,在我看来,这完全错过了CSS动画的重点。
杰克,好文章,我希望它能让你工具在JS人群中获得更多关注。我是在去年才发现GSAP的,它为我在网络上制作动画带来了一些很棒的体验。我能够完成一些仅靠CSS无法完成的事情。我建议任何反对者都尝试一下,创建一些时间轴、复杂的动画序列,看看它的灵活性以及它在许多设备上的运行效果。此外,令人惊叹的是它可以向下兼容到甚至ie7的许多属性。
在你亲自尝试之前不要否定它。此外,GSAP在大多数情况下都是免费使用的,在所有其他情况下都非常实惠,没有理由不尝试一下。
GSAP是一个强大的库。我们可以用它做更多的事情!
Jack Doyle说得很好
对于简单的动画:css
对于更复杂的需求:javascript(我推荐GSAP…;) )
很棒的文章!非常公正和合理。任何说不是的人要么没有读过这篇文章,要么对CSS动画有感情上的依恋,要么就是个白痴,要么就是个混蛋。
我喜欢这篇文章,非常有帮助
需要使用JavaScript逻辑来解决一些CSS动画问题
http://lea.verou.me/2014/01/smooth-state-animations-with-animation-play-state/
我很想知道更多关于JS编程的信息,它可以做到CSS单独无法做到的事情。我对GSAP最感兴趣,但还有更多像animo.js这样的库。
杰克一直以来都是代码动画的大师。我过去在做Flash/ActionScript时是TweenMax的忠实粉丝,很高兴看到该库的所有功能都已移植到浏览器中。
我在日常工作流程中使用**很多**动画,并且经常使用CSS和GSAP。我的想法是——CSS非常适合简单的动画,例如悬停时动画颜色和位置,这对于一些小型项目来说非常棒,但你就是无法控制CSS动画。我个人喜欢JS动画的原因在于它的控制力——我来自AS3背景,因此**更新**时的事件和结束时的**onEnd**事件对我来说至关重要。此外,使用CSS不可能创建高级的**交互式**动画,因为属性(例如起始和结束位置)必须动态计算。所以,如果你的网站上没有动画——很好,使用CSS进行悬停效果。如果你要创建复杂的交互式体验——你离不开JS(或者Flash/Silverlight,但它们已经过时了,你知道的),对我来说,最好的工具是GSAP。它最大的优点在于——它能正常工作,并且工作良好。在我测试过的每一台浏览器上都是如此。
非常专业的知识,但我喜欢。我在一个非常复杂的项目中使用了Greensock,该项目涉及SVG等的动画。在网上搜索替代方案后,我发现Greensock的性能最佳。如果我没记错的话,它曾经是http://johnpolacek.github.io/scrollorama/ Scrollorama插件的驱动库。好文章。
我使用(原生)JS动画已经很久了,并且一直在考虑将其中一些切换到CSS动画。评估结果与文章中描述的结果相同。几乎没有好处,但有一些相当大的缺点。
此外,线程也没有带来任何好处:与异步加载相关的卡顿(例如社交网络按钮加载其API和数据)完全相同,甚至可能更严重。
结论:CSS动画可能是一种便利(对于只需编辑样式表即可应用的一些简单效果),但在复杂的动画中不会带来性能提升。
GSAP 并没有为最初的 Scrollorama 提供动力,因为它当时还没有用于 JavaScript。Jack 发布它后,我切换了过去并发布了改进的新版 SuperScrollorama。
我一直觉得 GSAP 是 JavaScript 中最不为人知的秘密。这是一个了不起的库,但你不必相信我。只需浏览 FWA 或 Awwwards 或 {在此处插入酷炫网站图库},然后查看您看到的任何具有酷炫动画的网站的源代码,您会惊讶于它的广泛使用。
例如,今天的 FWA 当日网站 恰好使用了 GSAP。
很高兴看到它获得更多关注。
对我来说:简单的动画内容:CSS,其余的用GSAP。效果很好(我使用它已经有一段时间了,之前也用过Action Script)。
除此之外:Greensock 的团队很棒,他们组成了一个很棒的团队,非常耐心和乐于助人。所以我希望他们继续摇滚并制作/改进“这些”东西,这当然有助于这篇文章。
对于那些想要使用 GSAP 创建动画的人,我们基于浏览器的动画器可以成为一个良好的起点,帮助您创建基本结构。请在 http://tweenui.com/animator 查看它。
我刚刚读了这篇文章,然后查看了CodeCanyon,我发现一个脚本刚刚发布,它使用了上面的 http://codecanyon.net/item/cool-text-incredible-animations/6546649,不确定它是否来自本文作者?
嗨,Rich,
据我所知,该应用程序建立在 GSAP(TweenMax)之上,但实际上是一个 jQuery 插件。
Greensock 有自己的文本动画工具 SplitText,您可以在 此处 查看它。
Rodrigo。
嘿,Jack,
好久不见!您的 GSAP 库一如既往地令人惊叹。您是否考虑过下载 Firefox 的源代码并将其中的代码写入其中?那将是太棒了!
希望您新年快乐,并致以最美好的祝愿
Simon
Jack 应该因其卓越的工作而受到尊重。那些为 CSS 过渡辩护的狂热者根本不知道,与使用 JavaScript 可以实现的功能相比,它有着巨大的局限性。现在我看到它的性能甚至更好,我很高兴在过去购买了 Greensock 许可证。
来自 Flash/ActionScript 背景,我可以诚实地告诉你,如果没有 Jack(www.greensock.com)的所有工具,生活不会更容易;无论是 LoaderMax、TweenMax、Draggable、AutoFitArea、LiquidStage、强大的 TransformManager 等等。使用所有这些工具的关键在于它们彼此之间的一致性和相似性。此外,性能对这个人(如本文所述)至关重要,因此在这方面,我们开发人员始终能够安心。
我个人的看法是,那些实际使用过这两种技术的人最适合判断这场关于“CSS 动画与 JavaScript 动画”的旷日持久的争论,但它仍然取决于品味和/或偏好。对我来说,“控制”是关键,其次是“直觉”。而 GSAP 为我提供了这两者以及更多功能(每次我查找使用 GSAP 做一些新的事情时,我最终都会发现它已经内置了,只是给另一个属性赋值的问题)。也许随着时间的推移,CSS 动画会赶上来,但对我来说,现在,GSAP 做到了。
所以,让我们停止浪费时间争论,而是专注于构建酷炫的东西。
这篇文章不是关于 Jquery 的,而是关于 Javascript 的,它与 css 具有相同的 gpu 访问优势,并且您可以使用 GSAP 做很多更酷、更有用的事情,而这些事情是 CSS 做不到的。这根本不是偏见,而是事实。Jack 和他的团队用 GSAP 做了一件很棒的事情。
你好,
当一个高度依赖动画的项目落到我手里时,我开始查看不同的资源来构建它,因为我真的觉得使用 CSS、jQuery 或原生 JS(至少对我来说)可能不够。
然后我发现了 GSAP,我之前从未使用过任何与 Flash 相关的工具,而且我不知道它是如何工作的,所以我认为使用 GSAP 的门槛会太高(在这个项目中,我只有很短的时间来学习)。
但 GSAP 为我提供的功能真是太棒了,它甚至不需要深入理解 JS,它提供了对时间轴、回调 ()、各种动画以及更多功能的出色控制,并且语法非常简单易懂。
因此,根据我的经验,对于非时间轴相关的动画(关键帧并没有得到很好的支持),CSS 很好用也很容易设置,但当涉及到复杂的序列并且你需要精确时,我很高兴 GSAP 可以用…
所以,好文章和很棒的工具,谢谢!
这是一个论点:动画很蠢。
你对营销一无所知或知之甚少。
但是,我了解优雅的设计,包括静态文本、美丽的排版和雅致的图形。你还在使用 marquee 标签吗?
Marquee 标签?唉,这场争论变得愚蠢了。
文章平衡性好,研究充分!
作为一名长期使用 Flash 和 JS GSAP 的用户(有时也是贡献者),我一直对更多人没有使用它感到惊讶。除了 Jack 对细节的专注外,它还快速、可靠、灵活、价值超群(大多数情况下是免费的),而且非常重要的是,得到了支持。
Flash 颇为不体面地被迫退位后,许多动画师、创意开发者和交互式设计师都在寻找替代方法来实现之前只能在 Flash 中实现的结果。
除非您是那种没有真正愿望去制作动画或创建动态交互的人(我怀疑前几个“纯 CSS”评论者就是这样),那么您绝对应该尝试一下 GSAP——我保证您不会后悔。
如果您想要一些 GSAP 演示、教程和代码(通常与 Adobe Edge Animate 集成),请访问我的 博客 或我的 CodeCanyon 作品集
我认为这是一篇非常棒的文章,向作者致敬!
最近,我对在网站中加入动画非常感兴趣和渴望……我目前正在使用 Ember 构建网站,这使得事情稍微复杂了一些。我在使用 Snap.svg 和 Ember 时遇到了很多麻烦,因此我一直在寻找其他可用的 CSS 和 Javascript 选项……
我一定会尝试一下,但也会尝试 此处链接到您的文本…… 或 此处链接到您的文本…… ……我真的很希望能够在 Ember 中使用 Snap.svg,并且很快会再次尝试,但在此之前,也许这些其他选项就足够了。再次感谢您提供的非常有见地的文章。
能否有人展示一个在 javascript/GSAP 上运行的重量级 UI 动画,例如一个重量级的侧边栏菜单(动画化整个屏幕画布)或一个全屏图像 3D 动画,使其能够与 GSAP 顺畅地协作?尤其是在移动设备(例如 iPad/iPhone)上?我尝试过各种解决方案,这些 UI 元素非常迟缓,尤其是在较小的设备上。CSS3 来救援,使这些菜单工作得很好……我从未见过任何 JS 解决方案能正确地做到这一点。
当然,GSAP 是一种智能且快速的 javascript 解决方案,如果您需要更多控制权,或者想要动画化 CSS3 无法实现的内容,那么它就是您的选择。但是,我不明白为什么有人会在 2014 年考虑从 CSS3 回退到 JS 来处理 UI 元素/过渡,毕竟这正是大多数开发人员正在处理的主要内容。
创建并排比较可能会有所帮助。创建两个具有完全相同元素的项目,以获得真实的性能表现。
杰克,文章很棒!我在几个项目中使用了 GSAP,无法想象用 CSS3 语法创建类似的效果。
以下是一些示例 – Apple 导航、Apple Mac 导航、圣诞派对道歉制作器。
我花了一段时间才习惯工作流程,但在进行了一些实验后,我真正意识到了 Greensock 的强大功能。
我肯定会在另一个更复杂和交互式的项目中使用 GSAP,并将 CSS3 用于简单的内容。
好吧,我想我现在还是坚持使用 javascript 动画。我真的很希望 css 是一个更好的解决方案,但上面的结果不言而喻。
尊敬的客座作者,尽管您在此处所说的一些内容似乎是正确的,但我认为您不应该在本文中进行一些比较。您似乎在责怪 CSS 动画、转换和过渡无法完成某些本不应该完成的事情,例如使元素可拖放、进行复杂的计算或能够创建或更改其自身安装的功能。
除此之外,您还做了一些对我来说似乎非常不正确的陈述。例如,您上面所说的第一件事就是使用 css 无法同时对同一元素应用具有不同时机的不同转换。我已经花时间为您找到一个很好且简单的示例,说明这实际上是完全可能的:http://animateyourhtml5.appspot.com/pres/index.html?lang=en#5
您这篇文章中的第一个陈述似乎被证明是不正确的,对我来说,这意味着您的研究在途中跳过了一些步骤。或者我是否误解了您的意思?
尽管如此,我仍然非常感谢您抽出时间撰写这篇文章,并感谢您为此付出的努力,目前我同意您的结论,即 css 不应用于所有或同时进行过多的动画。尽管针对您对完成更复杂动画所需的 css 量方面的担忧,我还想指出,您当然可以通过仅导入浏览器和视口所需的样式表,以及例如在不需要时不声明 0% 和 100% 的关键帧,来大幅减少所需的 css 量。
我的最终结论是,比较使用 javascript 创建的动画与使用 css 创建的动画不是一个好主意,但如果您最终想这样做,则应尝试使用所有不同的可能性来创建两种语言中的相同效果,然后再进行比较。但我不会自愿这样做,抱歉。
此致敬礼,
David Bartenstein
我认为您可能误解了第一点,David。您的示例根本没有显示独立的转换。注意所有转换(在这种情况下为缩放和旋转)是如何同时动画化的?例如,尝试交错缩放动画和旋转动画(缩放开始,然后稍后旋转开始,两者部分重叠,并且每个动画都有不同的结束时间和不同的缓动函数),就像我在提供的演示中一样。在同一元素上使用 CSS 动画是不可能的,但对于那些不仅仅进行简单 UI 过渡的现代动画师来说,这是一个相当普遍的需求。
至于“可拖动”的内容,我并不是说 CSS 动画应该是驱动实际拖放操作的技术(那会很奇怪)——可拖动演示的链接仅仅是为了展示一种动画运动的类型,这种运动发生在您轻弹/投掷/旋转对象之后,而 CSS 无法很好地复制(注意平滑的回弹、边界应用等)。本文的重点是帮助人们了解某些无法用 CSS 很好地完成的动画类型。我见过一些尝试用 CSS 实现平滑回弹运动的例子,感觉一点都不自然。
我很好奇为什么您认为比较基于 CSS 的动画和基于 JS 的动画是一个坏主意,因为如此多的动画师必须在这两者之间做出选择,并且经常难以理清炒作,弄清楚哪些是可能的(哪些是不可能的),然后构建一个真正有效且外观良好的东西。也许我们只是在不同的圈子里活动,但我知道很多人对这个话题感到困惑,并且对 CSS 动画感到沮丧。
你好,杰克,
我必须为我自己发表错误的言论而向你道歉。在尝试了 CSS 转换的不同操作后,我不得不承认你所说的都是真的。
看来我对此的记忆是错误的。我无法创建具有单独缓动函数的不同 css 转换,而不使用包装元素。(http://jsfiddle.net/DavidBartenstein/27DPG/37)尽管如此,如果没有个性化的缓动函数,也可以或多或少地使动画转换独立地运行。
为了解决您回复的其余部分:当我提到回弹运动时,我误解了您所说的一些内容。
至于我是否认为比较 css 动画与其他类型动画是一个坏主意:在阅读和仔细思考您的论点后,我也同意您的观点。我只是觉得这是一个常识,即 css 不应用于复杂的动画,如果有人要比较两者,我当然希望看到一个使用人类已知的所有方法的完整比较:P 因为使用不同方法时性能可能存在细微差异,这会引起我的兴趣。
但是,总的来说:文章写得很好,感谢您对我的草率结论做出的有尊严的回复……
此致敬礼,
David
嗨,杰克,关于您关于缩放动画然后与旋转重叠的陈述。我认为这可以用 CSS 轻松实现?
在使用动画关键帧的 CSS 中,我们不能
0% transform: scale(0) rotate(0deg)
40% transform: scale(0.5) rotate(0deg)
60% transform: scale(1) rotate (60deg)
100% transform: scale(0) rotate(0deg)。
这不会“视觉上”先开始缩放动画,然后在中途旋转吗?
顺便说一句,这是一篇很棒的文章。
维恩,也许对于非常简单的东西,是的,但是
尝试使旋转使用与缩放不同的缓动函数
尝试添加交互性,例如持续旋转元素,但仅在悬停/移出时动画化缩放
想象一下,当客户说“使缩放时间延长一倍(持续时间),旋转应该提前半秒开始”时,CSS 的工作流程将变成什么样子。哇。您需要进行计算并更新所有百分比(以及持续时间)。此外,您需要在转换中复制大量值。动画本质上是非常实验性的,而 CSS 的工作流程根本不利于此。请参阅 http://www.greensock.com/css-workflow/,了解专门介绍工作流程挑战的文章。
尝试以相对方式进行动画,例如,单击时,使旋转动画比它在那一刻所处的任何位置多旋转 5 度(即使在补间过程中再次单击)。
因此,是的,如果您有一个足够简单的用例,则可以使其看起来像转换组件在独立动画,但需要注意一些非常重要的注意事项。
是的,我完全同意您的看法。
此外,如果您不是专业的 SASS 用户,则在 CSS 中动画化复杂的动画可能是一场噩梦。您也必须在如何使用 CSS 方面非常有创意。
我创建了这个非常复杂的 CSS 实验,纯粹使用 SASS + HAML。 http://vimeo.com/84713704
一些主要的收获
1) 难以同步。就像您所说的,更新持续时间会给您带来级联噩梦。
2) 您编写 SASS 代码的方式几乎与编写 javascript 完全相同,直到某个点您会认为在 CSS 中继续这样做是多余的。
3) 在处理 3d 多边形时,疯狂的 CSS transform 属性。transform: scaleY(..) skewX(..) rotate(..) translateY(..) rotate(..) 等数学运算会让您感到困惑。
4) 最后,生成的 CSS,哇。文件大小巨大。可以使用库。
我使用 Greensock 只有两天,但它看起来已经非常有希望了。
文章很棒,绝对值得一读。
使用 CSS 动画来实现过渡、悬停效果等似乎更直观且易于管理。
然而,使用 CSS 进行复杂的动画却是一场噩梦,我甚至不确定它如何在现实世界中实际应用。很高兴知道有一个可行的替代方案。
我认为这里提出的最佳观点是,CSS 与 JS 动画的争论长期以来都被认为是 jQuery 动画与 CSS 的争论。它比这复杂得多。希望本文能稍微平衡一下。
没有什么能阻止你在 JavaScript 中进行 CSS 动画。
这将允许你做任何你认为缺少的事情,比如向旋转添加 30 度。
不幸的是,我非常确定这不是真的——你不能通过 JavaScript 设置 CSS 动画来做“所有事情”,比如独立变换、物理、滚动位置、沿着贝塞尔曲线动画、使用弹性和反弹等缓动函数、在任何位置进行查找或在运行时平滑反转(运行时控制),以及文章中提到的几乎所有其他内容。至于能够随时“向旋转添加 30 度”,从技术上讲,使用 JS+CSS 是可以实现的,但我希望看到你将如何以足够强大的方式来处理它,例如,在一个正在进行的 rotationX 缓动动画的中间,以及其他部分的变换也在动画中(缩放和平移)时,只需说“向当前 rotationX 值添加 30 度”,如果你能告诉它以最短的距离转到一个绝对的旋转值,那就加分了:) 我的意思是,即使那一件事从技术上讲可以使用 JS + CSS 来实现,但它也相当麻烦,因为你可能需要解析一个 16 元素矩阵,计算旋转以及任何其他与变换相关的数值,并将它们组合回矩阵或列表中。大多数动画师都不知道(或不感兴趣)如何做到这一点,因此它不太实用(工作流程问题)。动画师希望自由地玩耍和实验,工具需要促进这一点。
我已经想出了一个针对 CSS 动画时间轴问题的相当好的解决方案。通过使用 JavaScript 触发和步进函数,你可以获得两全其美。此外,它非常易于使用。此处链接到你的文本…
我只是想感谢你创建了如此棒的工具集。多年来,你为我节省了大量时间。
这仅仅是关于在 Chrome/Webkit 上进行动画吗?基准测试在 Firefox 上似乎效果不佳,在 IE11 上根本不起作用。
在我这里,包括 IE11 在内的所有主流浏览器都能正常工作(刚刚再次检查过)。我想知道你的浏览器是否设置为模拟非常旧的版本或其他什么?你是否也尝试过直接访问 codepen(也许这里的嵌入代码有故障)?
为了回答你的问题,不,这篇文章 *并非* 仅仅关注 webkit 浏览器(我在结果表中列出了一些其他的)。感谢你要求澄清。
我不知道问题出在哪里,但我直接在 Codepen 中运行它,它可以工作。然后我将其嵌入运行,它也可以工作。
你能解释一下为什么 GSAP 在大力推广自己,并使用诸如“GSAP 与 jQuery”之类的测试用例,而他们的库中却到处都是 jQuery 吗?
再说一次,如果这篇文章给人一种自我推销的感觉,我表示歉意。我尝试过(显然失败了)避免这种情况。
需要明确的是,GSAP *根本不依赖* jQuery。它并没有“到处都是”,但我们在 codepen 演示中使用它作为一种方便的方法来选择元素以及其他一些小便利(就像现在很常见的那样)。尽管如此,消除这一点非常容易。**GSAP 是无依赖的。**
首先,我从未听说过 GSAP 是一个广泛使用的库。我确实认为我将在一些项目中使用它。我目前正在做一个网站,客户希望它有很多“哇”的因素和运动,类似于一些 DVD 标题菜单。
其次,哇……我完全震惊于有人会将这篇文章视为自我推销。我自己过去也使用过 jQuery 和 CSS 动画,但仅限于基本的动画。如果我要创建一个更复杂或更复杂的基于动画的项目,我就能清楚地看到(在我的情况下)GSAP 将是一个更好的选择。
如果你认为这个测试有偏差,我想我们都很乐意看到 *你* 的测试结果。Jack 清楚地解释了 CSS 对于某些动画来说是一个明确的赢家,并且做得很好,没有进行自我推销。如果他使用了别名,没有人会眨一下眼睛(在我看来)。他正在为我们的行业提供一个非常有用的工具,而他却因为在另一个网站上发布它而受到批评?干得好,伙计们……帮助我们的行业发展壮大。
我的 2 美分……GSAP 是一个很棒的库,这篇文章阐明了我以前不知道的关于动画比较的事情。
谢谢,
Patrick
即使 GSAP 在这篇文章中得到了推广,有什么问题吗?它是一个高质量的工具,并且得到了非常好的支持。如果我们想提升互联网体验,那么推广一个经过精心设计并有专门人员支持的东西有什么问题呢?
我个人认为,任何撰写文章并花费大量时间和精力解释利弊的人,都应该得到某种程度的好处。我还认为,社区需要更加小心,不要抨击他们知之甚少的东西,尤其是在涉及到别人的创造物时。也许花点时间尝试一下,向创作者提问,并给予他们应得的尊重,以表彰他们的努力。
在简要回顾了 GSAP 库和 Greensock 的历史之后,我个人认为 Jack 是真正的专家,他为社区做出的贡献应该受到欢迎。
100% 同意
阅读体验很棒。
CSS 中缺少的许多功能正在开发中。暂停、查找等功能即将在 web 动画 中实现。
等待它们发布……比起 js,我更喜欢 css..
GSAP 确实很棒。这篇文章似乎揭穿了许多关于 Jquery/CSS 动画的错误观念。干得好!
我认为许多抱怨这篇文章是广告的人,都错过了文章的重点。我更将其视为让 Web 社区更多地了解他们在 Web 动画方面可选择的方案。
来自计算机动画和传统动画背景……我对 Flash 中的 GSAP AS/AS3 非常满意。我很高兴 Jack 将 GSAP 移植到 JS。我发现 CSS 动画和 @keyframes 非常令人沮丧且有限。如果你需要对你的关键帧和时间进行哪怕是细微的更改,你就会面临重新计算时间的噩梦。此外,还需要为跨浏览器编写相同的规则。动画都是关于时间的……而 CSS 动画在完全控制方面还远远不够。
GSAP 是我发现的唯一一个动画平台,它能够为我提供对简单和复杂动画的完全控制,并配有一个虚拟时间轴。如果你花时间进行自己的测试,你就会亲眼看到 GSAP 如何帮助简化复杂任务。
当然,没有什么能阻止任何人将 CSS 动画和 JS 动画都用于他们的工作流程中。但是,如果你必须不断地满足截止日期,并且需要精确控制你的动画,那么我建议你尝试一下 GSAP,并进行自己的测试。它为我节省了大量时间,而且不必费心处理 CSS 动画缺乏控制和缺乏时间轴的问题。
仅代表个人观点……自己测试一下:)
我是一个普通的 Web 开发人员,不来自 AS3 背景。
当我第一次听说 GSAP 时,是来自一些难以过渡到 HTML 的前 Flash 开发人员,他们将 GSAP 用于非常基本的事情。
所以,我当时认为这是一个愚蠢的库,语法糟糕,文档不好,也没有后续支持。
然后,几个月前,我接了一个大型项目,其中包含大量动画。不是基本的东西。复杂的动画,2D 和 3D,需要倒带模式、速度模式等。
我尝试了 GSAP。
它太棒了。
不是语法,也不是文档。
但是,我的天,功能、性能和无错误性……太棒了。
如果你用它来做滑块,那你就是一个懒惰的笨蛋。但如果你有大量繁重的动画工作,它就是救星。
我一直更偏爱 CSS 动画而不是 JavaScript,但越想越意识到,我其实只是在走“捷径”(至少在工作方面是这样)。正如文章中指出的,CSS 动画并非易事,有些东西甚至根本无法实现。我认为我迟迟不愿转向 JavaScript 是因为客户表示非常不希望使用它,尽管他们仍然希望实现这个效果和那个效果。虽然过去在必要时我也会使用 JavaScript,但从现在开始我一定会更频繁地使用它。
上面的评论充满了关于 JavaScript 动画的赞成或反对的论点,但让我们暂时务实一点。
你能想象仅仅使用 CSS 动画就能创建像24hoursofhappy.com这样的网站吗?
这篇文章真是个惊喜,一个好的惊喜,但不知何故,它类似于大多数探索类节目,其中所有的事实让你彻夜难眠,但最终却留下一个大大的问号。毕竟,我不确定我应该更关注 CSS 还是 JavaScript,因为我仍然相信两者都有其自身的优点。
我阅读了所有评论以寻找解决方案,但一切都像过去苹果-微软、Flash-JavaScript、Corel-Illustrator 的斗争一样。毫无创意,我真的很讨厌这样。
在这里稍微技术一点。海王大战蜘蛛侠。在哪里?在客厅还是在浴室?
我看到一些网站围绕 GSAP 脚本构建,仅仅是为了利用几乎所有的效果,而实际上这应该是一个用来完善设计的工具。它太强大了,以至于很危险。
作为从 Flash 时代就开始使用 Greensock 的粉丝,我认为很多人错过了重点。从开发者/设计师的角度来看,让 GPU 渲染图形并缓存它们是有意义的。另一方面,JavaScript 的作用是使用 CPU 进行复杂的计算并与 GPU 结合,我的意思是,仅仅这一点就能提升性能。然而,每个工具都有其优缺点,CSS 和 JavaScript 也是如此。我不会使用 JavaScript 来设计(表示层)页面,我当然也不会使用 CSS 来进行交互和复杂的计算。我不喜欢的一件事是,当所有类型的开发者/设计师在他们没有经验或没有进行过研究的特定案例上争论不休时。我认为这是整个 Web 社区的问题,意见太多,事实不足,而 Jack 通过测试确实证明了他的观点。伙计们,开心就好!!!哇。顺便说一句,Jack,我有时候还在用 Flash Greensock Flash 动画。我爱 Greensock
许多非常聪明的人在这里发表了评论……阅读它们并了解其他开发者对事物的看法是一件很愉快的事情……我是 Adobe 认证的 Flash 开发者,并且像我们大多数人一样,现在已经转向 HTML5 UI 设计等领域……我在 Flash 中对 Greensock 库有深入的经验,也使用过它的 JS 版本……我只是想对 Jack 说,他是动画领域中一位杰出的开发者和思考者……相信他说的话……我们在索尼工作室、Charles Schwab 创意和其他我工作过的地方都采用了他的工具……对我来说,动画控制根本不应该放在 CSS 代码中……仅代表个人观点……CSS 用于样式化……JS 更适合控制动画……我想要一个 API/老式的我……而 GSAP 确实很棒,毫无疑问……Jack,你真是个了不起的人……而且我在文章中没有听到任何偏见……我感觉你很公平、客观……我认为大多数读者也是这么认为的……你是最棒的……