How to Debug Animations Using Slow Motion and Frame Inspection
Slow down animations to 0.25× speed using Chrome DevTools or CSS variables, then scrub frame-by-frame through the Animations panel to expose timing flaws, jitter, and layout thrashing invisible at normal playback.
Subtle animation defects disappear at full speed but destroy user experience upon closer inspection. The Skills repository (emilkowalski/skills) establishes slow-motion debugging as a mandatory code-quality discipline to validate motion against ten non-negotiable standards. Mastering frame inspection and playback speed manipulation ensures every animation respects GPU constraints, accessibility requirements, and performance budgets.
Pause and Scrub Frame-by-Frame in DevTools
Frame-by-frame inspection reveals jitter, incorrect easing curves, and abrupt changes that remain hidden at full speed. Open Chrome DevTools, navigate to the Animations panel, click the pause button, then drag the timeline scrubber to advance individual frames.
For programmatic control, manipulate the animation-delay property to force specific timestamps:
const anim = document.querySelector('.my-anim');
let frame = 0;
const fps = 60;
function step() {
// Advance by one frame (≈16.67ms at 60fps)
anim.style.animationDelay = `-${frame / fps}s`;
frame++;
}
document.getElementById('stepBtn').addEventListener('click', step);
Setting a negative animation-delay forces the animation to the exact timestamp of the desired frame, enabling precise frame-by-frame analysis as documented in skills/improve-animations/SKILL.md at line 84.
Reduce Playback Speed Globally with CSS Variables
Changing playback speed magnifies duration mismatches and makes it easier to spot "feel-breaking" regressions such as ease-in on UI elements. Define a debug multiplier using CSS custom properties to toggle between normal and slow-motion without editing each animation individually:
:root {
--debug-speed: 0.25;
}
.my-anim {
animation-name: slide-in;
animation-duration: calc(300ms * (1 / var(--debug-speed)));
animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
}
.my-anim.paused {
animation-play-state: paused;
}
Alternatively, use Chrome DevTools' built-in Playback speed slider set to 0.25× in the Animations panel. This instantly slows the entire timeline, exposing timing-related regressions without code changes, satisfying the "feel-check" requirement in skills/review-animations/SKILL.md at line 112.
Verify GPU-Only Properties in the Layers Panel
Animations must limit properties to transform and opacity to avoid layout thrashing. In the Layers panel, verify that animated properties exclude width, height, or other layout-affecting values. If detected, rewrite them to use GPU-friendly transforms.
Animating non-GPU properties causes dropped frames that become especially noticeable when the animation slows down, as noted in skills/review-animations/SKILL.md at lines 35-36.
Test Interruptibility and Accessibility
Trigger the animation repeatedly through rapid clicks while scrubbing through frames. If the animation restarts from zero each time, replace keyframes with a transition or spring-based animation to ensure interruptibility. Non-interruptible motion appears "stuck" in slow motion and creates poor user experience, per skills/review-animations/SKILL.md at lines 33-34.
Simultaneously, toggle the prefers-reduced-motion media query in DevTools to ensure animations either soften or are omitted entirely. Verify hover animations are gated behind @media (hover: hover) and (pointer: fine) to respect accessibility standards, documented at lines 37-38 of skills/review-animations/SKILL.md.
Capture Performance Recordings
Use the Performance panel to capture a recording at normal speed, then replay it at 0.25×. Compare timing graphs to identify where frame drops occur. Performance recordings surface hidden layout thrashing that only appears when the animation stretches, as implemented in skills/apple-design/SKILL.md at line 263.
Document Findings Using Standardized Formats
Create markdown tables of "Before → After" changes following the repository's required output format. Include line citations from the source files to maintain consistency and help teammates understand the rationale, as defined in skills/review-animations/SKILL.md at lines 78-89.
Summary
- Pause and scrub through the Animations panel to inspect individual frames for jitter and easing defects.
- Reduce playback speed to 0.25× using CSS variables (
--debug-speed) or DevTools controls to magnify timing issues. - Verify GPU-only properties (
transform,opacity) in the Layers panel to prevent layout thrashing. - Test interruptibility by rapid triggering and ensure animations respect
prefers-reduced-motionmedia queries. - Record performance profiles to identify frame drops that only appear during slow-motion playback.
- Document changes in standardized markdown tables with line citations from
skills/review-animations/SKILL.md.
Frequently Asked Questions
How do I slow down CSS animations without editing each duration value?
Define a global CSS variable --debug-speed (e.g., 0.25 for quarter speed) and multiply your animation-duration by calc(1 / var(--debug-speed)). Changing the variable value in :root instantly adjusts all animations system-wide, enabling quick feel-checks without individual property edits.
Why do animations look different when slowed down?
Slow motion exposes timing mismatches, incorrect easing curves, and layout thrashing that the human eye smooths over at 60fps. Issues like ease-in on UI elements or non-GPU property animations become visibly jarring when stretched, revealing why the animation feels "off" to users subconsciously.
Which properties should I verify during frame inspection?
Restrict animations to GPU-only properties: transform (translate, scale, rotate) and opacity. Check the Layers panel for width, height, top, left, or margin animations—these trigger layout recalculations and cause frame drops that are unacceptable according to the ten non-negotiable standards in skills/review-animations/SKILL.md.
How does the Skills repository define animation quality standards?
The repository treats animation review as a code-quality discipline requiring strict adherence to ten non-negotiable standards including GPU-only properties, interruptibility, and reduced-motion support. Slow-motion debugging serves as the primary "feel-check" technique to validate these standards before code approval.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →