web 动画实现方式

这这里,总结了一些 我知道的不用框架来实现动画的方式,总的来说有两种,第一种是用css的transition或keyframes+animation,第二种用js来实现

首先看基本结构

<style>
  div {
    position: relative;
    background: #999;
    width: 50px;
    height: 50px;
  }

    .ani {

    }

</style>

<body>
  <div class="ani"></div>
</body>

  

一   css

1)  transition

transition是渐变的意思,就是某个属性 从一个值逐渐变成另一个值,比如width:从50px,到200px

基本表达式 transition: transition-property  transition-duration transition-timing-function transition-delay

  • transition-property :需要做缓动的属性,默认值为all,就表示所有可以缓动的属性都做缓动动画
  • transition-duration : 整个缓动动画的持续时间,比如1s 就是1秒
  • transition-timing-function : 缓动动画的呈现速度方式,默认值为ease,即 先慢再快再慢,还有linear(匀速)等其他方式
  • transition-delay : 延迟执行动画时间

举例:

.ani {
  transition: width 1s .4s linear;
}

.ani:hover {
  width: 200px;
}

  

这个动画呈现效果是:当鼠标移动到div上的时候,执行width 改变动画

很多其他的一些属性也可以,比如left,opacity 等等,这里就不详述了,感兴趣的可以自己试试

2)keyframes

包含两部分,第一个是使用animation属性,第二部分是:用@keyframes定义动画,

animation:

  • animation-name :  动画名字,就是 @keyframes 定义的动画名
  • animation-duration: 动画持续时间
  • animation-timing-function: 动画呈现的速度
  • animation-delay: 延迟时间
  • animation-iteration-count:动画播放次数,默认值:1,值是一个数字或infinite(表示无限次,其他的就是直接用数字表示)
  • animation-direction:当动画播放到100%的时候,是否需要反向播放,默认值:normal,如果需要方向播放则alternat
.ani {
    animation: testAni 2s infinite alternate;
}

注:播放完一次的会后,你会发现动画停留最开始的状态,但是你想停止在100%时候的状态,那怎么办呢? 你可以使用nimation-fill-mode:forwards 的方式到达目的

keyframes

@keyframes testAni {
	0% {
	    width:50px;
	}

       30% {
           width:80px;
       }  

	100% {
	  width: 200px;
	}
}

  

0% 表示最开始,30%,表示整个动画时间的30%,  100% 表示结束,

中括号里面就是需要呈现动画的属性

注:动画优化:1)因为动画改变的太频繁,所以我们最好用position:absolute或fixed的方式把元素脱离文档流,避免频繁重绘

                2) 如果是定位属性:比如left,top等等,可以用transform:translate()的方式来替代,这样性能更好

注:transition适合于一次性的呈现动画,animation适合多次 或者需要控制中间过程的动画

二   javascript

1)  setTimeout

表达式:setTimeout(funcName,delayTime)

funcName:函数名字

delayTime: 延迟执行时间

window.onload = function(){
   var divDom = document.querySelector(".ani");
   var nowWidth = divDom.offsetWidth;
   var speed = 2;
   function showAni(){

	nowWidth += speed;
	if(nowWidth > 200){
		nowWidth = 200;
		speed *= -1;
	}
	else if(nowWidth < 50){
		nowWidth = 50;
		speed *= -1;
	}

	divDom.style.width = nowWidth + "px";
	setTimeout(showAni, 20);
  }

   showAni();
}

  

停止方法:使用clearTimeout(id)

2) setInterval

表达式:setInterval(funcName,delayTime)

表示程序间隔多少时间就执行一次func,是持续的,如果不使用clearInterval的话就一直执行,不像setTimeout是执行一次

具体的动画实现和setTimeout 的实现一样,只是调用方式不一样,

showAni改为:setInterval(showAni,40),然后showAni里面 删除 setTimeout那条语句

停止方法:使用clearInterval(id)

3) window.requestAnimationFrame()

window.onload = function(){

   var divDom = document.querySelector(".ani");
   var nowWidth = divDom.offsetWidth;
   var speed = 4;
   var lastTime = 0;
   function showAni(nowTime){

	 if(nowTime-lastTime > 20){

		lastTime = nowTime;
		nowWidth += speed;

		if(nowWidth > 200 || nowWidth < 50){

			speed *= -1;
		}

	    divDom.style.width = nowWidth + "px";
     }
    window.requestAnimationFrame(showAni)
  }

  window.requestAnimationFrame(showAni);
}

这个实现看起来 和setTimeout的方式差不多,但是因为浏览器针对requestAnimationFrame接口专门做了优化,简而言之就是把所有更新集中到

渲染期的最后一起集中渲染,所以效率更高

停止方法:cancelAnimationFrame(id)

注:1)nowTime-lastTime > 20 这个表达式只是为了设置间隔时间,因为一般情况下,执行这个方法的间隔时间是16.7秒的样子(60帧),

  用这个表达式可以来控制真正的逻辑执行的间隔时间

  2)用requestAnimationFrame加上canvas 可以实现一个动画引擎,当然这个只是核心,还包括其他的一些技术,才能实现,而且一般

     是在游戏中才会用到那么复杂的,所以这里就不去详述相关的东西

注:上面的所有停止方法里面的id 都是调用相关方法的返回值,比如 id = setTimeout(showAni,20);

这里只是列举 实现动画的方式,所有对每种方式没去深究,拿requestAnimationFrame来说,就可以说一整篇幅,如果感兴趣的,可以针对

每种方式再去深入研究,这篇就到此结束,欢迎拍砖

时间: 2024-08-24 04:41:16

web 动画实现方式的相关文章

WEB 动画的一些实现方式

WEB 的动画实现多种多样,随着H5 的发展,实现动画的方式越来越多了.初步统计实现动画的方式有以下一些方式实现 一.GIF动画 通常咱们社交聊天的一些动态表情,大多都是gif动画. GIF(Graphics Interchange Format)的原义是"图像互换格式",GIF文件的数据,是一种基于LZW算法的连续色调的无损压缩格式.其压缩率一般在50%左右,它不属于任何应用程序.GIF格式可以存多幅彩色图像,如果把存于一个文件中的多幅图像数据逐幅读出并显示到屏幕上,就可构成一种最简

流畅web动画的十个法则

from me: web动画能够带来一个非常酷炫的效果,能够让页面有一个更好的用户体验.对于良好的动画性能没有高招,除了将大量的时间放在测试和优化,当然最重要的还是要易于维护. 流畅web动画的十大法则: · 不要改变除了opacity和transform之外的参数! · 将内容藏在不起眼的地方 · 不要同一时间所有元素都做动画 · 轻微地增加延迟,让编排动作变得简单_ · 使用全局倍数来设计慢动画 · 拍下你的UI,并且重放他们,以获取有价值的第三方关点. · 网络活动导致滞后 · 不要直接绑

性能更好的js动画实现方式&mdash;&mdash;requestAnimationFrame

用js来实现动画,我们一般是借助setTimeout或setInterval这两个函数,css3动画出来后,我们又可以使用css3来实现动画了,而且性能和流畅度也得到了很大的提升.但是css3动画还是有不少局限性,比如不是所有属性都能参与动画.动画缓动效果太少.无法完全控制动画过程等等.所以有的时候我们还是不得不使用setTimeout或setInterval的方式来实现动画,可是setTimeout和setInterval有着严重的性能问题,虽然某些现代浏览器对这两函个数进行了一些优化,但还是

移动web动画设计的一点心得——css3实现跑步

[原]移动web动画设计的一点心得——css3实现跑步 今年3月份,由于公司业务需要,我转岗到微信产品部,离开了TID团队,人都是有感情的动物,更何况在一个团队呆了快 3 年,心中十分舍不得,鬼哥说了“天下没有不散的宴席...”,在我的世界里又多了一次离别的伤感(虽然还在隔壁工作).加入了微信产品中心后,开始新的团队生活,工作比以前忙多了,有时周六也要上班,需要更快更高效的完成任务,除了重构页面,需要主动参与边缘外的工作,承担更多.最近比较忙,给自己敲个响钟:注意身体. 说完题外话,开始近期的主

Web动画:学习使用API

转载自http://www.w3cplus.com/animation/web-animations-learning-to-love-the-api.html 如果你使用过SVG,你应该知道可以使用SMIL给SVG添加动画.CSS Transitions和keyframes动画都可以操作CSS属性来添加动画.requestAnimationFrame() 使得浏览器可以在下一帧执行之前,请求一个动作. 但是每一中动画技术都不是完美的,各自有各自的问题. 现代浏览器正在逐步淘汰SMIL.Chro

Web动画API教程5:可爱的运动路径(Motion Path)

转载自http://www.w3cplus.com/css3/web-animations-api-tutorial-part-5-the-loveable-motion-path.html 终于.沿路径的动画,不再是SVG的专利! Motion Path:规范的当前方向 随着API规范已经制定好并且通过,运动路径motion path也先后出现了不同的形式.单方向最初看起来可能是Effect的形式(如上一篇中讨论的GroupEffect),但随后Motion Path作为一个CSS模块慢慢的一

Web页面布局方式小结

事实上,本文是在Peter Jerde的How much information can be stored by ordering 52 playing cards文章基础上翻译.改编和扩展而来的.当然这是经过Jerde本人首肯的. 注意本文方法并非最优,也没有完全利用所有的信息空间,只是简单的尝试. 有数字的地方就有信息.所以扑克牌中保存信息不是什么新鲜事. PDF文档点这里:下载 原文(英文)点这里:访问 这里有两个DEMO. 编码DEMO,解码DEMO 首先是"DEEP IN SHALL

web浏览器的方式登录vCenter Server

部署完成ESXI主机和vCenter Server之后,登录vCenter Server集中管理ESXI主机的方式有两种: 通过vSphere Client的方式登录vCenter.(需要安装vSphere Client软件) 通过vSphere Web Client的方式登录vCenter.(这种方式是VMware主推的方式) 简要记录一下vSphere Web Client方式登录vCenter的步骤: (1)打开web浏览器,输入vSphere Web Client的URL:https:/

在Tomcat中部署Web应用的方式

在Tomcat中部署Web应用的方式有以下几种: 利用Tomcat的自动部署 将一个Web应用复制到Tomcat的webapps下,系统将会把该应用部署到Tomcat中.这是最简单.最常用的方式. 利用控制台部署 启动Tomcat,在命令行执行窗口中,cd D:\Program Files\Java\apache-tomcat-8.0.23\bin,然后startup.bat 浏览器登录http://localhost:8080 进入Manager App控制台(需要在D:\Program Fi