Scroll Progress Fill

Interactive & Advanced · Animated · pure CSS

Hollow stroked glyphs flood with color as you scroll — the headline doubles as a reading-progress meter, its fill level rising 0% to 100% in lock-step with the page via an anonymous scroll(nearest) timeline. A soft glow rides the moving waterline; static previews and non-supporting browsers show the finished, fully-flooded frame.

Scroll Progress Fill

How it works

Scroll Progress Fill is an animated interactive & advanced text effect rendered entirely in CSS. It is driven by a scroll-linked animation timeline.

Controls

Scroll Progress Fill exposes 3 dedicated controls — Fill Hue, Stroke and Direction — on top of the shared type controls (font, weight, letter-spacing and case). Open it in the generator to tune every value live, then copy the updated CSS.

CSS

/* Scroll Progress Fill — made with TEXT-FX · https://text-fx.app
 * HTML: uses scroll-driven animation.
 * Font: 'Syne', sans-serif (load from Google Fonts).
 */

.text-effect {
  font-family: 'Syne', sans-serif;
  font-weight: 900;
  letter-spacing: 0px;
  text-transform: none;
}

.text-effect {
  position: relative;
  color: transparent;
  -webkit-text-fill-color: transparent;
  -webkit-text-stroke: 2px hsl(304 45% 72%);
}
.text-effect .fx-fill-wrap {
  position: absolute;
  inset: 0;
  pointer-events: none;
  filter: drop-shadow(0 0 3px hsl(304 95% 68% / 0.85)) drop-shadow(0 0 8px hsl(304 95% 68% / 0.85));
}
.text-effect .fx-fill {
  display: block;
  background: linear-gradient(0deg, hsl(304 88% 48%), hsl(304 92% 66%));
  -webkit-background-clip: text;
  background-clip: text;
  -webkit-text-fill-color: transparent;
  color: transparent;
  -webkit-mask-image: linear-gradient(to bottom, transparent 0%, transparent 48%, #000 52%, #000 100%);
  mask-image: linear-gradient(to bottom, transparent 0%, transparent 48%, #000 52%, #000 100%);
  -webkit-mask-size: 100% 200%;
  mask-size: 100% 200%;
  -webkit-mask-repeat: no-repeat;
  mask-repeat: no-repeat;
  -webkit-mask-position: 50% 100%;
  mask-position: 50% 100%;
}

@supports (animation-timeline: scroll()) {
  .text-effect .fx-fill {
    animation: text-effect-fill linear both;
    animation-timeline: scroll(nearest);
  }
}

@keyframes text-effect-fill {
  from { -webkit-mask-position: 50% 0%; mask-position: 50% 0%; }
  to { -webkit-mask-position: 50% 100%; mask-position: 50% 100%; }
}

Pure CSS — just add the .text-effect class to any element.

Category
Interactive & Advanced
Type
Animated
Browser support
Scroll-scrubbed in Chromium & Safari; static elsewhere
Capabilities
pure, scroll

Related Interactive & Advanced effects