本项目是移动端单页
点击打开梦幻动画H5单页
流程
播放音乐
判断浏览器类型,如果禁止自动播放音乐就点击播放
随机初始化气泡位置以及气泡大小
使用 requestAnimationFrame
创建气泡上浮动画
监听气泡是否超出视口
渲染文字
隐藏首屏logo
更换背景
引用 typed.js
实现文字打印效果
随机创建流星和落叶,使用 requestAnimationFrame
创建动画
requestAnimationFrame
简介
由于 setTimeout
和 setInterval
的不精准问题,促使了 requestAnimationFrame
的诞生。
requestAnimationFrame
是专门为实现高性能的帧动画而设计的一个API,目前已在多个浏览器得到了支持,你可以把它用在 DOM 上的效果切换或者 Canvas 画布动画中。
requestAnimationFrame
并不是定时器,但和 setTimeout
很相似,在没有 requestAnimationFrame
的浏览器一般都是用 setTimeout
模拟。
requestAnimationFrame
跟屏幕刷新同步(大多数是 60Hz )。如果浏览器支持 requestAnimationFrame
, 则不建议使用 setTimeout 来做动画。
requestAnimationFrame
的兼容使用
下面是我们常规使用 requestAnimationFrame
的兼容写法,当浏览器不兼容的 requestAnimationFrame
时则通过使用 setTimeout
来模拟实现,且设定渲染间隔为 1000ms/60
。
1 2 3 4 5 6 7 8 9 10
| window.requestAnimFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function(callback) { window.setTimeout(callback, 1000 / 30); };
|
demo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
| <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>认识Canvas</title> </head> <body> <canvas id="canvas" width="500" height="500" style="border: 1px solid #33"></canvas> <script> var canvas = document.getElementById('canvas'); var context = canvas.getContext('2d'); window.requestAnimFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function(callback) { window.setTimeout(callback, 1000 / 30); };
var circle = { x: 250, y: 250, radius: 50, direction: 'right', move: function() { if (this.direction === 'right') { if (this.x <= 430) { this.x += 5; } else { this.direction = 'left'; } } else { if (this.x >= 60) { this.x -= 5; } else { this.direction = 'right'; } } }, draw: function() { context.beginPath(); context.arc(this.x, this.y, this.radius, 0, 2 * Math.PI, false); context.fillStyle = '#00c09b'; context.fill(); } } function animate() { circle.move(); context.clearRect(0, 0, canvas.width, canvas.height); circle.draw(); requestAnimationFrame(animate); }
circle.draw(); animate(); </script> </body> </html>
|
本项目参考腾讯课堂-【Next特训班】第五期 梦幻动画 DIY 直播课