canvas立体多彩水滴落下动画效果代码
代码语言:html
所属分类:动画
代码描述:canvas立体多彩水滴落下动画效果代码
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
<!DOCTYPE html> <html lang="en" > <head> <meta charset="UTF-8"> <style> body { font-family: Arial, Helvetica, "Liberation Sans", FreeSans, sans-serif; background-color: #000; margin: 0; padding: 0; border-width: 0; overflow: hidden; cursor: pointer; } </style> </head> <body> <script > "use strict"; let canv, ctx; // canvas and context let maxx, maxy; // canvas dimensions let drops; // for animation let messages; // shortcuts for Math. const mrandom = Math.random; const mfloor = Math.floor; const mround = Math.round; const mceil = Math.ceil; const mabs = Math.abs; const mmin = Math.min; const mmax = Math.max; const mPI = Math.PI; const mPIS2 = Math.PI / 2; const mPIS3 = Math.PI / 3; const m2PI = Math.PI * 2; const m2PIS3 = Math.PI * 2 / 3; const msin = Math.sin; const mcos = Math.cos; const matan2 = Math.atan2; const mhypot = Math.hypot; const msqrt = Math.sqrt; //------------------------------------------------------------------------ function alea(mini, maxi) { // random number in given range if (typeof maxi == "undefined") return mini * mrandom(); // range 0..mini return mini + mrandom() * (maxi - mini); // range mini..maxi } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - function intAlea(mini, maxi) { // random integer in given range (mini..maxi - 1 or 0..mini - 1) // if (typeof maxi == "undefined") return mfloor(mini * mrandom()); // range 0..mini - 1 return mini + mfloor(mrandom() * (maxi - mini)); // range mini .. maxi - 1 } //------------------------------------------------------------------------ class Drop { constructor(Ysize) { this.Ysize = Ysize; this.createPath(); const duration = 300; this.speed = Ysize / duration; // will move its own length in this number of ms this.start(performance.now()); this.Ypos = alea(maxy); // random initial position } start(t) { this.Xaxis = alea(maxx); this.tInit = t; this.Ypos = -this.Ysize - 1; // initial position } createPath() { const alpha = mPI / 6; const c = mcos(alpha); const s = msin(alpha); const path = this.path = new Path2D(); const r = 0.2 * this.Ysize; const lc = this.Ysize - r; const l0 = 0.4 * lc; const l1 = 0.1 * lc; const x1 = r * c; const y1 = lc - r * s; const bx1 = x1 - l1 * s; const by1 = y1 - l1 * c; path.moveTo(0, 0); path.bezierCurveTo(0, l0, bx1, by1, x1, y1); path.arc(0, lc, r, -alpha, mPI + alpha); path.bezierCurveTo(-bx1, by1, 0, l0, 0, 0); path.closePath(); const gr = this.gr = ctx.createLinearGradient(-r, 0, +r, 0); const hue = intAlea(360); const sat = alea(40, 100); gr.addColorStop(0, `hsl(${hue} ${sat}% 30%)`); gr.addColorStop(0.5, `hsl(${hue} ${sat}% 50%)`); gr.addColorStop(1, `hsl(${hue} ${sat}% 70%)`); } // Drop.createPath draw() { ctx.save(); ctx.translate(this.X.........完整代码请登录后点击上方下载按钮下载查看
网友评论0