当前位置: 首页 > 编程日记 > 正文

【译】CSS动画 vs JS动画

原文地址

目前有两个主流的方法在web上创建动画:使用CSS或JS。到底选择哪种方法来实现动画,完全取决于你的项目以及你想要达到的效果。

tips:

  • 对于简单的只出现一次的过渡效果,可以采用CSS动画,比如切换UI元素的状态
  • 在需要高级的效果,比如弹跳、停止、暂停、倒回或者减速这种效果,就需要用JS来实现动画
  • 如果用JS实现动画,可以用TweenMax,或者如果需要轻量级的解决方案,就用TweenLite

很多基础的动画都可以通过CSS或JS来实现,但两者的效果和时间会有差别。两种方式各有千秋:

  • 对UI元素小而独立的状态添加动画,可以使用CSS。CSS的transitionanimation是一个好办法,比如把导航栏从侧边移过来,或者展示一个提示框tooltip。这种情况下最好用CSS而不是JS
  • 在需要对动画进行精确控制的时候需要用JS实现。JS可以动态跟踪触发动画的位置,像一些停止、暂停、减速或者反转的效果都需要JS实现。

如果你已经用了类似jQuery的包含动画函数的JS框架,你会发现用它来控制动画比CSS方便的多。

CSS动画

毫无疑问CSS动画是最简单的一种让屏幕上的元素动起来的方式。

下面的CSS代码会将一个元素在X轴和Y轴上移动100px。完成这个功能需要CSS trasition,并设置为500ms。当move这个class被添加时,transform的值会发生改变,过渡开始

.box {-webkit-transform: translate(0, 0);-webkit-transition: -webkit-transform 500ms;transform: translate(0, 0);transition: transform 500ms;
}.box.move {-webkit-transform: translate(100px, 100px);transform: translate(100px, 100px);
}

你如果像上面的代码片段一样添加了CSS类来控制动画,那么接下来就需要用JS来控制切换动画的开始和结束

box.classList.add('move');

采用这种方式会对你的app有很好的平衡。你只需要用JS来控制状态,然后对目标元素设置恰当的class,让浏览器来控制动画。接下来你可以对目标元素监听transitionend事件,不过这种情况只适用于IE10+。这个事件在CSS完成过渡以后触发。

var box = document.querySelector('.box');
box.addEventListener('transitionend', onTransitionEnd, false);function onTransitionEnd() {// Handle the transition finishing.
}

除了用CSS transitions,你也可以使用CSS animations,它能让你对动画的帧、时长及重复次数有更多的控制。

Note

如果你是动画新手,对于手绘动画而言关键帧(keyframes)是很重要的概念。动画会生成一些特殊的帧来实现一个动作,这种帧叫做keyframes,这种帧能够捕捉某些动作的最极端的部分。CSS动画也有相似的过程,通过设置CSS的相关属性在目标点的时候什么值就可以了。

举一个例子,让盒子的动画跟上例一样,只是不需要任何像click的事件触发,并且无限重复。你可以同时改变多个属性:

/*** This is a simplified version without* vendor prefixes. With them included* (which you will need) things get far* more verbose!*/
.box {/* Choose the animation */animation-name: movingBox;/* The animation’s duration */animation-duration: 1300ms;/* The number of times we wantthe animation to run */animation-iteration-count: infinite;/* Causes the animation to reverseon every odd iteration */animation-direction: alternate;
}@keyframes movingBox {0% {transform: translate(0, 0);opacity: 0.3;}25% {opacity: 0.9;}50% {transform: translate(100px, 100px);opacity: 0.2;}100% {transform: translate(30px, 30px);opacity: 0.8;}
}

通过CSS动画,你可以为目标元素单独定义动画,并使用animation-name属性来选择需要的动画。CSS动画目前还需要写前缀,在Chrome,Safari,Opera,Safari Mobile以及Android Browser中均需要添加-webkit-前缀。IE和Firefox均不需要写前缀。有很多工具会帮你在需要添加前缀的属性上添加前缀,这样在源代码中就可以不需要一个个添加前缀了。

JS动画

跟CSS动画相比,JS动画更复杂一些,但会给开发者更多的动画能力。推荐的做法是使用requestAnimationFrame,在动画的每个帧上来确定元素的每个属性值。(关于requestAnimationFrame,可参考HTML5探秘:用requestAnimationFrame优化Web动画)

Note

你应该见到过很多用setInterval或者setTimeout来实现动画的代码。然而这是一个不好的方法,动画会不能跟屏幕同步刷新,而且很容易剧烈变化或者跳出。你需要避免这样的代码,尽量使用requestAnimationFrame,它能够正确的同步。

下面的例子是你需要写的JS代码,实现上面用CSS实现的效果:

function Box () {var animationStartTime = 0;var animationDuration = 500;var target = document.querySelector('.box');this.startAnimation = function() {animationStartTime = Date.now();requestAnimationFrame(update);};function update() {var currentTime = Date.now();var positionInAnimation = (currentTime - animationStartTime) / animationDuration;var xPosition = positionInAnimation * 100;var yPosition = positionInAnimation * 100;target.style.transform = 'translate(' + xPosition + 'px, ' + yPosition + 'px)';if (positionInAnimation <= 1)requestAnimationFrame(update);}
}var box = new Box();
box.startAnimation();

上面的代码看起来很复杂,你可以尝试将其扩展到多种情况。如果你正在使用jQuery,可以用.animate()函数。如果不是,你可以参考强大的Greensock’s TweenMax,还有一个轻量级的TweenLite。

相关文章:

问题二:相关性怎么引入?

在大数据处理的时候总是会有说&#xff0c;现今科学技术的发展使得我们使用样本取代总体的时代过去了。在新的时代我们使用的是足够多的接近于总体的大的数据。在这个大的数据里面&#xff0c;我们没有办法具体数据具体的分析。因为它足够的大。 因此引入了相关性的概念&#x…

【UE5】虚幻引擎5中的VFX游戏特效制作学习教程

从零开始学习虚幻引擎5中的实时VFX。 你会学到什么 了解如何创建实时效果 通过创造效果来学习Niagara 了解Niagara是如何运作的 为游戏创造各种各样的效果。 创造风格化的火 创建风格化的爆炸 创造能量球 MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;44.1 KHz 语…

HDOJ 1236 排名(练耐心题)

Problem Description 今天的上机考试虽然有实时的Ranklist&#xff0c;但上面的排名只是根据完成的题数排序&#xff0c;没有考虑 每题的分值&#xff0c;所以并不是最后的排名。给定录取分数线&#xff0c;请你写程序找出最后通过分数线的 考生&#xff0c;并将他们的成绩按…

python跟java 效率_对比平台--Java与Python之间的性能差异

ava Performance和Python之间的主要区别 以下是描述Java Performance和Python之间的区别的要点列表&#xff1a; 以下是Java性能与Python之间的主要区别&#xff0c;我们在决定应该选择哪种语言之前必须进行分析和评估。 Java是一种编译语言&#xff0c;而Python是一种解释语言…

你听说过反摩尔定律吗?

相信很多人听说过摩尔定律&#xff0c;但是你听说过反摩尔定律吗&#xff1f; 可能你会以为反摩尔定律就是与摩尔定律相反的定律&#xff0c;甚至认为这两个定律相互矛盾&#xff0c;那你就大错特错了&#xff0c;其实两种定律可以说是针对同一种现象的不同说法。 摩尔定律是…

《Java从入门到精通》第九章学习笔记

第9章 类的高级特性 一、抽象类 抽象类只声明方法的存在&#xff0c;不能被实例化&#xff0c;就是说抽象类不能创建其对象&#xff0c;在定义抽象类时要在class前面加上abstract关键字。 1 /*定义一个抽象类Fruit&#xff0c;并定义其抽象方法2 *在其子类中实现该抽象方法3 …

Python中的super()函数

多路继承的问题 描述&#xff1a; 解决这样的问题Python中可以使用super&#xff08;&#xff09; super&#xff08;&#xff09;函数有点&#xff1a; &#xff08;1&#xff09;在父类中可以直接的调用未绑定的方法 &#xff08;2&#xff09;在确保所有的父类的构造方…

【UE5教程】影棚拍摄于虚拟场景合成制作流程学习

用虚幻引擎预算虚拟生产5 你会学到什么 使用虚幻引擎5进行虚拟生产 使用虚幻引擎5的独立虚拟制作 用虚幻引擎预算虚拟生产5 用虚幻引擎5进行穷人虚拟生产 用虚幻引擎5进行自制虚拟制作 虚幻引擎5独立虚拟制作 带虚幻引擎5的复合绿屏 虚拟生产导论 面向初学者的虚拟生产 MP4 |视…

java面试题:分布式和微服务的区别

分布式架构解决的是如何将一个大的系统划分为多个业务模块这些业务模块会分别部署到不同的机器上,通过接口进行数据交互的问题。微服务是指很小的服务,可以小到只完成一个功能,这个服务可以单独部署运行,不同服务之间通过rpc调用。分布式架构是将一个大的系统划分为多个业务模块,这些业务模块会分别部署到不同的机器上,通过接口进行数据交互。微服务架构是架构设计方式,是设计层面的东西,一般考虑如何将系统从逻辑上进行拆分,也就是垂直拆分。分布式系统是部署层面的东西,即强调物理层面的组成,即系统的各子系统部署在不同计算机上。

python安装成功的图标_ubuntu下:安装anaconda、环境配置、软件图标的创建、成功启动anaconda图形界面...

Ubuntu安装anaconda常见的四大问题&#xff1a;目录1、介绍2、安装anaconda3、环境配置4、软件图标的创建5、成功启动anaconda图形界面1、介绍先介绍一下anaconda和python的关系&#xff1a;初学者所安装的python2/3只是python的环境&#xff0c;没有python的工具包&a…

jQuery和dom的相互转换

1.将DOM对象转换成jQuery对象 $div $(objDom); 2.将jQuery对象转换成DOM对象 objDom $(objJqeury).get(0); 3.判断一个元素是否存在于页面 jQuery方法&#xff1a; $("#id").length >0:代表存在于页面 0&#xff1a;不存在页面 4.取另一个页面中存在的元素 …

VScode的撤销操作的快捷键

撤销刚才的操作&#xff1a;CtrlZ 恢复刚才的操作&#xff1a;CtrlShiftZ

IOS初级:UIAlertController

- (IBAction)signOutAction:(id)sender {//初始化,StyleActionSheet是对话框的样式UIAlertController *alert [UIAlertController alertControllerWithTitle:"是否注销?" message:"真的要注销吗" preferredStyle:UIAlertControllerStyleActionSheet];//添…

1976年图灵奖

获奖原因&#xff1a; 在1959年发表的论文“有限自动机及其判定问题”中提出了非确定性有限状态自动机这一概念。 图灵奖引用&#xff1a; 授 予 MichaelO. Rabin与DanaSteward Scott图灵奖以表彰合作撰写的研究论文“有限自动机与其判定性问题”。在该研究论文中&#xff0c;…

UE4蓝图无代码编程游戏开发技能学习教程

在虚幻引擎4中创建、设计和开发自己的游戏&#xff0c;无需编码 你会学到什么 虚幻引擎4中使用蓝图的游戏开发(无代码编程) 使用行业标准方法的游戏设计 使用Maya进行三维设计 在本课程中创建您的第一个游戏 Game Development Essentials with Unreal Engine 4 Blueprints M…

“睡眠猴子”团队项目及成员介绍

“睡眠猴子”团队项目及成员介绍 咳咳……软件工程这门课最终还是来到了团队开发的部分&#xff0c;我们宿舍三只经过一下午的讨论和需求分析决定做一款名叫“睡眠猴子”的安卓版手机软件&#xff0c;具体的项目功能和团队介绍如下&#xff1a; 一、“睡眠猴子”开发团队介绍&a…

python代码编写规范_python初学者-代码规范

一、编程规范 1.缩进&#xff08;代码块&#xff09; 类定义、函数定义、选择结构、循环结构、with块、行尾的冒号表示缩进的开始。 python程序是依靠代码块的缩进来体现代码之间的逻辑关系&#xff0c;缩进结束就表示一个代码块结束。 同一个级别的代码块的缩进量必须相同。 一…

程序出现 ld returned 1 exit status的解决办法之一

把正在运行的窗口关闭

基于自然的灵感算法--元启发式

问题一&#xff1a;自然赋予的元启发式优化算法的分类 自然赋予的元启发式算法&#xff08;模拟生物或者物理的现象去解决问题&#xff09;有三大类也就是&#xff1a;基于进化&#xff0c;基于物理的&#xff0c;基于群体的 基于进化的主要是受达尔文的物种进化理论的启发&a…

三维地形制作软件 World Machine 基础入门学习教程

《World Machine课程》涵盖了你需要的一切&#xff0c;让你有一个坚实的基础来构建自己的高质量的电影或视频游戏地形。 你会学到什么 为渲染或游戏开发创建高分辨率、高细节的地形。 基于World Machine蒙版和着色设备的纹理地形。 获得哪个节点达到预期结果的信心。 组装宏以…

python编写脚本方法_【Python】教你一步步编写banner获取脚本

Hello 各位小伙伴们大家好&#xff0c;周末过的愉快吗&#xff1f; 刚好最近学习了使用python编写banner获取脚本&#xff0c;今天就跟大家一起一步一步再学习一遍吧。 Part.1 说明篇 什么是banner&#xff1f; banner可以理解为我们连上服务器后&#xff0c;服务器响应的第一条…

Linux内核分析——可执行程序的装载

链接的过程 首先运行C预处理器cpp&#xff0c;将C的源程序(a.c)翻译成ASCII码的中间文件(a.i)接着C编译器ccl&#xff0c;将a.i翻译成ASCII汇编语言文件a.s接着运行汇编器as&#xff0c;将a.s翻译成可重定位的目标文件a.o最终完全链接成可执行文件a.out目标文件 目标文件有三种…

c语言中external,static关键字用法

static用法&#xff1a; 在C中&#xff0c;static主要定义全局静态变量、定义局部静态变量、定义静态函数。 1、定义全局静态变量&#xff1a;在全局变量前面加上关键字static&#xff0c;该全局变量变成了全局静态变量。全局静态变量有以下特点。 a.在全局区分配内存。 b.如…

男神女神配——alpha阶段总结

一、需求分析 虽然公共社交网络系统能够满足大多数高校校园用户在校园网络社交的需求&#xff0c;但是针对校园学习、工作和文化生活等方面的支持以及学校个性化需求方面却存在不足。利用电子校务平台的数据&#xff0c;设计了与真实校园环境和活动紧密结合&#xff0c;包含具有…

正向代理和反向代理??

(5 条消息)正向代理 反向代理 本质区别&#xff1f; - 知乎 https://www.zhihu.com/question/36412304/answer/76804314 正向代理&#xff0c;只用于代理内部网络对Internet的连接请求&#xff0c;客户机必须指定代理服务器,并将本来要直接发送到Web服务器上的http请求发送到代…

虚幻引擎5(UE5)实时VFX游戏特效制作入门到精通

UE5 Niagara学习教程 课程获取&#xff1a;虚幻引擎5&#xff08;UE5&#xff09;实时VFX游戏特效制作入门到精通-云桥网 你会学到什么 我将通过创建各种各样的实时效果来教你虚幻引擎中强大的粒子系统。 我们将从简单的基础知识开始&#xff0c;然后逐渐地&#xff0c;我们将…

share extension 不显示_你所不知道的网红小酒馆Helens

当夜幕降临后&#xff0c;Helens小酒馆显示出她真正的魅力约上你的好友&#xff0c;来Helens体验一次穿越异国的饮酒之旅吧由美、中、泰设计师倾力打造&#xff0c;有着浓郁的东南亚异域style。木质的桌椅、精美的木雕装饰&#xff0c;每个细节都可以感受到不同文化的碰撞。别样…

怎么将jenkins打包后的war自动部署到jetty上?

1&#xff0c;使用maven的cargo插件&#xff0c;实现远程部署 &#xff08;官网描述地址&#xff1a;https://codehaus-cargo.github.io/cargo/JettyRemoteDeployer.html&#xff09; Maven中添加配置文件&#xff1a; Type: 可选参数有remote&#xff08;远程部署的模式&#…

自制青蛙跳台阶小游戏~

青蛙跳台阶小游戏 1、概念&#xff08;concept&#xff09;文档 楔子(Setting)&#xff1a;千百年来&#xff0c;人们在贬低别人时&#xff0c;常用井底之蛙来描述那个人&#xff0c;但这却让青蛙不开心了&#xff0c;于是青蛙决定跳出井底&#xff0c;为自己讨一个公道。 玩法…

提高性能的Varnish缓存方案

转载http://www.s135.com/post/313/arnish是一款高性能的开源HTTP加速器&#xff0c;挪威最大的在线报纸 Verdens Gang (http://www.vg.no) 使用3台Varnish代替了原来的12台squid&#xff0c;性能居然比以前更好。Varnish 的作者Poul-Henning Kamp是FreeBSD的内核开发者之一&am…