Few graphic visual effects in cinema history are as instantly recognizable as the green "digital rain" from the 1999 sci-fi classic The Matrix. Designed by production designer Simon Whiteley, the cascading streams of green characters represent the underlying code structure of a virtual reality simulation.
In modern web development, recreate this iconic visual effect in real time using vanilla JavaScript and the HTML5 <canvas> API. In this deep-dive article, we examine the underlying mechanics of how digital rain is programmed.
To render falling columns of text, the canvas is divided into vertical columns based on font size. If a browser window is 1920 pixels wide and font size is 15 pixels, the screen contains 128 distinct columns.
A single drops array tracks the vertical Y-position of the lead falling character in each column:
const cols = Math.floor(canvas.width / 15);
const drops = [];
for (let i = 0; i < cols; i++) {
drops[i] = Math.random() * -100;
}
The secret to achieving glowing, smooth motion trails without screen clearing flicker lies in how the canvas background is updated on each animation frame. Instead of using clearRect(), the script draws a semi-transparent black rectangle over the canvas on every loop iteration:
ctx.fillStyle = 'rgba(0, 0, 0, 0.1)'; ctx.fillRect(0, 0, canvas.width, canvas.height);
Because the black fill has an alpha opacity of only 0.1 (10%), existing green characters gradually fade over 10 to 15 animation frames, creating natural glowing motion tails behind every falling character.
On each frame loop triggered by requestAnimationFrame, a random character (Latin letters, Japanese Katakana glyphs, numbers, or math symbols) is picked and drawn at the column position:
ctx.fillStyle = '#0F0';
ctx.font = '15px monospace';
for (let i = 0; i < drops.length; i++) {
const char = characters.charAt(Math.floor(Math.random() * characters.length));
ctx.fillText(char, i * 15, drops[i] * 15);
if (drops[i] * 15 > canvas.height && Math.random() > 0.975) {
drops[i] = 0;
}
drops[i]++;
}
Test out our high-framerate HTML5 digital rain engine on our Matrix Code Rain Terminal Page.
By combining basic grid math, array mapping, and continuous opacity fading, web developers create an infinite, fluid digital rain visual effect using fewer than 40 lines of JavaScript code.