jQuery canvas水晶光圈圆环旋转动画特效

源码:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title>canvas水晶光圈圆环旋转动画特效</title>
		<style>
			html, body {
			  margin: 0;
			  overflow: hidden;
			  background: #151a28;
			}
			
			canvas {
			  display: block;
			  position: absolute;
			  top: 50%;
			  left: 50%;
			  transform: translateX(-50%) translateY(-50%);
			}
		</style>

	</head>
	<body>
		<div></div>
		<script type="text/javascript" src="js/jquery.js" ></script><!--jquery版本1.10.2以上-->
		<script>

			(function() {
			  var ctx, w, h, cx, cy, PI, PI_HALF, cos, sin, random, lineWidth, C, 
			      rings, ringsLength, data;
			  ctx = document.createElement('canvas').getContext('2d');
			  w = 600;
			  h = 600;
			  cx = (w / 2);
			  cy = (h / 2);
			  rings = [];
			  ringsLength = 0;
			  PI = Math.PI;
			  PI_HALF = PI / 2;
			  cos = Math.cos;
			  sin = Math.sin;
			  random = Math.random;
			  lineWidth = 0.2;
			  C = ["#ABF8FF", "#E76B76", "#1D2439", "#4F3762", "#67F9FF", "#0C0F18"];
			  data = [
			    /* ring {t:total_particles, r:radius, d:distance, s:speed, c:color} */
			    [
			      	{t:80, r:(cx-10), d:40, s:30, c:C[1]},
			      	{t:60, r:(cx-20), d:40, s:80, c:C[2]},
			      	{t:20, r:(cx-30), d:20, s:80, c:C[2]},
			    ],
			    [
			    	{t:80, r:(cx-80),  d:40, s:40, c:C[4]},
			       	{t:80, r:(cx-90),  d:20, s:40, c:C[4]},
			       	{t:20, r:(cx-100), d:20, s:40, c:C[2]},
			       	{t:40, r:(cx-110), d:20, s:40, c:C[2]},
			    ],
			    [
			    	{t:60, r:(cx-160), d:40, s:20, c:C[2]},
			       	{t:20, r:(cx-170), d:30, s:60, c:C[2]},
			       	{t:40, r:(cx-180), d:40, s:60, c:C[2]},
			    ],
			    [
			    	{t:40, r:(cx-230), d:40, s:20, c:C[5]},
			       	{t:20, r:(cx-240), d:20, s:10, c:C[5]},
			    ],
			    [
			       	{t:10, r:(cx-290), d:10, s:10, c:C[4]}
			    ]
			  ];
			  /* */
			  ctx.canvas.width = w;
			  ctx.canvas.height = h;
			  document.body.appendChild(ctx.canvas);
			  data.forEach(function(group) {
			    var ring = [];
			    group.forEach(function(orbit, i) {
			      var total_particles, index;
			      total_particles = orbit.t;
			      index = 0;
			      for (; index < total_particles; index++) {
			        var radius, distance, speed, color, opacity;
			        radius = orbit.r;
			        distance = orbit.d;
			        speed = random() / orbit.s;
			        speed = i % 2 ? speed : speed * -1;
			        color = orbit.c;
			        opacity = orbit.o;
			        ring.push(new P(radius, distance, speed, color, opacity));
			        radius = distance = speed = color = opacity = null;
			      }
			    });
			    rings.push(ring);
			  });
			  ringsLength = rings.length;
			  /* */
			  function P(radius, distance, speed, color) {
			    this.a = PI / 180;
			    this.d = distance;
			    this.d2 = (this.d * this.d);
			    this.x = cx + radius * cos(this.a);
			    this.y = cy + radius * sin(this.a);
			    this.c = color;
			    this.r = (random() * 8);
			    this.R = random() > 0.5 ? radius : radius - 5;
			    this.s = speed;
			    this.pos = random() * 360;
			  }
			  function draw() {
			    var i, j, k, xd, yd, d, ring, ringLength, ringLength2, particle, p2;
			    ctx.beginPath();
			    ctx.globalCompositeOperation = "source-over";
			    ctx.rect(0, 0 , w, h);
			    ctx.fillStyle = "#151a28";
			    ctx.fill();
			    ctx.closePath();
			    for (i = 0; i < ringsLength; i++) {
			      ring = rings[i];
			      ringLength = ring.length;
			      ringLength2 = ringLength - 100;
			      for (j = 0; j < ringLength; j++) {
			        particle = ring[j];
			        particle.x = cx + particle.R * sin(PI_HALF + particle.pos);
			        particle.y = cy + particle.R * cos(PI_HALF + particle.pos);
			        particle.pos += particle.s;
			        ctx.beginPath();
			        ctx.globalAlpha = 0.12;
			        ctx.globalCompositeOperation = "lighter";
			        ctx.fillStyle = particle.c;
			        ctx.arc(particle.x, particle.y, particle.r, PI * 2, false);
			        ctx.fill();
			        ctx.closePath();
			        for (k = 0; k < ringLength2; k++) {
			          p2 = ring[k];
			          yd = p2.y - particle.y;
			          xd = p2.x - particle.x;
			          d = ((xd * xd) + (yd * yd));
			          if (d < particle.d2) {
			            ctx.beginPath();
			            ctx.globalAlpha = 1;
			            ctx.lineWidth = lineWidth;
			            ctx.moveTo(particle.x, particle.y);
			            ctx.lineTo(p2.x, p2.y);
			            ctx.strokeStyle = p2.c;
			            ctx.stroke();
			            ctx.closePath();
			          }
			        }
			      }
			    }
			  }
			  function loop() {
			    draw();
			    requestAnimationFrame(loop);
			  }
			  loop();
			})();
		</script>
	</body>
</html>

效果图:

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值