抽奖动画 - 播放svga动画
svga动画
本文介绍的动画不是css,js动画,是使用插件播放svga文件。
1.需求
UI同学在做一个春节活动,活动中需要有个开场动画,原本想的简单,不涉及接口调用逻辑,就直接用做一个gif图片由前端来显示就好了,但是这个gif做出来之后图片太大了,页面加载慢,如下图1
gif图片还有一个问题,透明部分会显示成黑色,不符合预期。再者就是这个图片太大了,有1.3M。
后来UI同学换了一种格式,apng动画,APNG(Animated Portable Network Graphics)诞生于2004年,是PNG的位图动画扩展。可以简单地理解为PNG格式的动画版。但是UI同学做出来文件体积更大了,这个文件有2.9M,如下图2
最后UI同学尝试使用svga动画,这种格式动画体积小,只有33kb,但是有个问题svga文件不能在浏览器中直接播放,需要引用第三方插件,就诞生了这个需求。
2.思路
说是思路,其实就是使用svga插件来播放这个动画文件,官方已经有说明文档,只要照着这个文档来写就可以实现。
3.实现过程
这个项目是使用svelte来实现的,这个框架和vue有些类似,这里不展开说明,只介绍如何实现这个播放功能。
3.1 canvas容器
svga播放使用canvas容器来播放,html代码如下图:
<!-- svga播放器 -->
<canvas class="{['play-canvas', className].join(' ')}" on:click={onClick} bind:this={svgaCanvasEl}></canvas>
3.2 播放器
初始化播放器参考官方文档照葫芦画瓢了,代码如下:
<script>
import { onMount, onDestroy, createEventDispatcher } from 'svelte'
import { Parser, Player } from 'svga'
import {regExp} from '@/shared/internal/constants'
//事件转发
const dispatch = createEventDispatcher()
//svg容器
let svgaCanvasEl = null
//svg播放器
let player = null
//解析
let parser = null
//组件样式
export let className = ''
//svga图片地址
export let svgaUrl = ''
//暴露svga动画配置
export let playerConfig = {
loop: 0, //循环次数,默认值 0(无限循环)
}
//样式
export { className as class }
const initSvgAnimation = async () => {
if (svgaUrl) {
try {
if (!regExp.svgaSuffix.test(svgaUrl)) {
throw 'inaccurate file format'
}
parser = new Parser()
const svga = await parser.load(svgaUrl)
player = new Player({
container: svgaCanvasEl,
fillMode: 'backwards', // 最后停留的目标模式,默认值 forwards
playMode: 'forwards', //播放顺序顺序播放
loop: 1,
startFrame: 0,
endFrame: svga.frames,
isUseIntersectionObserver: false,
isCacheFrames: false,
...playerConfig
})
await player.mount(svga)
player.onStart = () => console.log('svg play onStart')
player.onResume = () => console.log('svg play onResume')
player.onPause = () => console.log('svg play onPause')
player.onStop = () => console.log('svg play onStop')
player.onProcess = () => {}
player.onEnd = () => console.log('onEnd')
await player.start()
} catch (e) {
console.error('svg play error:', e)
}
}
}
function onClick() {
dispatch('click')
}
onMount(() => {
initSvgAnimation()
})
onDestroy(() => {
// 清空动画
player && player.clear() && player.destroy()
// 销毁
parser && parser.destroy()
})
</script>
3.3调用方式
调用方式如下:
<SvgaPlayer svgaUrl={popUpImg} playerConfig={playerConfig} class={"pageload-pop-svg"}></SvgaPlayer>
注意传入两个参数中第一个是svga文件地址,可以是本地或者远程cdn地址,第二个参数playerConfig是播放配置,覆盖默认配置,参考官方文档。
最后效果如下:
参考:
https://baijiahao.baidu.com/s?id=1681715610129777960&wfr=spider&for=pc
https://github.com/svga/SVGAPlayer-Web-Lite
作者:Tyler Ning
出处:http://www.cnblogs.com/tylerdonet/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,如有问题,请微信联系冬天里的一把火
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
2014-01-13 easyui学习笔记3—在展开行内的增删改操作