In Scroll-Driven, Scroll-Triggered, Scroll States, and View Transitions (2026-06-08), CSS-Tricks summarized techniques for implementing scroll-linked visual effects using native CSS. Powered by features like the animation-timeline: scroll() / view() functions, animation-range, and container query scroll states (@container scroll-state(...)), interactions previously implemented in JS with tools like GSAP ScrollTrigger or Intersection Observer—such as moving elements based on scroll progress, triggering them at specific points, or toggling appearances depending on scroll state—can now be authored declaratively using CSS alone. Combined with View Transitions, the very way scroll effects are built is undergoing a transformation.
In client web development, teams have repeatedly suffered from the trap where "heavy JS animation libraries are introduced solely for hero parallax or entry animations, bloating dependency trees, causing stutter on low-spec devices, and accumulating maintenance overhead across version upgrades and bug fixes." Supporting client web development, we view this not as a matter of "whether we can use cutting-edge CSS," but as a design challenge of "building in the ability to reduce JS dependencies, simplify maintenance, run smoothly on low-spec devices, respect prefers-reduced-motion, and deliver clean fallbacks for unsupported browsers." Connecting with our JS dependency reduction policy discussed in JS-Free Overlay UI in Client Work (GH Media) and our native CSS adoption strategy covered in Using Modern Native CSS Features in Client Work (GH Media), this article organizes "Native CSS Scroll Effects Implementation Support" into a structured client service package.
Why rebuild scroll effects now
| Dimension | JS animation implementation (traditional) | Native CSS (2026) |
|---|---|---|
| Dependency | Add GSAP / ScrollTrigger | No additional libraries required |
| Linkage logic | JS calculations on scroll events | Specified declaratively with animation-timeline |
| Trigger detection | Monitored with Intersection Observer | Handled automatically by view() / scroll states |
| Execution thread | Often recalculates on the main thread | Runs lightweight on the compositor thread |
| Bundle size | Adds dozens of kilobytes | Near zero |
| Maintenance | Requires continuous version tracking | Resistant to obsolescence as a browser standard |
| Accessibility | Custom motion reduction controls | Integrated with prefers-reduced-motion |
In other words, "animating with JS libraries" and "delivering lightweight, maintainable scroll effects with minimal dependencies" are two entirely different things. In client work as well, "shifting linkage logic to CSS, designing reduction and pause states, and delivering with fallbacks in place" has become a quality baseline. This allows us to guarantee an architecture that cuts JS dependencies without degrading Core Web Vitals as a deliverable.
Differences between scroll-driven, scroll-triggered, scroll states, and view transitions
While these four are frequently conflated, "what they link to" and "when they occur" are fundamentally different. Distinguishing them at the outset is the key to preventing over-engineering in client development.
1. Scroll-driven (linked to scroll progress)
This technique uses animation-timeline: scroll() to turn scroll progress itself into the timeline of the animation. Scrolling backward rewinds the animation accordingly. It is best suited for cases like progress bars and parallax where continuous changes strictly proportional to position are desired.
2. Scroll-triggered (fired at a specific threshold)
Using animation-timeline: view() and animation-range, this technique fires an animation once the target element enters the viewport. Replacing what used to be handled by Intersection Observer for "fading in on appearance," it allows you to declare over what visibility range the animation plays, such as with animation-range: entry 0% cover 30%.
3. Scroll states (toggled based on scroll status)
Using container query scroll states (@container scroll-state(...)), this approach switches appearance based on states such as "has scrolled," "is stuck to an edge," or "is at a snap position." It is well-suited for shrinking headers or adding a shadow only while position: sticky is active.
4. View transitions (interpolating page navigation and state changes)
The View Transitions API is an axis independent of scroll linkage, in which the browser interpolates between before and after DOM states. While it can be combined with scroll effects, its role is "transition interpolation," and it is important not to confuse the two.
/* scroll-driven: スクロール進捗に連動 */
.progress-bar {
animation: grow linear;
animation-timeline: scroll(root block);
}
/* scroll-triggered: ビューポート進入で発火 */
.fade-in {
animation: fade linear both;
animation-timeline: view();
animation-range: entry 0% cover 30%;
}
5 phases of our client offering: "Native CSS Scroll Effects Implementation Support"
Phase 1: Inventory and assessment (1 week)
- Cataloging existing site scroll effects (parallax, reveals, sticky headers, etc.)
- Auditing active JS libraries, dependency payload sizes, and scroll execution overhead
- Confirming browser support and accessibility requirements
- Deliverable: Scroll effects inventory spreadsheet + dependency removal feasibility report
Phase 2: Design (1 week)
- Classifying each effect into scroll-driven, scroll-triggered, or scroll states
- Defining fallback policies (behavior in unsupported browsers) and reduction policies under
prefers-reduced-motion - Assessing whether combination with View Transitions is necessary
- Deliverable: Implementation blueprint + fallback and motion-reduction design document
Phase 3: Implementation (1–3 weeks)
- Implementing linkage logic via
animation-timeline,animation-range, and scroll states - Implementing animation stops and reduction for
prefers-reduced-motion - Implementing fallbacks for unsupported browsers
- Deliverables: Implemented components + implementation standard documentation
Phase 4: Verification and handover (1 week)
- Verifying rendering and frame rates across major/unsupported browsers and low-spec devices
- Verifying behavior when
prefers-reduced-motionis enabled and measuring impact on Core Web Vitals - Deliverables: Verification report + maintenance procedure manual
Phase 5: Continuous maintenance (ongoing)
- Periodic tracking of browser support status
- Evaluating phased removal of fallbacks
- Implementing additional new scroll effects
Implementation standards set for custom development
| Application | Recommendation | Avoid |
|---|---|---|
| Scroll progress linkage | animation-timeline: scroll() | JS recalculations on scroll events |
| Entry triggering | view() + animation-range | Routinely using Intersection Observer |
| State toggling | scroll states(scroll-state()) | Excessive class toggling via JS |
| Motion reduction control | Disabling animations with prefers-reduced-motion | Uniform playback without motion reduction |
| Fallback | Feature detection + static display | Neglecting unsupported browsers |
| Libraries | Omitted when web standards suffice | Adding heavy dependencies solely for visual effects |
Which projects need this and which do not
| Projects requiring this | Low-priority projects |
|---|---|
| Landing pages making heavy use of parallax and reveal animations | Sites with virtually no visual effects |
| Long-term sites seeking to reduce JS dependencies | Short-lived campaign landing pages |
| Projects seeking to fix stutter on low-spec devices | Target devices are high-performance only |
| Accessibility and CWV are mandatory requirements | Virtually no constraints |
| Teams fatigued by maintaining legacy animation libraries | No issues with current implementations |
Six clauses to include in custom development contracts
| Clause | Details | What the client should verify |
|---|---|---|
| Target scope | Types of visual effects to rebuild | Boundaries between parallax, reveal, and sticky behavior |
| Browser compatibility | Guaranteed scope | Extent of fallbacks |
| Fallback | Behavior when unsupported | Acceptability of static, non-animated display |
| Reduction and accommodations | prefers-reduced-motion criteria | Verification scope |
| Handover | Implementation standards / maintenance procedures | Maintenance framework |
| Ongoing maintenance | Monitoring browser support status | Operating costs |
Client ROI estimate (assumed for animation-heavy sites)
| Item | JS animation implementation | CSS-centric implementation | Difference |
|---|---|---|---|
| Dependency libraries | Managing multiple dependencies | Reduction / removal | Smaller dependency tree |
| Bundle size | Increases by tens of kilobytes | Near zero | Faster rendering speed |
| Scroll processing overhead | Pressures the main thread | Lightweight on the compositor thread | Improved perceived smoothness |
| Bug remediation | Occurs with version tracking | Reduced through browser standards | Lower maintenance workload |
| Maintenance workload | Recurring ongoing effort | Substantially compressed | Reduced operational costs |
| Annual benefit | — | — | Dependency reduction + CWV improvements + reduced maintenance hours |
Even with just an initial diagnostic (starting from 200,000 JPY), making visible how much JS dependency can be eliminated and how much lighter the page can render is valuable in itself. Maintenance overhead and performance degradation from libraries introduced merely for effects usually compound gradually over several years. For assessing impacts on Core Web Vitals, please also read our Core Web Vitals Improvement Guide (GH Media).
Five common pitfalls to avoid
Pitfall 1: Ignoring prefers-reduced-motion
Playing animations uniformly can cause discomfort for motion-sensitive users. Incorporate stops and reduced motion using prefers-reduced-motion from the outset.
Pitfall 2: Overlooking stutter on low-spec devices
Testing only on high-end hardware results in dropped frames on real-world mid-range devices. Verify actual frame rates on target hardware.
Pitfall 3: Failing to prepare fallbacks for Safari and other browsers
In unsupported browsers, effects do not merely disappear—layouts often break entirely. Establish feature detection and static display fallbacks beforehand.
Pitfall 4: Degrading CWV through excessive effects
Overloading a page with effects increases layout shifts and rendering paint overhead. Limit effects to key touchpoints, measuring CWV impact as you add them.
Pitfall 5: Postponing accessibility
Scroll-linked animations can interfere with focus navigation and screen reader output. Account for assistive technology operation and screen reader announcements. For details, refer to the Web Accessibility Implementation Guide (GH Media).
90-day action plan
| Week | Action |
|---|---|
| Week 1 | Inventorying scroll effects + measuring dependencies and processing overhead |
| Week 2 | Assessing feasibility of dependency removal + defining fallback/reduction policies |
| Week 3〜5 | Implementing scroll-driven, triggered, and scroll states features |
| Week 6 | Verification across major/unsupported browsers and low-spec devices + runbook preparation |
| Week 7〜13 | Monitoring support status + phased deprecation of fallbacks |
Conclusion: From running libraries to delivering with reduced dependencies
The arrival of animation-timeline: scroll() / view() and scroll states into practical use pushes the craft of scroll effects forward from "monitoring events and calculating in JS libraries" to "linking animations declaratively in CSS." For client web development, our "Native CSS Scroll Effects Implementation Support"—which shifts linkage to CSS, designs motion reduction and fallbacks, and delivers smooth performance even on low-spec devices—is a core service offering that reduces dependencies and maintenance costs without sacrificing Core Web Vitals.
If you are looking to "remove libraries added solely for animations," "fix stutter on low-spec devices," or "rebuild effects to respect prefers-reduced-motion," please feel free to reach out via our contact form.









