Sonic.js 是一个很小的 JavaScript 类,用于创建基于 HTML5 画布的加载图像。更强大的是 Sonic.js 还提供了基于现成的例子的创建工具,可以帮助你实现更多自定义的(Loading)加载动画效果。
实现的代码。
html代码:
var loaders = [ { 100, height: 50, padding: 10, stepsPerFrame: 2, trailLength: 1, pointDistance: .03, strokeColor: '#FF7B24', step: 'fader', multiplier: 2, setup: function () { this._.lineWidth = 5; }, path: [ ['arc', 10, 10, 10, -270, -90], ['bezier', 10, 0, 40, 20, 20, 0, 30, 20], ['arc', 40, 10, 10, 90, -90], ['bezier', 40, 0, 10, 20, 30, 0, 20, 20] ] }, { 30, height: 30, stepsPerFrame: 2, trailLength: .3, pointDistance: .1, padding: 10, fillColor: '#D4FF00', strokeColor: '#FFF', setup: function () { this._.lineWidth = 20; }, path: [ ['line', 0, 0, 30, 0], ['line', 30, 0, 30, 30], ['line', 30, 30, 0, 30], ['line', 0, 30, 0, 0] ] }, { 100, height: 100, stepsPerFrame: 1, trailLength: 1, pointDistance: .025, strokeColor: '#05E2FF', fps: 20, setup: function () { this._.lineWidth = 2; }, step: function (point, index) { var cx = this.padding + 50, cy = this.padding + 50, _ = this._, angle = (Math.PI / 180) * (point.progress * 360); this._.globalAlpha = Math.max(.5, this.alpha); _.beginPath(); _.moveTo(point.x, point.y); _.lineTo( (Math.cos(angle) * 35) + cx, (Math.sin(angle) * 35) + cy ); _.closePath(); _.stroke(); _.beginPath(); _.moveTo( (Math.cos(-angle) * 32) + cx, (Math.sin(-angle) * 32) + cy ); _.lineTo( (Math.cos(-angle) * 27) + cx, (Math.sin(-angle) * 27) + cy ); _.closePath(); _.stroke(); }, path: [ ['arc', 50, 50, 40, 0, 360] ] }, { 100, height: 50, stepsPerFrame: 1, trailLength: 1, pointDistance: .1, fps: 15, padding: 10, //step: 'fader', fillColor: '#FF2E82', setup: function () { this._.lineWidth = 20; }, path: [ ['line', 0, 20, 100, 20], ['line', 100, 20, 0, 20] ] }, { 100, height: 100, stepsPerFrame: 7, trailLength: .7, pointDistance: .01, fps: 30, setup: function () { this._.lineWidth = 10; }, path: [ ['line', 20, 70, 50, 20], ['line', 50, 20, 80, 70], ['line', 80, 70, 20, 70] ] }, { 100, height: 100, stepsPerFrame: 4, trailLength: 1, pointDistance: .01, fps: 25, fillColor: '#FF7B24', setup: function () { this._.lineWidth = 10; }, step: function (point, i, f) { var progress = point.progress, degAngle = 360 * progress, angle = Math.PI / 180 * degAngle, angleB = Math.PI / 180 * (degAngle - 180), size = i * 5; this._.fillRect( Math.cos(angle) * 25 + (50 - size / 2), Math.sin(angle) * 15 + (50 - size / 2), size, size ); this._.fillStyle = '#63D3FF'; this._.fillRect( Math.cos(angleB) * 15 + (50 - size / 2), Math.sin(angleB) * 25 + (50 - size / 2), size, size ); if (point.progress == 1) { this._.globalAlpha = f < .5 ? 1 - f : f; this._.fillStyle = '#EEE'; this._.beginPath(); this._.arc(50, 50, 5, 0, 360, 0); this._.closePath(); this._.fill(); } }, path: [ ['line', 40, 10, 60, 90] ] }, { 100, height: 100, stepsPerFrame: 3, trailLength: 1, pointDistance: .01, fps: 30, step: 'fader', strokeColor: '#D4FF00', setup: function () { this._.lineWidth = 6; }, path: [ ['arc', 50, 50, 20, 360, 0] ] }, { 100, height: 100, stepsPerFrame: 1, trailLength: 1, pointDistance: .02, fps: 30, fillColor: '#05E2FF', step: function (point, index) { this._.beginPath(); this._.moveTo(point.x, point.y); this._.arc(point.x, point.y, index * 7, 0, Math.PI * 2, false); this._.closePath(); this._.fill(); }, path: [ ['arc', 50, 50, 30, 0, 360] ] }, { 100, height: 100, stepsPerFrame: 1, trailLength: 1, pointDistance: .05, strokeColor: '#FF2E82', fps: 20, setup: function () { this._.lineWidth = 4; }, step: function (point, index) { var cx = this.padding + 50, cy = this.padding + 50, _ = this._, angle = (Math.PI / 180) * (point.progress * 360), innerRadius = index === 1 ? 10 : 25; _.beginPath(); _.moveTo(point.x, point.y); _.lineTo( (Math.cos(angle) * innerRadius) + cx, (Math.sin(angle) * innerRadius) + cy ); _.closePath(); _.stroke(); }, path: [ ['arc', 50, 50, 40, 0, 360] ] } ]; var d, a, container = document.getElementById('in'); for (var i = -1, l = loaders.length; ++i < l; ) { d = document.createElement('div'); d.className = 'l'; a = new Sonic(loaders[i]); d.appendChild(a.canvas); container.appendChild(d); a.canvas.style.marginTop = (150 - a.fullHeight) / 2 + 'px'; a.canvas.style.marginLeft = (150 - a.fullWidth) / 2 + 'px'; a.play(); }