Scroll-driven editorial motion, from script-heavy listeners to native CSS timelines.
This showcase documents the complete Week 07 assignment from raw semantic HTML through prompt engineering, human auditing, and a verified editorial layout that uses native scroll timelines, view timelines, and @starting-style without JavaScript scroll listeners.
01Problem
02CSS Concepts
03Raw HTML
04AI Prompt
05Audit
06Final Result
07Verification
01
Why scroll listeners were the wrong animation engine
Modern editorial motion needs to guide attention without forcing JavaScript to measure scroll offsets on every frame.
Before
Traditional scroll effects often depended on JavaScript listeners that measured element positions, recalculated offsets, and updated inline styles during scrolling. Those calculations can compete with rendering work and create brittle animation logic.
Modern approach
Native scroll-driven animations let the browser connect keyframes to scroll progress directly. The result is a more declarative system that keeps motion tied to compositor-friendly properties such as transform and opacity.
The document is semantic and readable, but the browser has not been given progress, reveal, or first-render transition behavior yet.
before.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Week 07 Lab: Scroll Timelines & Starting Styles</title>
</head>
<body>
<!-- Reading Progress Indicator -->
<div class="scroll-tracker"></div>
<div class="editorial-container">
<header class="editorial-header">
<span class="editorial-tag">Future of the Web</span>
<h1 class="editorial-title">The Evolution of Motion Specs</h1>
<p class="editorial-lead">How native browser engines reclaimed animation performance from heavy script libraries.</p>
</header>
<main class="editorial-body">
<p>Web animation was historically a battleground. For years, designers relied on heavy scripting engines to calculate element offsets on every single frame. This hijacked the browser's scrolling thread, resulting in stuttering layouts and drained mobile batteries.</p>
<!-- Scroll-Reveal Image Container -->
<figure class="reveal-figure">
<img src="https://images.unsplash.com/photo-1550751827-4bd374c3f58b?w=800" alt="Cyber security network interface" class="reveal-img">
<figcaption>Hardware-accelerated layouts render smoothly at 120Hz.</figcaption>
</figure>
<p>With modern CSS specifications, the game has changed entirely. By linking CSS Keyframe timelines directly to scroll offsets, the browser handles position computations natively on the compositor thread—completely isolated from main thread blockages.</p>
<!-- Pop-In Interactive Component -->
<section class="signup-widget">
<div class="signup-widget__inner">
<h3>Subscribe to the Spec</h3>
<p>Get deep-dives into emerging CSS and browser platform APIs delivered weekly.</p>
<div class="signup-fields">
<input type="email" placeholder="Enter your email" class="input-field">
<button class="btn-submit">Join Feed</button>
</div>
</div>
</section>
<p>Furthermore, the introduction of declarative transition triggers like `@starting-style` allows developers to define starting properties for elements that are rendering for the first time—making entrance transitions clean, fluid, and entirely script-free.</p>
</main>
</div>
</body>
</html>
Browser defaults only
Reading progress indicator
Future of the Web
The Evolution of Motion Specs
How native browser engines reclaimed animation performance from heavy script libraries.
Web animation was historically a battleground.
Hardware-accelerated layouts render smoothly at 120Hz.
Scroll offsets can now drive keyframes natively.
Subscribe to the Spec
Get deep-dives into emerging CSS and browser platform APIs delivered weekly.
04
How the AI prompt became an auditable motion contract
The prompt turns the assignment blueprint into measurable CSS requirements rather than a vague request for animation.
Layer 1 — Preserve the structure
Lock the supplied editorial HTML and require a CSS-only deliverable.
Layer 2 — Bind root progress
Turn the fixed tracker into a scroll-driven scale transform on the root timeline.
Layer 3 — Reveal by view progress
Use view() and attachment ranges to animate the figure as it enters the viewport.
Layer 4 — Transition first render
Use standard transitions plus @starting-style for the newsletter card entrance.
Layer 5 — Protect accessibility
Require reduced-motion handling, keyboard-safe controls, and readable unsupported-browser fallbacks.
Layer 6 — Audit the output
Ask for compositor-friendly properties and prohibit JavaScript offset calculations.
AI prompt
Act as a senior CSS systems engineer. Generate a production-ready stylesheet for the supplied editorial HTML using native CSS motion features only.
Implementation requirements:
1. Preserve the supplied semantic HTML structure and class names. Do not add JavaScript, framework code, scroll listeners, animation helper classes, or extra wrapper elements.
2. Style `.scroll-tracker` as a fixed, top-anchored reading progress indicator that expands horizontally with `transform: scaleX()` from 0 to 1 while the root document scrolls.
3. Bind the progress indicator to the global scrolling context with `animation-timeline: scroll(root)`, and declare timeline-related properties after any `animation` shorthand so the shorthand does not reset them.
4. Create a scroll-reveal effect for `.reveal-figure` using compositor-friendly `opacity` and `transform` keyframes, `animation-timeline: view()`, and an explicit `animation-range` using entry and cover bounds.
5. Style `.signup-widget` with a normal transition-based entrance effect, then use `@starting-style` to define its first-render starting state of `opacity: 0` and `transform: translateY(30px)`.
6. Provide progressive enhancement so browsers without scroll-driven animation support still show fully readable content rather than hidden or half-transformed components.
7. Honor `prefers-reduced-motion: reduce` by neutralizing scroll timelines, view animations, and entrance transitions while keeping the editorial content visible.
8. Keep the animations on compositor-friendly properties only, document the human audit points in concise comments, and avoid physical offset calculations such as JavaScript-measured top or left positions.
Return only the complete CSS stylesheet.
05
Auditing the generated scroll-driven motion system
The human pass checks feature support, timeline binding, compositor-friendly properties, and reduced-motion fallbacks.
Human correction focus
The final CSS keeps unsupported browsers readable, declares animation-timeline after animation shorthands, and treats @starting-style as a first-render transition tool rather than a viewport observer.
No scroll listenersThe live demo uses native CSS timelines instead of JavaScript measuring loops.Compositor-friendlyThe moving properties are limited to transform and opacity.Fallback visibleBase styles show content before timeline support is layered on with @supports.Reduced motionThe media query neutralizes scroll and entrance motion while preserving content.
06
The final scroll-driven editorial layout
The finished result uses native timelines and first-render transitions while staying readable when motion features are unavailable.
Future of the Web
The Evolution of Motion Specs
How native browser engines reclaimed animation performance from heavy script libraries.
Web animation was historically a battleground. For years, designers relied on heavy scripting engines to calculate element offsets on every single frame. This hijacked the browser's scrolling thread, resulting in stuttering layouts and drained mobile batteries.
Hardware-accelerated layouts render smoothly at 120Hz.
With modern CSS specifications, the game has changed entirely. By linking CSS Keyframe timelines directly to scroll offsets, the browser handles position computations natively on the compositor thread—completely isolated from main thread blockages.
Subscribe to the Spec
Get deep-dives into emerging CSS and browser platform APIs delivered weekly.
Furthermore, the introduction of declarative transition triggers like @starting-style allows developers to define starting properties for elements that are rendering for the first time—making entrance transitions clean, fluid, and entirely script-free.
Root progress
The fixed tracker uses scroll(root) so the browser maps page progress to scaleX().
View reveal
The figure uses view() and animation-range so the reveal tracks viewport entry.
First render
The signup card uses ordinary transitions plus @starting-style, not a helper class.