JavaScript.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. 
  2. var c1 = document.getElementById('c1'),
  3. ctx1 = c1.getContext('2d'),
  4. c2 = document.getElementById('c2'),
  5. ctx2 = c2.getContext('2d'),
  6. twopi = Math.PI * 2,
  7. parts = [],
  8. sizeBase,
  9. cw,
  10. opt,
  11. hue,
  12. count;
  13. function rand(min, max) {
  14. return Math.random() * (max - min) + min;
  15. }
  16. function hsla(h, s, l, a) {
  17. return 'hsla(' + h + ',' + s + '%,' + l + '%,' + a + ')';
  18. }
  19. function create() {
  20. sizeBase = cw + ch;
  21. count = Math.floor(sizeBase * 0.3),
  22. hue = rand(0, 360),
  23. opt = {
  24. radiusMin: 1,
  25. radiusMax: sizeBase * 0.04,
  26. blurMin: 10,
  27. blurMax: sizeBase * 0.04,
  28. hueMin: hue,
  29. hueMax: hue + 100,
  30. saturationMin: 10,
  31. saturationMax: 70,
  32. lightnessMin: 20,
  33. lightnessMax: 50,
  34. alphaMin: 0.1,
  35. alphaMax: 0.5
  36. }
  37. ctx1.clearRect(0, 0, cw, ch);
  38. ctx1.globalCompositeOperation = 'lighter';
  39. while (count--) {
  40. var radius = rand(opt.radiusMin, opt.radiusMax),
  41. blur = rand(opt.blurMin, opt.blurMax),
  42. x = rand(0, cw),
  43. y = rand(0, ch),
  44. hue = rand(opt.hueMin, opt.hueMax),
  45. saturation = rand(opt.saturationMin, opt.saturationMax),
  46. lightness = rand(opt.lightnessMin, opt.lightnessMax),
  47. alpha = rand(opt.alphaMin, opt.alphaMax);
  48. ctx1.shadowColor = hsla(hue, saturation, lightness, alpha);
  49. ctx1.shadowBlur = blur;
  50. ctx1.beginPath();
  51. ctx1.arc(x, y, radius, 0, twopi);
  52. ctx1.closePath();
  53. ctx1.fill();
  54. }
  55. parts.length = 0;
  56. for (var i = 0; i < Math.floor((cw + ch) * 0.03); i++) {
  57. parts.push({
  58. radius: rand(1, sizeBase * 0.03),
  59. x: rand(0, cw),
  60. y: rand(0, ch),
  61. angle: rand(0, twopi),
  62. vel: rand(0.1, 0.5),
  63. tick: rand(0, 10000)
  64. });
  65. }
  66. }
  67. function init() {
  68. resize();
  69. create();
  70. loop();
  71. }
  72. function loop() {
  73. requestAnimationFrame(loop);
  74. ctx2.clearRect(0, 0, cw, ch);
  75. ctx2.globalCompositeOperation = 'source-over';
  76. ctx2.shadowBlur = 0;
  77. ctx2.drawImage(c1, 0, 0);
  78. ctx2.globalCompositeOperation = 'lighter';
  79. var i = parts.length;
  80. ctx2.shadowBlur = 15;
  81. ctx2.shadowColor = '#fff';
  82. while (i--) {
  83. var part = parts[i];
  84. part.x += Math.cos(part.angle) * part.vel;
  85. part.y += Math.sin(part.angle) * part.vel;
  86. part.angle += rand(-0.05, 0.05);
  87. ctx2.beginPath();
  88. ctx2.arc(part.x, part.y, part.radius, 0, twopi);
  89. ctx2.fillStyle = hsla(0, 0, 100, 0.075 + Math.cos(part.tick * 0.02) * 0.05);
  90. ctx2.fill();
  91. if (part.x - part.radius > cw) { part.x = -part.radius }
  92. if (part.x + part.radius < 0) { part.x = cw + part.radius }
  93. if (part.y - part.radius > ch) { part.y = -part.radius }
  94. if (part.y + part.radius < 0) { part.y = ch + part.radius }
  95. part.tick++;
  96. }
  97. }
  98. function resize() {
  99. cw = c1.width = c2.width = window.innerWidth,
  100. ch = c1.height = c2.height = window.innerHeight;
  101. create();
  102. }
  103. function click() {
  104. create()
  105. }
  106. window.addEventListener('resize', resize);
  107. window.addEventListener('click', click);
  108. init();