欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

canvas实现爱心和彩虹雨效果

程序员文章站 2022-05-12 23:23:36
效果图: 代码如下:

效果图:

canvas实现爱心和彩虹雨效果

代码如下:

<!doctype html>
 <html>
 <head>
 <meta charset="utf-8">
 <title></title>
 </head>
 <body>
 <canvas id="canvas"></canvas>
 <script>
 var canvas = document.getelementbyid('canvas'),
 ctx = canvas.getcontext('2d'),
 canvasw = canvas.width = window.innerwidth,
 canvash = canvas.height = window.innerheight,
 canvaswhalf = canvasw / 2,
 canvashhalf = canvash / 2,
 xoff = canvaswhalf - 306,
 yoff = 50,
 bg = '00061a',
 id = 0,
 raindrops = [],
 minsize = 1,
 maxsize = 4,
 minspeed = 5,
 maxspeed = 20,
 minhue = 0,
 maxhue = 360,
 maxamount = 50;
 function random(min, max) {
 if (arguments.length < 2) {
  max = min;
  min = 0;
 }
 return math.floor(math.random() * (max - min) + min);
 }
 function hextorgb(hex, opacity) {
 var rgb = '';
 hex.match(/.{2}/g).foreach(function(n) {
  rgb += (parseint(n, 16)) + ',';
 });
 return 'rgba(' + rgb + opacity + ')';
 }
 function draw() {
 // heart
 ctx.fillstyle = hextorgb(bg, '0.1');
 ctx.beginpath();
 // left half
 ctx.moveto(0, 0);
 ctx.lineto(canvaswhalf, 0);
 ctx.lineto(304 + xoff, 97 + yoff);
 ctx.beziercurveto(282 + xoff, -5 + yoff, 80 + xoff, -6 + yoff, 76 + xoff, 165 + yoff);
 ctx.beziercurveto(74 + xoff, 251 + yoff, 184 + xoff, 300 + yoff, 304 + xoff, 447 + yoff);
 ctx.lineto(canvaswhalf, canvash);
 ctx.lineto(0, canvash);
 // right half
 ctx.moveto(canvasw, 0);
 ctx.lineto(canvaswhalf, 0);
 ctx.lineto(304 + xoff, 97 + yoff);
 ctx.beziercurveto(326 + xoff, 5 + yoff, 528 + xoff, 6 + yoff, 532 + xoff, 165 + yoff);
 ctx.beziercurveto(534 + xoff, 251 + yoff, 424 + xoff, 300 + yoff, 304 + xoff, 447 + yoff);
 ctx.lineto(canvaswhalf, canvash);
 ctx.lineto(canvasw, canvash);
 ctx.closepath();
 ctx.fill();
 // raindrops
 for (var i = 1; i < id; i++) {
  raindrops[i].fall();
 };
 }
 var raindrop = function() {
 id++;
 this.y = random(-canvash);
 this.x = random(canvasw);
 this.size = random(minsize, maxsize);
 this.speed = random(minspeed, maxspeed);
 this.color = 'hsl(' + random(minhue, maxhue) + ',100%,55%)';
 this.origcolor = this.color;
 this.id = id;
 raindrops[id] = this;
 };
 raindrop.prototype.fall = function() {
 this.y += this.speed;
 if (this.y >= canvash) {
  this.y = random(-canvash);
  this.x = random(canvasw);
 }
 ctx.save();
 ctx.beginpath();
 var gradient = ctx.createradialgradient(this.x, this.y, 0, this.x, this.y, this.size);
 gradient.addcolorstop(0, '#fff');
 gradient.addcolorstop(0.5, this.color);
 gradient.addcolorstop(1, hextorgb(bg, 0));
 ctx.rect(this.x, this.y, this.size, maxspeed);
 ctx.fillstyle = gradient;
 ctx.fill();
 ctx.closepath();
 ctx.restore();
 };
 (function init() {
 ctx.fillstyle = '#' + bg;
 ctx.fillrect(0, 0, canvasw, canvash);
 for (var i = 0; i < maxamount; i++) {
  new raindrop();
 }
 }());
 function animate() {
 draw();
 window.requestanimationframe(animate);
 }
 window.requestanimationframe(animate);
 function mousetrail(x, y) {
 ctx.save();
 ctx.globalcompositeoperation = 'overlay';
 ctx.fillstyle = 'rgba(255,255,255,0.1)';
 ctx.arc(x, y, 50, 0, math.pi * 2);
 ctx.fill();
 ctx.restore();
 }
 window.addeventlistener('mousemove', function(cursor) {
 mousetrail(cursor.x, cursor.y);
 });
 </script>
 </body>
</html>

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!