Scroll Parallax Stack
3D & Depth · Animated · pure CSS
Two shaded data-text clones sit behind the face in graduated depth shades, each scrubbing its own vertical travel from an anonymous view() timeline so the deeper layer drifts nearly twice as far per scroll unit. The extrusion shears apart low in the viewport and pulls into a tight, aligned stack by the time it reaches centre — a pure-CSS depth breath tied to the scrollbar.
How it works
Scroll Parallax Stack is an animated 3d & depth text effect rendered entirely in CSS. A data-text attribute mirrors the word into ::before/::after layers, so copy that attribute together with the CSS. It is driven by a scroll-linked animation timeline.
Controls
Scroll Parallax Stack exposes 3 dedicated controls — Depth Spread, Layer Hue 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 Parallax Stack — made with TEXT-FX · https://text-fx.app
* HTML: the element needs a data-text attribute equal to its text; uses scroll-driven animation.
* Font: 'Recursive', sans-serif (load from Google Fonts).
*/
.text-effect {
font-family: 'Recursive', sans-serif;
font-weight: 400;
letter-spacing: 2px;
text-transform: none;
}
.text-effect {
position: relative;
isolation: isolate;
color: hsl(138 55% 82%);
}
.text-effect::before {
content: attr(data-text);
position: absolute;
inset: 0;
color: hsl(138 60% 56%);
z-index: -1;
transform: translate(0.045em, 0.06em);
pointer-events: none;
will-change: transform;
}
.text-effect::after {
content: attr(data-text);
position: absolute;
inset: 0;
color: hsl(138 55% 34%);
z-index: -2;
transform: translate(0.085em, 0.114em);
pointer-events: none;
will-change: transform;
}
@supports (animation-timeline: view()) {
.text-effect::before {
animation: text-effect-mid linear both;
animation-timeline: view();
animation-range: cover 0% cover 44%;
}
.text-effect::after {
animation: text-effect-deep linear both;
animation-timeline: view();
animation-range: cover 0% cover 44%;
}
}
@keyframes text-effect-mid {
0% { transform: translate(0.045em, 0.187em); }
100% { transform: translate(0.045em, 0.06em); }
}
@keyframes text-effect-deep {
0% { transform: translate(0.085em, 0.355em); }
100% { transform: translate(0.085em, 0.114em); }
}
HTML
This effect needs the markup below (per-letter spans, SVG defs, or a data-text attribute).
<!-- Made with TEXT-FX · https://text-fx.app -->
<style>
.text-effect {
font-family: 'Recursive', sans-serif;
font-weight: 400;
letter-spacing: 2px;
text-transform: none;
}
.text-effect {
position: relative;
isolation: isolate;
color: hsl(138 55% 82%);
}
.text-effect::before {
content: attr(data-text);
position: absolute;
inset: 0;
color: hsl(138 60% 56%);
z-index: -1;
transform: translate(0.045em, 0.06em);
pointer-events: none;
will-change: transform;
}
.text-effect::after {
content: attr(data-text);
position: absolute;
inset: 0;
color: hsl(138 55% 34%);
z-index: -2;
transform: translate(0.085em, 0.114em);
pointer-events: none;
will-change: transform;
}
@supports (animation-timeline: view()) {
.text-effect::before {
animation: text-effect-mid linear both;
animation-timeline: view();
animation-range: cover 0% cover 44%;
}
.text-effect::after {
animation: text-effect-deep linear both;
animation-timeline: view();
animation-range: cover 0% cover 44%;
}
}
@keyframes text-effect-mid {
0% { transform: translate(0.045em, 0.187em); }
100% { transform: translate(0.045em, 0.06em); }
}
@keyframes text-effect-deep {
0% { transform: translate(0.085em, 0.355em); }
100% { transform: translate(0.085em, 0.114em); }
}
</style>
<div data-text="Your text" class="text-effect">Your text</div>
- Category
- 3D & Depth
- Type
- Animated
- Browser support
- Scroll-scrubbed in Chromium & Safari; static elsewhere
- Capabilities
- dataText, scroll