You Might Also Like
Big Wordmark Footer — Free HTML CSS JS Oversized Brand Name Footer
Big Wordmark Footer · Footers · Plain HTML, CSS & JS · Live preview
What's included
Features
About this UI Snippet
Big Wordmark Footer — A Gradient Spotlight Painted Through Text

An oversized brand wordmark as the last thing on the page is a closing statement more than a navigational element — the kind of moment agency and portfolio sites use to leave a visitor with one clear impression of the name before they leave. This snippet adds a second layer to that idea: the wordmark's gradient fill follows the cursor, so the giant letters catch light exactly like brushed metal or glass would under a moving spotlight.
Cutting a gradient into the shape of the text
The core technique is background-clip: text (with the -webkit- prefix for Safari) combined with color: transparent. Instead of colouring the text directly, .bwf-word paints a radial-gradient across its own background, then that background is clipped to exactly the shape of the letters — so what you see is the gradient showing through cut-out type, not a solid colour. Because the fill is a gradient rather than a flat colour, the letters can have a bright, glinting centre and a dark falloff at the edges, the same way real light behaves on a curved or reflective surface.
The gradient's centre is a variable, not a fixed value
The radial-gradient's position is var(--mx, 50%) var(--my, 20%) — two CSS custom properties with sensible defaults so the wordmark still looks intentional before any pointer interaction happens. A pointermove handler on the footer converts the cursor's position within the wordmark's bounding box into 0–100% fractions and writes them straight to those two custom properties. Because the gradient itself references the variables, updating two numbers is enough to move the entire highlight — there's no need to regenerate or replace the gradient string on every move.
A CSS transition, not a per-frame loop
transition: background-position .3s ease on .bwf-word smooths every custom-property update the JS makes, so despite the JavaScript only ever setting raw values with no easing logic of its own, the visual result glides rather than snapping. This is the same "let CSS interpolate, let JS just set the target" division of labour used throughout the snippet library's pointer-driven effects — the browser's transition engine already does the interpolation work, so there's nothing to reimplement in requestAnimationFrame.
Resting state, and why it's off-centre
On pointerleave, the custom properties reset to 50% 20% — horizontally centred, but with the highlight sitting slightly above true vertical centre. A perfectly centred glow at rest looks static and slightly clinical; nudging it upward gives the wordmark a subtle top-lit quality even when nobody's pointer is anywhere near it, so the resting state doesn't look like a bug waiting for interaction to "fix" it.
Build with AI
Build, Understand, Optimize, and Extend It With AI
Paste this snippet's HTML, CSS, and JS into an AI coding assistant like Claude and ask it to explain exactly how background-clip: text combined with color: transparent produces the cut-out effect, and why a radial-gradient specifically (rather than a linear one) is what sells the "light catching the surface" illusion here. It's also worth asking about the touch-device fallback: since pointermove never fires from a static tap, confirm the default gradient position genuinely looks complete and intentional on mobile rather than like a half-finished desktop effect. For extending it, ask for a version where the gradient's colour stops shift based on scroll position (so the wordmark's mood changes as the user approaches the footer), or one that adds a second, offset gradient layer behind the text for a subtle chromatic-aberration effect on hover.
Prompt to recreate it
Copy this into your AI assistant of choice to build the effect from scratch, or as a jumping-off point for your own variant:
Build a website footer centred around one oversized brand wordmark with a pointer-tracked gradient sheen, in plain HTML, CSS, and vanilla JavaScript — no canvas, no library.
Requirements:
- A footer with a top row (a handful of navigation links plus a "Start a project" call-to-action with an arrow that shifts on hover), a huge centred brand wordmark in the middle, and a bottom row (copyright plus a few social text links).
- The wordmark should use a fluid font-size via clamp() so it scales from roughly 64px on mobile up to over 200px on very wide screens, with tight letter-spacing and a bold weight.
- Fill the wordmark's text using background-clip: text (with the -webkit- prefix) and color: transparent, where the background is a radial-gradient with a bright near-white centre fading through a mid brand colour to a dark edge — positioned at CSS custom properties (e.g. var(--mx, 50%) var(--my, 20%)) rather than a fixed position, so the gradient's centre point can be moved via JavaScript without rewriting the gradient string.
- Add a pointermove listener on the footer that converts the cursor's position within the wordmark's bounding box into 0-100% x/y fractions and writes them to those two custom properties, so the gradient's highlight visually follows the cursor across the letters.
- On pointerleave, reset the custom properties to their default resting values (centred horizontally, slightly above vertical centre) rather than removing them.
- Apply a CSS transition to background-position on the wordmark so the highlight glides between positions instead of snapping, and add a prefers-reduced-motion query that removes that transition for users who have it enabled.Want to tighten it up first? Run this prompt through the AI Prompt Studio to score it across 8 quality dimensions, catch anti-patterns, and tune the wording for Claude, ChatGPT, or Gemini before you paste it in.
Step by step
How to Use
- 1Paste HTML, CSS, and JSA huge, gradient-filled brand wordmark renders with a soft highlight sitting slightly above centre.
- 2Move the pointer over the footerThe gradient's highlight follows the cursor across the wordmark, brightening whichever letters are nearest.
- 3Leave the footerThe highlight eases back to its default resting position rather than snapping.
- 4Replace the wordmark textChange the text inside #bwfWord to your own brand name — the clamp() font-size keeps it responsive automatically.
- 5Tune the gradient coloursEdit the radial-gradient stops in .bwf-word to match your brand palette, keeping a bright centre and a darker falloff for the light-catching effect.
- 6Export in your formatClick HTML, JSX, or Tailwind to download the version you need.
Real-world uses
Common Use Cases
Got questions?
Frequently Asked Questions
background-clip: text (with the -webkit- prefix for broader support) clips an element's background to exactly the shape of its text glyphs, while color: transparent hides the text's own fill so only the clipped background shows through. The result is a gradient visible only where the letters are.
The custom properties --mx and --my feed directly into the radial-gradient's position, and a CSS transition on background-position handles all the easing. This division of labour — JavaScript sets the target value, CSS interpolates toward it — avoids a manual requestAnimationFrame loop entirely.
The default position (50% 20%) sits the highlight slightly above true centre so the wordmark reads as top-lit even with no pointer nearby, rather than looking flat or like it's waiting for something to happen.
The gradient position updates on pointermove, which does not fire from a static touch, so on mobile the wordmark simply displays at its default resting gradient position — a fully legible, intentional-looking static state rather than a broken interactive one.
Yes — background-clip: text works with any CSS background value, including linear-gradient, conic-gradient, or even a background-image. A radial gradient was chosen here because its circular falloff most convincingly mimics a moving light source.
Click JSX, Vue, or Angular to download the converted component. Attach the pointermove and pointerleave handlers via a ref to the footer element and write the custom properties directly to the wordmark's ref, avoiding a state update (and re-render) on every pointer move.