How to create immersive scroll experiences? These 64 scroll effects cover all modern patterns: parallax, progressive reveals, progress bars, sticky sections and native CSS scroll-driven animations. From subtle reveals to cinematic scrolling.

Scroll Basics

20 fundamental scroll and parallax effects.

First element

Appears rising up with a fade

Second element

Progressive animation on scroll

Third element

Uses animation-timeline: view()

Fourth element

Each element animates individually

Fifth element

All CSS, zero JavaScript

Scroll ↓

Fade Up

Elements that appear rising up with a progressive fade via animation-timeline: view().

CSSScrollFade

Scale In

Elements that scale up from a smaller size with animation-timeline: view().

CSSScaleScroll

Slide In

Elements sliding in from left and right alternately via view().

CSSSlideScroll

Parallax

Parallax effect where the background moves at a different speed via scroll(nearest).

CSSParallaxScroll

Progress Reveal

Text that progressively fills with an animated gradient via scroll(nearest) and @property.

CSSProgressGradient

Stagger Cards

Cards appearing in cascade with incremental animation-delay and view().

CSSStaggerCards

Horizontal Scroll

Horizontal scrolling with scroll-snap for smooth navigation between elements.

CSSHorizontalSnap

Rotate In

Cards appearing with rotation and scale via view() and animation-delay.

CSSRotateStagger

Blur Reveal

Progressive focus effect with blur(20px) animated to blur(0) via view().

CSSBlurReveal

Counter Scroll

Animated counters that increment when they enter the container's view.

JSCounterScroll

Scroll-Driven Fade

Native CSS animation driven by scroll with animation-timeline: view() and entry range.

CSSViewFade

View Timeline Scale

Elements that progressively scale up via animation-timeline: view() and cover range.

CSSScaleView

Scroll Progress Bar

Sticky progress bar linked to the container scroll via scroll(nearest).

CSSProgressSticky

Parallax Layers CSS

Layers moving at different speeds via scroll(nearest) for a depth effect.

CSSParallaxLayers

Rotate On Scroll

Element performing a 720-degree rotation linked to scroll via scroll(nearest).

CSSRotateScroll

Slide In CSS Native

Native CSS left/right slide with animation-timeline: view() and cover range.

CSSSlideNative

Blur to Clear

Transition from blur(10px) to blur(0) for a cinematic effect via view().

CSSBlurView

Stagger Reveal CSS

Item grid with incremental native CSS animation-delay and view() for a cascade effect.

CSSStaggerNative

Clip Path Reveal

Progressive reveal via clip-path: inset() animated by view() and cover range.

CSSClip-pathReveal

Color Change

Progressive color change (purple, pink, cyan, green) linked to scroll via scroll(nearest).

CSSColorScroll

Progress Bar

Scroll to see the bar fill up. Uses animation-timeline: scroll() to link the animation to the container scroll.

Scroll ↓

Progress Bar

Progress bar linked to scroll via animation-timeline: scroll(). Fills from 0% to 100% in pure CSS.

CSS Scroll Progress

Fade In Reveal

Elements that progressively appear via animation-timeline: view() and animation-range: entry.

CSS View Reveal

Parallax Layers

Parallax layers with different speeds, driven entirely by scroll() in native CSS.

CSS Parallax Layers

Scale on Scroll

Cards that scale from 70% to 100% when entering the view via animation-timeline: view().

CSS Scale View

Color Shift

Background gradient that evolves through 5 color palettes while scrolling, via animation-timeline: scroll().

CSS Gradient Scroll

Text Reveal

Words that slide up from the bottom and progressively reveal while scrolling with view().

CSS Text Reveal

Rotate on Scroll

Geometric shape with 720-degree rotation linked to scroll. Borders rotate in the opposite direction.

CSS Rotate Scroll

Slide In Cards

Cards that alternately slide in from left and right with view() and animation-range: entry.

CSS Slide View

Zoom & Blur

Circle that zooms in and unblurs at the scroll center, then continues zooming and reblurs on exit.

CSS Zoom Blur

Horizontal Scroll

Vertical scroll converted into horizontal card scrolling via animation-timeline: scroll().

CSS Horizontal Scroll

Chapter 1: Introduction

Welcome to this demonstration of a scroll-linked progress bar. The bar at the top of this container progresses based on your scroll position.

This effect uses the CSS property animation-timeline: scroll() which links a @keyframes animation directly to the container's scroll position.

Chapter 2: How It Works

The scroll-timeline property creates a named timeline on the scrollable container. The progress-bar animation then uses this timeline to animate the transform: scaleX() property.

The result is a smooth progress bar that accurately represents the percentage of content read, without any JavaScript.

Chapter 3: Applications

Ideal for blog posts, documentation pages, tutorials, or any long-form content where the user wants to visualize their reading progress.

Compatible with modern browsers supporting Scroll-Driven Animations (Chrome 115+, Edge 115+).

Chapter 4: Conclusion

Scroll-linked animations open new possibilities for user experience, all in pure CSS with no impact on JavaScript performance.

Scroll to see the effect

Progress Bar

Reading progress bar driven by animation-timeline: scroll(), zero JavaScript.

CSS scroll() Progress

Horizontal Scroll Section

Section scrolling horizontally during vertical scroll, pure CSS with scroll-timeline.

CSS scroll-timeline Horizontal

Sticky Reveal Stack

Cards stacking and revealing one by one on scroll with view() timeline.

CSS view() Stack

Text Line Reveal

Each word progressively colorizes while scrolling via animation-range and view().

CSS animation-range Text

Zoom Into Content

Content starting zoomed out that scales to 100% on scroll, cinematic opening effect.

CSS view() Zoom

Rotation on Scroll

Element rotating proportionally to scroll position, dial/compass effect.

CSS scroll() Rotation

Path Drawing on Scroll

SVG path drawing itself via stroke-dashoffset animated by scroll, pure CSS.

CSS SVG scroll()

Parallax Layers

Multi-layer parallax entirely controlled by scroll() timeline, no JS.

CSS scroll() Parallax

Introduction

Scrollytelling is a narrative technique that uses page scrolling to guide the user through an immersive visual story.

Chapter 1

Scroll-triggered animations progressively reveal content, creating a natural reading rhythm that captivates attention.

Chapter 2

By combining parallax, transitions, and visual effects, each section becomes a scene in a larger narrative, transforming a simple website into a storytelling experience.

Chapter 3

The best scrollytelling examples balance aesthetics and functionality, guiding the user without overwhelming them with excessive effects.

Conclusion

Master these techniques to create memorable web experiences that tell your story with elegance and fluidity.

Scroll to explore

Progress Bar

Horizontal progress bar that fills proportionally to content scrolling.

CSS JavaScript UX

Parallax Layers

Three visual layers move at different speeds to create an immersive depth effect.

CSS JavaScript Parallax

Reveal on Scroll

Elements appear with a fade and vertical slide when they enter the visible area.

IntersectionObserver CSS Animation

Sticky Horizontal

Automatic horizontal scrolling simulating panel navigation, ideal for presenting steps or projects.

CSS Animation Auto-play

Text Highlight on Scroll

Each word progressively lights up as you scroll, creating a guided reading effect.

JavaScript CSS Typography

Zoom on Scroll

An element progressively grows with scrolling, going from a small object to a full-screen view.

JavaScript CSS Transform Scroll

Number Counter Scroll

Counters animate from zero to their target value proportionally to the scroll position.

JavaScript Animation Data

Timeline Scroll

Interactive vertical timeline with a line that progressively draws and elements that appear on scroll.

JavaScript CSS Timeline

Image Sequence

Frame-by-frame animation simulation driven by scroll, similar to Apple product pages.

JavaScript CSS Sequence

Scroll Snap Sections

Full-height sections with magnetic snapping and side pagination indicator.

CSS Scroll Snap JavaScript Navigation

Sticky Scroll

8 advanced sticky scroll and parallax effects.

01

First Section

The image stays fixed while content scrolls. Ideal technique for presenting features.

Second Section

Each text section triggers a visual change in the sticky image.

Third Section

Smooth transitions guide the user through content seamlessly.

Fourth Section

A pattern used in interactive journalism and product websites.

Scroll ↓

Sticky Image Change

Sticky image that changes while content scrolls with panels revealed via view().

CSSStickyScroll

Horizontal Scroll

Horizontal scrolling section with snap to navigate between workflow steps.

CSSHorizontalSticky

Card Stack

Cards that stack with position sticky and view() animation in the container.

CSSStackSticky

Progress Reveal

Sticky progress bar with items progressively revealed via scroll(nearest) and view().

CSSProgressReveal

Split Screen Sticky

Sticky visual with rotating SVG and content revealed by scroll via view() and scroll(nearest).

CSSSplitSticky

Zoom In Sticky

Element that progressively zooms from scale(1) to scale(2.2) via scroll(nearest).

CSSZoomScroll

Text Highlight Scroll

Words colored sequentially on scroll with JS scoped to the container.

JSTextHighlight

Layered Parallax

5 layers moving at different speeds via scroll(nearest) for a complete parallax effect.

CSSParallaxLayers

Scroll Snap

6 scroll snap effects for precise navigation.

Section 1

Scroll to move to the next one

Section 2

Scroll stops automatically

Section 3

Smooth and controlled experience

Section 4

Last section

Scroll ↓

Vertical Snap

Sections automatically snapping to start via scroll-snap-type: y mandatory.

CSSSnapVertical

Horizontal Snap

Horizontal scrolling with automatic snapping via scroll-snap-type: x mandatory.

CSSSnapHorizontal

Mixed Content Snap

Sections of different sizes with scroll-snap-type: y proximity for flexibility.

CSSMixedSnap

Snap + Progress

Vertical snap with progress bar and indicator dots via JS scoped to the container.

JSSnapProgress

Smooth Snap

Snap with animations triggered by IntersectionObserver scoped to the container.

JSSnapSmooth

Chapter 1 — The concept

Scroll inside this area: the glowing bar on the left fills at the exact pace of your reading, with a halo that reacts to position. The further you go, the higher the beam rises.

Chapter 2 — The marker

The luminous cursor slides along the vertical axis. It's an elegant and discreet progress marker, perfect for a long article, documentation page, or a narrative that unfolds on scroll.

Chapter 3 — The mechanics

No external dependency: a simple scroll listener calculates the scrolled / total height ratio and updates a CSS variable. Lightweight, smooth, and fully accessible.

Chapter 4 — Performance

The listener is passive and only touches a custom property, so zero costly reflow. Rendering stays at 60 fps even on mobile, and the bar follows the finger to the pixel.

Chapter 5 — Accessibility

The bar is purely decorative (aria-hidden): content remains fully readable and keyboard-navigable. In reduced-motion mode, instant scrolling replaces smooth-scroll.

Chapter 6 — The end

At the very bottom, the bar is full at 100% and the percentage confirms it. A clear marker from start to finish, without ever stealing attention from the content.

Scroll Progress Beam

A glowing lateral bar that fills with scroll progress, reactive halo and sliding cursor. Premium, discreet reading marker.

💡 Perfect for: article progress bar, long page / docs, multi-section onboarding, storytelling landing.

Scroll CSS Variables Vanilla JS Free

Scroll Velocity Feedback

Elements react to scroll speed: dynamic stretching and tilt that give physical weight to scrolling, then snapping back to sharp at rest.

💡 Perfect for: editorial gallery, project grid, immersive feed, creative "about" page.

Scroll Velocity requestAnimationFrame Premium

Pinned Image Sequence

A pinned object whose 360° rotation is driven by scroll, Apple-style product sequence. Here, a real 3D model (.glb, self-hosted, loaded on demand) rotates as you scroll.

💡 Perfect for: 360° product view, feature/teardown reveal, launch page, step-by-step visual tutorial.

Scroll Sticky CSS 3D Premium

Sticky Horizontal Reveal

A pinned section whose content scrolls horizontally as you scroll vertically. Tells a progression (process, timeline, steps) in a cinematic way.

💡 Perfect for: process/step presentation, timeline, portfolio showcase, narrative product page.

Scroll Sticky Horizontal Premium

Scroll Choreography Sequence

Multi-element orchestration: headline, text, badges and CTA enter in cascade on the scroll timeline, like a scene being built. Each element has its own progress window.

💡 Perfect for: assembling hero section, feature presentation, brand storytelling, "manifesto" section.

Scroll Timeline Stagger Premium

Frequently Asked Questions

How to trigger a scroll animation in JavaScript? +

Use IntersectionObserver: create an observer with a threshold (e.g., 0.1), observe your elements, and add a CSS class when they enter the viewport. It's the most performant method — no scroll listener needed.

How to create a CSS parallax effect? +

The simplest method uses background-attachment: fixed on a background-image. For more controlled parallax, use transform: translateY() with a reduced coefficient based on scroll position (via JS or CSS scroll-timeline).

What is scroll-timeline in CSS? +

scroll-timeline is a native CSS API that links an animation to the scroll position — no JavaScript needed. You set animation-timeline: scroll() and the animation progresses with the scroll. Supported by Chrome and Edge since 2024.

How to make a reading progress bar? +

Listen to the scroll event, calculate the percentage: (scrollY / (document.height - window.height)) * 100, and apply it as the width of a bar fixed at the top. Or use CSS scroll-timeline for zero JavaScript.

Do scroll animations impact performance? +

With IntersectionObserver: no, it's asynchronous. With a scroll listener: potentially yes — use passive: true and throttle/debounce. With CSS scroll-timeline: no, it's handled natively by the browser.

Similar Categories