LED Matrix Display
Red-orange Courier text wrapped in a four-layer glow that breathes every 1.5 s, on a black panel sprinkled with a fine dot grid: the look of an illuminated display.
Updated
This effect is part of Effect.Labs — 840 vanilla effects, some free, some premium. Distortion has 31 effects, including 5 free. Explore the category →
3 usage examples



How it works
The .ledm-panel (280 px wide, #0a0a0a background, #1a1a1a border, 12 px corners) holds two elements: a .ledm-dots grid of white dots at 3% opacity every 6 px, and the .ledm-text. The text is not drawn with dots: it is bold Courier, spaced by 6 px, and its glow comes from shadows.
The glow stacks four text-shadow layers: two in the text colour (7 and 20 px blur), a middle #c20 layer at 40 px and a far #910 one at 80 px. The ledmPulse animation widens them over 0.75 s (10, 30, 60 and 100 px, the first turning #f40) then tightens them again: the display seems to breathe.
Several .ledm-text in one panel stack as lines (the panel is a column), giving a timetable or a multi-line score with a single root. Every glow colour is a variable; they can also be changed on a single line, since a variable set on an element applies to that element only.
The root centres the panel in at least 300 px of height on a #0a0a0f background; --ledm-height: auto, --ledm-bg: transparent and --ledm-width (100% or auto) adapt it to your layout. No JavaScript.
Accessibility
- Screen readers: the text is real text, read as is; the dot grid carries
aria-hidden="true". For a changing score, addaria-live="polite"to the line, as in the game example. - Reduced motion: under
prefers-reduced-motion: reduce, the pulse stops and the glow stays at its resting size. Before the repair, the animation kept running. - Flashing: the pulse only changes the width of the glow, very slowly (1.5 s); frame by frame, no cell goes above the threshold.
- Contrast:
#f30on#0a0a0agives a ratio of about 5.4:1, enough for 28 px text. The glow thickens the strokes: keep at least 14 to 16 px and some letter spacing on small text. - Text size: at 16 px, the far glow (80 px) spills from one line to the next; set
--ledm-glow-fartotransparentfor a multi-line board, as in the coach station example.
Browser compatibility
Pure CSS (2.4 KB), no dependency: four animated text-shadow layers, a repeating radial gradient for the dots, CSS variables, inset. Measured in Chromium 151, Firefox 153 and WebKit 26.5: pixel-identical to the previous version at 0, 40, 75 and 500 ms, two copies, no overflow at 390 px, 0 errors.
Without inset (Chrome 49 to 86, Safari 9.1 to 14), the dot grid has no size and disappears; the text and its glow show normally. Without CSS variables, the text stays visible in the page's colours, with no glow.
The code
HTML structure to paste into your page (the CSS + JS come with your purchase):
<div class="fx-0275-root">
<div class="ledm-panel">
<div class="ledm-dots" aria-hidden="true"></div>
<div class="ledm-text">12:45</div>
</div>
</div>
One-time payment, no subscription — the code is yours forever
Customize
Options passed to the API or data-* attributes:
| Option / property | Default | Effect |
|---|---|---|
Text (HTML — .ledm-text, one per line) |
12:45 | Time, score, word or board: each .ledm-text added to the panel makes one more line. |
--ledm-color · --ledm-peak |
#f30 · #f40 | Text and close glow colour, and close glow at the peak of the pulse. Green: #3f6 · #4f7. |
--ledm-glow · --ledm-glow-far |
#c20 · #910 | Middle and far glow; green: #1c4 · #083. transparent on the far one for tight text. |
--ledm-size · --ledm-spacing |
28px · 6px | Letter size and spacing. Keep the spacing at about 1/5 of the size. |
--ledm-width |
280px | Panel width; auto to fit the text, 100% for all the room. |
--ledm-panel |
#0a0a0a | Panel background, behind the dot grid. |
--ledm-speed |
1.5s | Length of one breath of the glow; 3s for a calmer sign. |
--ledm-bg · --ledm-height |
#0a0a0f · 300px | Root background and minimum height; transparent and auto to blend it in. |
FAQ
font-family of .ledm-text.white-space: pre to .ledm-text so the browser does not merge those spaces.textContent from your script; the glow and the pulse apply to the new text straight away. Add aria-live="polite" if the value should be announced, and avoid updating it more than once per second.