前言
动画成果始终是人机交互的一个十分重要的局部,动画成果的引入,会让交互变得更加敌对,让用户取得更加愉悦的体验。而随着市场环境变动,手机性能越来越好,网速越来越快,以及用户视觉效果要求越来越高,作为一名网页开发者,动画也是一个必会的技能。由此本文和大家分享下动画方面的技术实践经验。
动画的造成
多张不同的图像连在一起就会变成了动静的图像。在网页端的世界里,浏览器在视觉暂留工夫内,连续不断的逐帧输入图像。每一帧输入一张图像,造成了用户视觉效果中的动画。那么怎么高效的通过一帧帧输入间断晦涩的动画,是有很多种动画技术能够都能够实现的。
动画技术
上面以当今支流的动画技术,分成四个局部给大家介绍下,别离为纯Css
、Lottie库
、Svga库
、Creatjs库
。
一、纯CSS
1.1 Animation
动画属性次要联合@keyframes
规定来创立动画。
上面以语音喇叭声稳定效为例:
两头的小圆点是始终存在的,第一条和第二条线都是1/4
的圆弧,别离距离0.2s
去循环显示暗藏。
.second { animation: fadeInOut 1s infinite 0.2s;}.third { animation: fadeInOut 1s infinite 0.4s;}@keyframes fadeInOut { 0% { opacity: 0; /*初始状态 透明度为0*/ } 100% { opacity: 1; /*结尾状态 透明度为1*/ }}
咱们个别用阶跃函数step
来做帧动画。
上面是linear
和step
的具体案例:
https://codepen.io/huihui/pen/ExPKbdj
学生成Sprite
图片,再挪动X
轴地位造成帧动画。
1.2 Transform
属性利用于元素的2D或3D转换。该属性容许咱们对元素进行旋转、缩放、歪斜、挪动、透视以及应用矩阵函数。别离为rotate
,scale
,skew
,translate
,perspective
以及matrix
。还能够通过transform-origin
用来确定中心点的地位为X、Y、Z
,默认值:50% 50% 0。
这里有个很好的例子来演示Transform
属性:https://c.runoob.com/codedemo/3391
上面以翻牌动效为例,次要是通过透视perspective
属性来实现:
要达到图中第一组翻牌
的成果。首先设置transform-style: preserve-3d
,使被转换的子元素保留其3D
转换。如果不加透视间隔perspective
,则会为第三组翻牌
中的成果,扁平没有Z
轴的立体感。其次增加了透视间隔后,如果Z
轴雷同,三个卡片是会有重叠的景象,如第二组翻牌
中的成果。最初特意给卡片一
加大了Z
轴间隔。这样通过透视,如果Z
轴间隔越大,卡片就看上去越小。能够用scale
放大了卡片一
。
.card-board{ perspective: 800;}.board-item-wrap1{ transform: scale(1.1) translateZ(-100px);}
提醒:个别用transform: translateZ(0)
,开启3D
引擎,触发GPU
减速,让网页动画更晦涩。
1.3 Transition
属性是用来设置动画过渡成果的,能够设置动画的过渡工夫和延迟时间。还能够增加动画函数animation-timing-function
,其默认值为ease
。可用贝塞尔曲线来做为动画速度曲线,举荐一个贝塞尔曲线的可视化网址:cubic-bezier,
以地图页的动画为例:
品牌岛屿的挪动成果用了ease
,因为前面的品牌须要含糊,设置了较晚含糊的贝塞尔曲线
transition: transform 1s ease,filter 1s cubic-bezier(.06,.45,.82,1.34);
https://cubic-bezier.com/#.06,.45,.82,1.34
1.4 Js
动画事件监听:
动画事件有:
animationstart - CSS动画开始后触发
animationiteration- CSS 动画反复播放时触发
animationend - CSS动画实现后触发
过渡事件有:
transitionend- 该事件在 CSS 实现过渡后触发。
留神:transitionend
存在个问题.如果transition
中,变换的属性有多个,就会触发屡次。比方如果同时设置宽高的过渡成果(transition:width:.2s,height:.2s),那么transitionend
事件就会触发2
次。
以2
秒隐没提示框为例:
动画完结2
秒后暗藏,用animationEnd
事件来监听。
兼容性:
下面4
个事件都存在兼容性问题,在Android5
下或Ios9.3
下都须要加webkit
前缀能力兼容,例如animationstart
事件在Android5
下须要用webkitAnimationStart
。
兼容性这块自己封装了插件jdyfe-eventployfill,原理是用createElement
创立一个元素然而不插入页面Dom
,查找style
中是否有动画事件,来作为webkit
的兼容判断
应用办法
import { janimationstart, janimationiteration, janimationend, jtransitionend } from'jdyfe-eventPloyfill' ... dom.addEventListener(janimationstart, ()=>{}) dom.addEventListener(janimationiteration, ()=>{}) dom.addEventListener(janimationend, ()=>{}) dom.addEventListener(jtransitionend, ()=>{}) ...
二、Lottie
airbnb
提供的开源动画库Lottie
反对多版本,
React Native
,web
和iOS
,Android
版本用矢量图导出。
在浏览器中生成的是
svg
标签,不会失真
案例为:
https://codepen.io/airnan/pen/MPmQQB
var svgContainer = document.getElementById('svgContainer')var animItem = bodymovin.loadAnimation({ wrapper: svgContainer,//div的id animType: 'svg' loop: true, path: 'https://labs.nearpod.com/bodymovin/demo/markus/halloween/markus.json'})
更多Lottie
案例:https://codepen.io/collection/nVYWZR/
Lottie
还和京东的JDReact
框架联合,推出了JDLottieLoadingView
和JDLottieView
组件。其中JDLottieLoadingView
次要是显示加载中的动效,会默认援用loading
动画款式。JDLottieView
是Lottie
在JDReact
上的封装,用法不变。
案例代码如下:
<JDLottieLoadingView autoSize={false} source={"loading.json"}/><JDLottieView autoPlay={true} autoSize={true} style={{width: 100, backgroundColor: 'black'}} source={require('./animations/LottieWalkthrough')} progress={0} loop={true}/>
三、Svga
SVGA 是一种跨平台的开源动画格局,集成 svga player 之后可间接应用,装置svgaplayerweb
包即可,
反对多版本,兼容
iOS
/Android
/Flutter
/Web
多个平台的动画格局反对位图和矢量图
在浏览器中生成的是
canvas
标签
案例代码如下:
import * as SVGA from 'svgaplayerweb'function AniSvga(props) { useEffect(() => { var player = new SVGA.Player('#demoCanvas1') var parser = new SVGA.Parser('#demoCanvas1') // Must Provide same selector eg:#demoCanvas IF support IE6+ parser.load('./plugin/mengniu.svga', function(videoItem) { player.setVideoItem(videoItem) player.startAnimation() }) return ()=>{ player.clear() } }, []) return ( <div className="jdyfe-svgaPage"> <div id="demoCanvas1" ></div> </div> )}export default AniSvga
svga
在线预览:https://svga.io/svga-preview.html
某些Android
操作系统短少Blob
反对,所以须要自行添加Blob Polyfill
。
<script src="//cdn.bootcss.com/blob-polyfill/1.0.20150320/Blob.min.js"></script>
四、Createjs
CreateJS
是基于HTML5
开发的一套模块化的工具库。
基于这些库,能够十分快捷地开发出基于HTML5
的游戏、动画和交互利用。
4.1 EaselJS
EaselJS
提供了JavaScript
库,可轻松操作HTML5 Canvas
元素。
能够绘制Stage舞台、Container容器和Sprite精灵的大小地位等,还提供很多事件能够做交互,很适宜纯互动游戏制作。
精灵能够用TexturePacker
软件来生成雪碧图,导出Createjs
的json
文件。
4.2 TweenJs
TweenJs
次要是调整动画属性,例如
target.alpha = 1createjs.Tween.get(target).wait(500).to({alpha:0, visible:false}, 1000).call(handleComplete)function handleComplete() { //突变实现执行}
这个突变将会先期待0.5秒,突变指标的alpha属性从0到1,并且visible属性从true变为false,这个过程用时1秒,最初调用handleComplete函数。
4.3 SoundJs
SoundJs
次要用来加载解决音频的。
暂停,复原 声音
管制声音的音量,静音
监听声音实例中的事件,如实现,循环,或失败事件
createjs.Sound.alternateExtensions = ["mp3"] createjs.Sound.on("fileload", this.loadHandler, this) createjs.Sound.registerSound("path/to/mySound.ogg", "sound") function loadHandler(event) { // 这会引发针对每个已注册的声音。 var instance = createjs.Sound.play("sound") // 施展应用ID。也能够应用残缺的源门路或event.src。 instance.on("complete", this.handleComplete, this) instance.volume = 0.5 }
4.4 PreloadJS
PreloadJS
是一个用来治理和协调相干资源加载的类库,它能够帮忙你事后加载相干资源。比照本人写监听load
事件来确认实现加载,PreloadJS
更不便,并且反对预加载多种类型的数据,例如:图片、文件、音频、数据等等。PreloadJS
次要是用URL. createObjectURL
创立了Blob
对象,而后赋值给URL,移除的时候用 URL.revokeObjectURL
办法移除Blob
对象。所以会在network
中看到Blob
对象。
import createjs from 'jdyfe-createjs'const loader = new createjs.LoadQueue(true)loader.loadManifest([bgAry[0], ...imgAry])loader.on('complete', function () { console.log('complete')//全副加载实现})loader.on('fileload', function (e) { console.log('fileload---', e.target.progress)//进度条})
案例
createjs
官网不反对npm
形式应用,咱们用webpack
从新打包生成了一个umd
模块jdyfe-createjs,可供大家下载和应用。
上面案例蕴含了下面说的4
个模块,也用到了jdyfe-createjs
,具体可看:Belly跑步案例
Happy coding .. :)
相干链接
https://developer.mozilla.org/en-US/docs/Web/API/Animation/play
http://www.createjs.cc/src/docs/tweenjs/classes/CSSPlugin.html
原文地址