最近在水果公众号上看到一段菊花绽开的动画,丝般光滑的感触,吹弹可破的花瓣,让我忍不住看了下到底,将所得整顿了下,作为小技巧分享给大家。
具体看下图,视频转换成 GIF 品质降落,有趣味能够去水果公号看。
水果绽开动画
瞄了下源代码,竟然是用 SVG 动画拼成的序列帧。序列帧是什么?水果前端为什么好好的 GIF 图不必,要用序列帧?起因听我缓缓道来。
什么是序列帧?
序列帧就是一系列静止图像,将这些图像依照肯定的频率播放,就造成了间断的动画,个别认为到达到每秒 24 帧的速率,人们才会看到平滑动画,大家平时看到的视频和动图实质都是由序列帧组成的。
电影画面中序列帧
翻页动画
应用序列帧有什么益处?
- 能够保障图片品质 因为公众号后盾会压缩上传的 GIF 图片,而且 GIF 图像自身对透明度反对不佳,对图像品质要求较高的场景就不适合了。而应用序列帧,咱们能够应用无损的 PNG 图片,保障动画高清显示。
- 动画更平滑 绝对于 GIF 动画,程序控制的动画用户体验更加平滑晦涩。
怎么应用序列帧?
在平时的 web 开发中,咱们能够很容易地用 js 或者 css 实现相似的帧动画,因为公众号图文环境的限度,咱们只能用 SVG 来实现这个成果,水果公号里用 animate 标签奇妙的解决这个问题。
通过把每一帧的图片独自放在一层里,并使每一层重叠在一起。应用透明度动画来管制每个图片帧的呈现工夫,产生间断播放的动画成果。
绽开动画的序列帧叠加演示
<div style="height:0;">
<svg opacity="0" viewBox="0 0 828 828" style="width:100%;background-image:url('img/02.png');background-size:100% auto;background-repeat:none;transform:rotateZ(0deg);">
<animate attributename="opacity" begin="1.3125s" dur="6.25s" values="1; 1; 0; 0;" keytimes="0; 0.010; 0.012; 1" fill="freeze"></animate>
</svg>
</div>
<div style="height:0;">
<svg opacity="0" viewBox="0 0 828 828" style="width:100%;background-image:url('img/01.png');background-size:100% auto;background-repeat:none;transform:rotateZ(0deg);">
<animate attributename="opacity" begin="1.25s" dur="6.25s" values="1; 1; 0; 0;" keytimes="0; 0.010; 0.012; 1" fill="freeze"></animate>
</svg>
</div>
原理懂了,可是动画整整有 70 多帧,复制黏贴显然不适宜我这样(lan)机智的前端,于是拿出了看家本领 javascript 大法。
const generateFrames = () => {const container = document.querySelector('#container')
const totalFrames = 72
let html = ''
for(let i = totalFrames; i > 0; i--) {
const inter = 0.0625
const height = i == 1 ? 'auto' : '0px'
const opacity = i == 1 ? 1 : 0;
const begin = (1.5 + inter * i) + 's'
const dom = `
<div token interpolation">${height};">
<svg opacity="${opacity}" viewBox="0 0 828 828" token interpolation">${i}.png');background-size:100% auto;background-repeat:none;transform:rotateZ(0deg);">
<animate attributename="opacity" begin="${begin}" dur="6.25s" values="1; 1; 0; 0;" keytimes="0; 0.010; 0.012; 1" fill="freeze"></animate>
</svg>
</div>
`
html += dom
}
container.innerHTML = html
}
generateFrames()
将生成的代码,在开发者工具中复制黏贴。
chrome 开发者工具中复制黏贴
搞定,出工!
源码:
https://dev.xingway.com/tutor…
原文地址:
https://dev.xingway.com/svg-f…