代码
<! DOCTYPE html >
< html lang = " en" > < head> < meta charset = " UTF-8" > < title> Canvas 绘制一个❤</ title> < link rel = " shortcut icon" href = " ../../assets/images/icon/favicon.ico" type = " image/x-icon" > < style> html,body { height : 100%; padding : 0; margin : 0; } canvas { position : absolute; width : 100%; height : 100%; } </ style>
</ head> < body> < canvas id = " pinkboard" > Canvas Not Support</ canvas> < script> var settings = { particles : { length : 500 , duration : 2 , velocity : 100 , effect : - 0.75 , size : 30 , } , } ; ( function ( ) { var b = 0 ; var c = [ "ms" , "moz" , "webkit" , "o" ] ; for ( var a = 0 ; a < c. length && ! window. requestAnimationFrame; ++ a) { window. requestAnimationFrame = window[ c[ a] + "RequestAnimationFrame" ] ; window. cancelAnimationFrame = window[ c[ a] + "CancelAnimationFrame" ] || window[ c[ a] + "CancelRequestAnimationFrame" ] } if ( ! window. requestAnimationFrame) { window. requestAnimationFrame = function ( h, e ) { var d = new Date ( ) . getTime ( ) ; var f = Math. max ( 0 , 16 - ( d - b) ) ; var g = window. setTimeout ( function ( ) { h ( d + f) } , f) ; b = d + f; return g } } if ( ! window. cancelAnimationFrame) { window. cancelAnimationFrame = function ( d ) { clearTimeout ( d) } } } ( ) ) ; var Point = ( function ( ) { function Point ( x, y ) { this . x = ( typeof x !== 'undefined' ) ? x : 0 ; this . y = ( typeof y !== 'undefined' ) ? y : 0 ; } Point . prototype. clone = function ( ) { return new Point ( this . x, this . y) ; } ; Point . prototype. length = function ( length ) { if ( typeof length == 'undefined' ) return Math. sqrt ( this . x * this . x + this . y * this . y) ; this . normalize ( ) ; this . x *= length; this . y *= length; return this ; } ; Point . prototype. normalize = function ( ) { var length = this . length ( ) ; this . x /= length; this . y /= length; return this ; } ; return Point; } ) ( ) ; var Particle = ( function ( ) { function Particle ( ) { this . position = new Point ( ) ; this . velocity = new Point ( ) ; this . acceleration = new Point ( ) ; this . age = 0 ; } Particle . prototype. initialize = function ( x, y, dx, dy ) { this . position. x = x; this . position. y = y; this . velocity. x = dx; this . velocity. y = dy; this . acceleration. x = dx * settings. particles. effect; this . acceleration. y = dy * settings. particles. effect; this . age = 0 ; } ; Particle . prototype. update = function ( deltaTime ) { this . position. x += this . velocity. x * deltaTime; this . position. y += this . velocity. y * deltaTime; this . velocity. x += this . acceleration. x * deltaTime; this . velocity. y += this . acceleration. y * deltaTime; this . age += deltaTime; } ; Particle . prototype. draw = function ( context, image ) { function ease ( t ) { return ( -- t) * t * t + 1 ; } var size = image. width * ease ( this . age / settings. particles. duration) ; context. globalAlpha = 1 - this . age / settings. particles. duration; context. drawImage ( image, this . position. x - size / 2 , this . position. y - size / 2 , size, size) ; } ; return Particle; } ) ( ) ; var ParticlePool = ( function ( ) { var particles, firstActive = 0 , firstFree = 0 , duration = settings. particles. duration; function ParticlePool ( length ) { particles = new Array ( length) ; for ( var i = 0 ; i < particles. length; i++ ) particles[ i] = new Particle ( ) ; } ParticlePool . prototype. add = function ( x, y, dx, dy ) { particles[ firstFree] . initialize ( x, y, dx, dy) ; firstFree++ ; if ( firstFree == particles. length) firstFree = 0 ; if ( firstActive == firstFree) firstActive++ ; if ( firstActive == particles. length) firstActive = 0 ; } ; ParticlePool . prototype. update = function ( deltaTime ) { var i; if ( firstActive < firstFree) { for ( i = firstActive; i < firstFree; i++ ) particles[ i] . update ( deltaTime) ; } if ( firstFree < firstActive) { for ( i = firstActive; i < particles. length; i++ ) particles[ i] . update ( deltaTime) ; for ( i = 0 ; i < firstFree; i++ ) particles[ i] . update ( deltaTime) ; } while ( particles[ firstActive] . age >= duration && firstActive != firstFree) { firstActive++ ; if ( firstActive == particles. length) firstActive = 0 ; } } ; ParticlePool . prototype. draw = function ( context, image ) { if ( firstActive < firstFree) { for ( i = firstActive; i < firstFree; i++ ) particles[ i] . draw ( context, image) ; } if ( firstFree < firstActive) { for ( i = firstActive; i < particles. length; i++ ) particles[ i] . draw ( context, image) ; for ( i = 0 ; i < firstFree; i++ ) particles[ i] . draw ( context, image) ; } } ; return ParticlePool; } ) ( ) ; ( function ( canvas ) { var context = canvas. getContext ( '2d' ) , particles = new ParticlePool ( settings. particles. length) , particleRate = settings. particles. length / settings. particles. duration, time; function pointOnHeart ( t ) { return new Point ( 160 * Math. pow ( Math. sin ( t) , 3 ) , 130 * Math. cos ( t) - 50 * Math. cos ( 2 * t) - 20 * Math. cos ( 3 * t) - 10 * Math. cos ( 4 * t) + 25 ) ; } var image = ( function ( ) { var canvas = document. createElement ( 'canvas' ) , context = canvas. getContext ( '2d' ) ; canvas. width = settings. particles. size; canvas. height = settings. particles. size; function to ( t ) { var point = pointOnHeart ( t) ; point. x = settings. particles. size / 2 + point. x * settings. particles. size / 350 ; point. y = settings. particles. size / 2 - point. y * settings. particles. size / 350 ; return point; } context. beginPath ( ) ; var t = - Math. PI ; var point = to ( t) ; context. moveTo ( point. x, point. y) ; while ( t < Math. PI ) { t += 0.01 ; point = to ( t) ; context. lineTo ( point. x, point. y) ; } context. closePath ( ) ; context. fillStyle = '#ea80b0' ; context. fill ( ) ; var image = new Image ( ) ; image. src = canvas. toDataURL ( ) ; return image; } ) ( ) ; function render ( ) { requestAnimationFrame ( render) ; var newTime = new Date ( ) . getTime ( ) / 1000 , deltaTime = newTime - ( time || newTime) ; time = newTime; context. clearRect ( 0 , 0 , canvas. width, canvas. height) ; var amount = particleRate * deltaTime; for ( var i = 0 ; i < amount; i++ ) { var pos = pointOnHeart ( Math. PI - 2 * Math. PI * Math. random ( ) ) ; var dir = pos. clone ( ) . length ( settings. particles. velocity) ; particles. add ( canvas. width / 2 + pos. x, canvas. height / 2 - pos. y, dir. x, - dir. y) ; } particles. update ( deltaTime) ; particles. draw ( context, image) ; } function onResize ( ) { canvas. width = canvas. clientWidth; canvas. height = canvas. clientHeight; } window. onresize = onResize; setTimeout ( function ( ) { onResize ( ) ; render ( ) ; } , 10 ) ; } ) ( document. getElementById ( 'pinkboard' ) ) ; </ script>
</ body> </ html>