Animated text loop: Lissajous curves

Whenever the user has to wait for a time-consuming process to end (eg. downloading a file or completing calculations), instead of displaying a boring 'please wait' message or a spinning circle, how about animating a glowing text?

Here's how it works (full code below):

Lines [1-6] set up the HTML5 Canvas.
[7] Set the blur - this is what makes the letters 'glow'.
[8] Reset the main counter.
[9] The text we want to display.

[11-25] The main animation loop:
[12] Clear the previous frame.
[13] For each letter:
[14] Calculate the auxiliary counter
[15-16] The x and y coordinates of the letter are calculated using a formula that calculates sine/cosine of the auxiliary counter (Lissajous curve around the center of the canvas).
Try playing with different values, I arrived at these using trial-and-error.
[17] The RGB color of the letter:
The Red component depends on the x coordinate.
The Green component is always zero.
The Blue component depends on the y coordinate.
This results in the following color map:



[18-19] apply the color to the letter and the shadow (blur).
[20] The size of the letter (font) depends on the x coordinate.
[21] Draw the letter.
[23] Increase the main counter.
[24] Request the next frame.
[26] Start!

<html>
<body bgcolor='black'>
<canvas id="myCanvaswidth="600height="400"></canvas>
<script>
let canvas = document.getElementById("myCanvas");
let context = canvas.getContext("2d");
context.shadowBlur = 20;
let counter = 0;
let text = 'Loading........';
 
function animate() {
  context.clearRect(00canvas.widthcanvas.height);
  for (let i = 0i < text.lengthi++) {
    let counter2 = counter / 10 + i;
    let x = canvas.width / 2 + 200 * Math.sin(counter2 / (Math.PI * 1.2));
    let y = canvas.height / 2 + 160 * Math.cos(counter2 / (Math.PI * 8));
    let color = `rgb(${Math.floor(x / 2)}, 0, ${Math.floor(y)})`;
    context.fillStyle = color;
    context.shadowColor = color;
    context.font = 'bold ' + x / 10 + 'px sans-serif';
    context.fillText(text.charAt(i), xy);
  }
  counter++;
  window.requestAnimationFrame(animate);
}
animate();
</script>
</body>
</html>





Check out these programming tutorials:

JavaScript:

Goldmine - idle game (~200 lines)

Tunnel run game (~170 lines)

Tower game (84 lines)

Optical illusion (18 lines)

Spinning squares - visual effect (25 lines)

Oldschool fire effect (20 lines)

Fireworks (60 lines)

Animated fractal (32 lines)

Physics engine for beginners

Physics engine - interactive sandbox

Physics engine - silly contraption

Starfield (21 lines)

Yin Yang with a twist (4 circles and 20 lines)

Tile map editor (70 lines)

Sine scroller (30 lines)

Interactive animated sprites

Image transition effect (16 lines)

Your first program in JavaScript: you need 5 minutes and a notepad


Fractals in Excel

Python in Blender 3d:

Domino effect (10 lines)


Wrecking ball effect (14 lines)

3d fractal in Blender Python




GitHub repo
All the code is provided under the MIT license