html
<!DOCTYPE html>
<html lang="en" >
<head><meta charset="UTF-8"><title>CodePen - Spaceworm</title><script>
window.requestAnimFrame = (function() {return (window.requestAnimationFrame ||window.webkitRequestAnimationFrame ||window.mozRequestAnimationFrame ||window.oRequestAnimationFrame ||window.msRequestAnimationFrame ||function(callback) {window.setTimeout(callback);});
});function init(elemid) {let canvas = document.getElementById(elemid),c = canvas.getContext("2d"),w = (canvas.width = window.innerWidth),h = (canvas.height = window.innerHeight);c.fillStyle = "rgba(30,30,30,1)";c.fillRect(0, 0, w, h);return {c:c,canvas:canvas};
}
</script><link rel="stylesheet" href="css/style.css"></head>
<body><canvas id="canvas"></canvas><script src="js/script.js"></script></body>
</html>
js
window.onload = function () {class segm {constructor(x, y, l) {this.b = Math.random()*1.9+0.1;this.x0 = x;this.y0 = y;this.a = Math.random() * 2 * Math.PI;this.x1 = this.x0 + l * Math.cos(this.a);this.y1 = this.y0 + l * Math.sin(this.a);this.l = l;}update(x, y) {this.x0 = x;this.y0 = y;this.a = Math.atan2(this.y1 - this.y0, this.x1 - this.x0);this.x1 = this.x0 + this.l * Math.cos(this.a);this.y1 = this.y0 + this.l * Math.sin(this.a);}}class rope {constructor(tx, ty, l, b, slq) {this.res = l / slq;this.l = l;this.segm = [];this.segm.push(new segm(tx, ty, this.l / this.res));for (let i = 1; i < this.res; i++) {this.segm.push(new segm(this.segm[i - 1].x1, this.segm[i - 1].y1, this.l / this.res));}this.b = b;}update(t) {this.segm[0].update(t.x, t.y);for (let i = 1; i < this.res; i++) {this.segm[i].update(this.segm[i - 1].x1, this.segm[i - 1].y1);}}show(t) {if(t == "l"){c.beginPath();for (let i = 0; i < this.segm.length; i++) {c.lineTo(this.segm[i].x0, this.segm[i].y0);}c.lineTo(this.segm[this.segm.length - 1].x1,this.segm[this.segm.length - 1].y1);c.strokeStyle = "white";c.lineWidth = this.b;c.stroke();c.beginPath();c.arc(this.segm[0].x0, this.segm[0].y0, 1, 0, 2 * Math.PI);c.fillStyle = "white";c.fill();c.beginPath();c.arc(this.segm[this.segm.length - 1].x1,this.segm[this.segm.length - 1].y1,2,0,2 * Math.PI);c.fillStyle = "white";c.fill();}else{for (let i = 0; i < this.segm.length; i++) {c.beginPath();c.arc(this.segm[i].x0, this.segm[i].y0, this.segm[i].b, 0, 2*Math.PI);c.fillStyle = "white";c.fill();}c.beginPath();c.arc(this.segm[this.segm.length - 1].x1,this.segm[this.segm.length - 1].y1,2, 0, 2*Math.PI);c.fillStyle = "white";c.fill();}}}let c = init("canvas").c,canvas = init("canvas").canvas,w = (canvas.width = window.innerWidth),h = (canvas.height = window.innerHeight),ropes = [];let nameOfVariable = "value",mouse = {},last_mouse = {},rl = 50,randl = [],target = { x: w/2, y: h/2 },last_target = {},t = 0,q = 10,da = [],type = "l";for (let i = 0; i < 100; i++) {ropes.push(new rope(w / 2,h / 2,(Math.random() * 1 + 0.5) * 500,Math.random() * 0.4 + 0.1,Math.random()*15+5));randl.push(Math.random() * 2 - 1);da.push(0);}function draw() {if (mouse.x) {target.errx = mouse.x - target.x;target.erry = mouse.y - target.y;} else {target.errx =w / 2 +(h / 2 - q) *Math.sqrt(2) *Math.cos(t) /(Math.pow(Math.sin(t), 2) + 1) -target.x;target.erry =h / 2 +(h / 2 - q) *Math.sqrt(2) *Math.cos(t) *Math.sin(t) /(Math.pow(Math.sin(t), 2) + 1) -target.y;}target.x += target.errx / 10;target.y += target.erry / 10;t += 0.01;for (let i = 0; i < ropes.length; i++) {if (randl[i] > 0) {da[i] += (1 - randl[i]) / 10;} else {da[i] += (-1 - randl[i]) / 10;}ropes[i].update({x:target.x +randl[i] * rl * Math.cos((i * 2 * Math.PI) / ropes.length + da[i]),y:target.y +randl[i] * rl * Math.sin((i * 2 * Math.PI) / ropes.length + da[i])});if(randl[i] > -0.5){type = "l";}else{type = "o";}ropes[i].show(type);}last_target.x = target.x;last_target.y = target.y;}canvas.addEventListener("mousemove",function (e) {last_mouse.x = mouse.x;last_mouse.y = mouse.y;mouse.x = e.pageX - this.offsetLeft;mouse.y = e.pageY - this.offsetTop;},false);canvas.addEventListener("mouseleave", function(e) {mouse.x = false;mouse.y = false;});function loop() {window.requestAnimFrame(loop);c.clearRect(0, 0, w, h);draw();}window.addEventListener("resize", function () {(w = canvas.width = window.innerWidth),(h = canvas.height = window.innerHeight);loop();});loop();setInterval(loop, 1000 / 60);
};
css
body,
html {margin: 0px;padding: 0px;position: fixed;background: rgb(30, 30, 30);cursor: none;
}