A small recreation of this image - http://subliming.tumblr.com/post/141090555494
A Pen by Tim Holman on CodePen.
| <canvas class="the-canvas"></canvas> |
| var canvas = document.querySelector('.the-canvas'); | |
| var context = canvas.getContext('2d'); | |
| var ratio = window.devicePixelRatio || 1; | |
| var totalLineHeight = 680; | |
| var totalLines = 4; | |
| var totalDiff = totalLineHeight / totalLines; | |
| var fontHeight = 60 * ratio - 50; // Small centering | |
| var smallestWidth = 280; // width of smallest line; | |
| var offsetX = 12; | |
| var offsetY = 6; | |
| var iterations; | |
| var verticalAlign, line1Diff, line2Diff, line3Diff, line4Diff, iterations, iteration, animationFrame; | |
| var startRGB = [255, 255, 255]; | |
| var endRGB = [220, 165, 163]; | |
| var fullColorSet = []; | |
| init(); | |
| function init() { | |
| // Cancel any already running animations | |
| cancelAnimationFrame(animationFrame); | |
| // Set the canvas width and height | |
| canvas.width = window.innerWidth * ratio; | |
| canvas.height = window.innerHeight * ratio; | |
| // Set the canvas font properties | |
| context.font = '180px Montserrat'; | |
| context.textAlign = 'center'; | |
| context.fillStyle = '#fff'; | |
| context.strokeStyle = "#F0A5A3"; | |
| context.lineWidth = "3"; | |
| context.textBaseline = "middle"; | |
| // Centering of the text | |
| verticalAlign = (window.innerHeight / 2 * ratio) - totalLineHeight / 2; | |
| line1Diff = totalLineHeight + fontHeight - totalDiff; | |
| line2Diff = totalLineHeight + fontHeight - totalDiff * 2; | |
| line3Diff = totalLineHeight + fontHeight - totalDiff * 3; | |
| line4Diff = totalLineHeight + fontHeight - totalDiff * 4; | |
| // How many iterations will we go through? | |
| iterations = Math.floor(((window.innerWidth * ratio / 2) - (smallestWidth * ratio / 2)) / offsetX + 5); | |
| prepareColorSets(iterations); | |
| iteration = 0; | |
| animationFrame = requestAnimationFrame(draw); | |
| } | |
| // Draw loop | |
| function draw() { | |
| context.clearRect(0, 0, canvas.width, canvas.height); | |
| for( var i = iterations - 1; i > 0; i-- ) { | |
| context.fillStyle = 'rgb(' + fullColorSet[i][0] + ',' + fullColorSet[i][1] + ',' + fullColorSet[i][2] + ')'; | |
| var x = window.innerWidth / 2 * ratio - i * offsetX; | |
| var y = verticalAlign + i * offsetY + (Math.sin(i + iteration) * 2); | |
| drawText( x, y ); | |
| } | |
| iteration += 0.1; | |
| animationFrame = requestAnimationFrame(draw); | |
| } | |
| // Draw the single lines of text. | |
| function drawText(x, y) { | |
| context.fillText("THE ONE", x, y + line4Diff); | |
| context.strokeText("THE ONE", x, y + line4Diff); | |
| context.fillText("YOU ARE", x, y + line3Diff); | |
| context.strokeText("YOU ARE", x, y + line3Diff); | |
| context.fillText("LOOKING FOR", x, y + line2Diff); | |
| context.strokeText("LOOKING FOR", x, y + line2Diff); | |
| context.fillText("IS YOU", x, y + line1Diff); | |
| context.strokeText("IS YOU", x, y + line1Diff); | |
| } | |
| // We do this so we don't have to calculate these EVERY loop. | |
| function prepareColorSets(iterations) { | |
| fullColorSet = []; | |
| for( var i = 0; i < iterations; i++ ) { | |
| fullColorSet.push(colourGradientor(1 - i / iterations, startRGB, endRGB)); | |
| } | |
| } | |
| // THNX - http://stackoverflow.com/questions/14482226/how-can-i-get-the-color-halfway-between-two-colors | |
| function colourGradientor(p, rgb_beginning, rgb_end){ | |
| var w = p * 2 - 1; | |
| var w1 = (w + 1) / 2.0; | |
| var w2 = 1 - w1; | |
| var rgb = [parseInt(rgb_beginning[0] * w1 + rgb_end[0] * w2), | |
| parseInt(rgb_beginning[1] * w1 + rgb_end[1] * w2), | |
| parseInt(rgb_beginning[2] * w1 + rgb_end[2] * w2)]; | |
| return rgb; | |
| }; | |
| window.onresize = init; |
| @import url('https://fonts.googleapis.com/css?family=Montserrat:700'); | |
| html, body { | |
| margin: 0px; | |
| width: 100%; | |
| height: 100%; | |
| min-height: 100%; | |
| min-width: 100%; | |
| overflow: hidden; | |
| } | |
| canvas { | |
| width: 100%; | |
| height: 100%; | |
| background: #F3BE4E; | |
| } |
A small recreation of this image - http://subliming.tumblr.com/post/141090555494
A Pen by Tim Holman on CodePen.