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;
}