Wobbling Ball With Canvas
copy // same as yesterday but with canvas instead of svg const canvas = document.createElement ( 'canvas' ) , c = canvas.getContext ( '2d' ) ; document.body .appendChild ( canvas) ; document.body .style .margin = 0 ; let w = window.innerWidth , h = window.innerHeight , x = w / 2 , y = h / 2 , vx = vy = dx = dy = 0 , damp = 0.99 , div = 8 , ticks = 0 , wobbleChance = 0.03 , startTick = 50 ; function loop( ) { w = window.innerWidth ; h = window.innerHeight ; radius = w * 0.05 ; diam = radius * 2 ; diam2x = diam * 2 ; if ( x > w) { vx *= - 1 ; dx *= - 1 ; x = w; } else if ( x < 0 ) { vx *= - 1 ; dx *= - 1 ; x = 0 ; } if ( y > h) { vy *= - 1 ; dy *= - 1 ; y = h; } else if ( y < 0 ) { vy *= - 1 ; dy *= - 1 ; y = 0 } if ( Math .random ( ) < wobbleChance || ticks === startTick) { dx += Math .random ( ) * 10 - 5 ; dy += Math .random ( ) * 10 - 5 ; } dx *= damp; dy *= damp; vx += ( dx - vx) / div; vy += ( dy - vy) / div; x += vx; y += vy; // in most cases these days you // just clear the whole canvas, but for // this example we clear a rectangle around // the circle c.clearRect ( x - diam, y - diam, diam2x, diam2x ) ; // draw the path c.fillStyle = 'red' c.beginPath ( ) ; c.arc ( x, y, radius, 0 , Math .PI * 2 , false ) ; c.fill ( ) ; ticks++; window.requestAnimationFrame ( loop) ; } loop( ) ; function resize( ) { canvas.width = window.innerWidth ; canvas.height = window.innerHeight ; } resize( ) ; window.addEventListener ( 'resize' , resize) ;
Try it out…
A wobbling ball with canvas.
Wobbling Ball with SVG
copy const el = document.body .appendChild ( document.createElement ( 'div' ) ) ; el.innerHTML = ` < svg width= "100%" height= "100%" > < circle id= "circ" cx= "0" cy= "0" r= "50" fill= "red" style= "will-change: transform;" /> </ svg> < style> svg, div, body, html { overflow: visible; height: 100 %; width: 100 %; margin: 0 ; padding: 0 ; } </ style> `; let w = window.innerWidth , h = window.innerHeight , x = w / 2 , y = h / 2 , vx = vy = dx = dy = 0 , damp = 0.99 , div = 8 , ticks = 0 , wobbleChance = 0.03 , startTick = 50 ; function loop( ) { w = window.innerWidth ; h = window.innerHeight ; if ( x > w) { vx *= - 1 ; dx *= - 1 ; x = w; } else if ( x < 0 ) { vx *= - 1 ; dx *= - 1 ; x = 0 ; } if ( y > h) { vy *= - 1 ; dy *= - 1 ; y = h; } else if ( y < 0 ) { vy *= - 1 ; dy *= - 1 ; y = 0 } if ( Math .random ( ) < wobbleChance || ticks === startTick) { dx += Math .random ( ) * 10 - 5 ; dy += Math .random ( ) * 10 - 5 ; } dx *= damp; dy *= damp; vx += ( dx - vx) / div; vy += ( dy - vy) / div; x += vx; y += vy; circ.setAttribute ( 'transform' , `translate( ${ x} ${ y} ) `) ; ticks++; window.requestAnimationFrame ( loop) ; } loop( ) ; function resize( ) { const radius = Math .min ( w, h) * .05; // `window.circ` is the global id (⌐■_■) circ.r .baseVal .value = radius; } resize( ) ; window.addEventListener ( 'resize' , resize) ;
Try it out…
A wobbling ball with svg.
Quick SVG
copy const el = document.body .appendChild ( document.createElement ( 'div' ) ) ; el.innerHTML = `< svg style= 'overlow:visible' > < circle cx= "100" cy= "20" r= "20" fill= "red" /> < rect x= "100" y= "60" width= "20" height= "20" fill= "blue" /> </ svg> `;
Try it out…
Defining SVG like this in a template string is a fast and powerful way to start doing SVG that is controlled or generated by JavaScript. Here is another example:
copy const scribble = document.body .appendChild ( document.createElement ( 'div' ) ) ; const d = ( iter = 30 ) => { // make sure the iter is odd if ( iter % 2 == 0 ) iter += 1 ; // random cubic beziér let path = 'M ' ; for ( let i = 0 ; i < iter; i++ ) { const cmd = i == 1 ? 'C ' : ' ' path += cmd + Math .random ( ) * 200 + ' ' + Math .random ( ) * 200 ; } return path + 'z' ; } scribble.innerHTML = `< svg style= 'overlow:visible' viewBox= "0 0 200 200" > < path d= "${d()}" stroke= "#295896" stroke- width= "3" fill= "#ccc" fill- rule= "even-odd" vector- effect= "non-scaling-stroke" /> </ svg> < style> svg, div, body, html { overflow: visible; height: 100 %; width: 100 %; margin: 0 ; padding: 0 ; } </ style> `;
Try it out…
You’ll notice a somewhat hacky style tag as well… this is used to quickly fill the page with the SVG.