Back to library
INTERACTION_070

Oversized Typography Parallax.

Giant type drifts slower than the content in front of it. Offset 40px below its resting position before the trigger; translating the layer at 0.25 of the scroll delta once scroll position relative to the section.

CATEGORY
Headlines
COMPLEXITY
Intermediate
TECH
CSS
PLATFORM
Both
PERFORMANCE
Light
LIVE PLAYGROUND
PREMIUM MOTION —PREMIUM MOTION —PREMIUM MOTION —PREMIUM MOTION —
CSS / CSS
/* Oversized Typography Parallax — Giant type drifts slower than the content in front of it. */
.oversized-typography-parallax {
  --dur: scroll-linked;
  --ease: linear;
  --stagger: 60ms;
  will-change: transform, opacity;
}

.oversized-typography-parallax > * {
  opacity: 0;
  transform: translateY(14px);
  animation: oversized-typography-parallax-in var(--dur) var(--ease) forwards;
  animation-delay: calc(var(--i, 0) * var(--stagger));
}

/* offset 40px below its resting position -> translating the layer at 0.25 of the scroll delta */
@keyframes oversized-typography-parallax-in {
  to {
    opacity: 1;
    transform: none;
    filter: none;
  }
}

@media (prefers-reduced-motion: reduce) {
  .oversized-typography-parallax > * {
    opacity: 1;
    transform: none;
    animation: none;
  }
}
React / TSX
import { useEffect, useRef } from "react";

/** Oversized Typography Parallax — trigger: scroll position relative to the section */
export function OversizedTypographyParallax({ children }: { children: React.ReactNode }) {
  const ref = useRef<HTMLDivElement>(null);

  useEffect(() => {
    const el = ref.current;
    if (!el) return;
    if (window.matchMedia("(prefers-reduced-motion: reduce)").matches) {
      el.dataset["state"] = "in";
      return;
    }
    const io = new IntersectionObserver(
      ([entry]) => {
        if (entry?.isIntersecting) {
          el.dataset["state"] = "in";
          io.unobserve(el);
        }
      },
      { threshold: 0.2 },
    );
    io.observe(el);
    return () => io.disconnect();
  }, []);

  return (
    <div ref={ref} className="oversized-typography-parallax" data-state="out">
      {children}
    </div>
  );
}

IF YOU LIKE THIS, STEAL THESE TOO.

SHIPFASTER
INTERACTION_065CSS

Expanding Keyword

One keyword grows and the rest of the line reflows around it.

Headlines / LightView
BUILT FOR
FOUNDERSDESIGNERS
INTERACTION_069CSS

Text Morphing

One phrase blurs and dissolves directly into the next.

Headlines / MediumView
OUTLINE
INTERACTION_072CSS

Gradient Border Text

Outlined type with a light gradient travelling around the stroke.

Headlines / LightView
SPLIT LINE
HERO REVEAL.
INTERACTION_063CSS

Split Line Hero Reveal

The hero headline arrives line by line from behind its own masks.

Headlines / LightView