Why You Should Avoid Animating from scale(0): CSS Animation Best Practices
You should avoid animating from scale(0) because elements that appear to materialize from nothing violate physical realism, disrupt perceptual continuity, and can trigger performance bottlenecks by forcing main-thread calculations.
The emilkowalski/skills repository—a comprehensive knowledge base for UI engineering—explicitly forbids starting animations from scale(0) across multiple skill documents. This guideline appears in animation standards, code review checklists, and implementation guides, reflecting a core philosophy that motion design should feel grounded and predictable.
The Problem with scale(0) Animations
Animating from scale(0) creates an element that starts at zero width and height, effectively invisible. While technically valid, this pattern introduces three significant issues that the repository documentation repeatedly flags as high-severity concerns.
Physical Realism and the "Nothing from Nothing" Principle
In the skills/review-animations/STANDARDS.md file at line 53, the documentation states: "Nothing in the real world appears from nothing." When an element animates from scale(0), it violates this physical principle by creating the illusion of materialization rather than transformation. The repository recommends starting from a modest scale such as 0.9–0.97 combined with an opacity fade to simulate realistic inflation or expansion.
Perceptual Continuity and User Tracking
Starting from a tiny but visible size gives the user's eye a reference point to track movement. The skills/review-animations/SKILL.md at line 31 explains that the "Never animate from scale(0)" rule exists because perceptual continuity requires an initial visual anchor. When elements pop into view from nothing, the brain cannot smoothly track the motion, resulting in a jarring "pop-in" effect that feels artificial.
Performance Implications
According to skills/animate/SKILL.md at line 78, many UI frameworks treat scale shorthands as non-GPU-accelerated properties when combined with certain values. Animating from scale(0) to scale(1) can force the main thread to handle the calculation, causing dropped frames under load. By using a modest scale plus opacity, you remain within the GPU-friendly transform/opacity pair, ensuring smooth 60fps animations even on constrained devices.
Recommended Alternatives to scale(0)
The repository provides concrete implementation patterns that replace the anti-pattern of scale(0) entrances.
Enter Animations with Subtle Scale
Instead of starting from zero, use a slightly reduced scale with opacity:
.element {
opacity: 0;
transform: scale(0.95);
transition:
opacity 200ms ease-out,
transform 200ms ease-out;
}
.element.is-visible {
opacity: 1;
transform: scale(1);
}
This approach, documented in skills/review-animations/STANDARDS.md, creates a "balloon inflating" effect that feels natural because the element remains perceptible throughout the transition.
Press Feedback with Minor Scale Reduction
For interactive elements, apply a subtle scale-down that maintains visibility:
.button {
transition: transform 160ms ease-out;
}
.button:active {
transform: scale(0.97);
}
As noted in skills/emil-design-eng/SKILL.md at line 215, this technique provides tactile feedback while proportionally shrinking child elements (icons, text), which serves as a purposeful visual cue without making the button disappear.
Anchored Popover Transitions
When implementing dropdowns or popovers, combine modest scaling with proper transform origins:
.popover {
transform-origin: var(--transform-origin);
opacity: 0;
transform: scale(0.95);
transition: transform 200ms ease-out, opacity 200ms ease-out;
}
.popover.is-open {
opacity: 1;
transform: scale(1);
}
The skills/improve-animations/AUDIT.md at line 50 flags any scale(0) usage in popover animations as incorrect, emphasizing that the element should scale from its trigger point rather than the center to preserve spatial relationships.
What to Avoid
Do not implement entrance animations like this:
/* ❌ Incorrect: Avoid this pattern */
.element {
opacity: 0;
transform: scale(0);
transition:
opacity 200ms ease-out,
transform 200ms ease-out;
}
This pattern violates the repository's auditing standards and creates the unnatural "materialization" effect described in the physical realism principle.
Implementation in the emilkowalski/skills Repository
The "Never animate from scale(0)" rule is enforced through multiple mechanisms across the codebase:
skills/review-animations/STANDARDS.md: Defines the canonical scale range (0.9–0.97) and the core prohibition against zero-scale origins.skills/review-animations/SKILL.md: Explains physical correctness for popovers, dropdowns, and modal origins at line 31.skills/improve-animations/AUDIT.md: Contains a checklist at line 50 that flagsscale(0)usage as a high-severity issue requiring immediate correction.skills/emil-design-eng/SKILL.md: Provides UI-level implementation examples and performance rationale at line 215.
Summary
- Avoid
scale(0)for entrance animations because it creates an unrealistic "materialization" effect that breaks physical continuity. - Use scale values between 0.9 and 0.97 combined with opacity fades to maintain perceptual continuity and GPU acceleration.
- Reference specific transform origins for anchored elements like popovers to preserve spatial relationships and eye tracking.
- Audit existing code using the
improve-animations/AUDIT.mdchecklist to identify and eliminate problematicscale(0)patterns.
Frequently Asked Questions
What scale value should I use instead of scale(0)?
Use scale values between 0.9 and 0.97 depending on the context. For general entrance animations, scale(0.95) provides a subtle inflation effect. For press feedback on buttons, scale(0.97) offers sufficient tactile response without obscuring content. These values maintain visibility while creating the desired motion.
Why does scale(0) affect performance?
Animating from scale(0) can force browsers to perform main-thread calculations for layout and compositing, especially when combined with opacity changes. By starting from a modest non-zero scale, you ensure the animation stays within the GPU-accelerated layer, preventing frame drops on lower-end devices as documented in skills/animate/SKILL.md.
Can I ever use scale(0) in animations?
According to the emilkowalski/skills repository standards, you should never use scale(0) for entrance or exit animations. The only acceptable use of zero-scale values would be in non-animated states or specific technical requirements where the element must be completely removed from layout calculations, but even then, opacity and display properties are preferred over scale(0).
How do I audit existing code for scale(0) issues?
Review your CSS and animation libraries for any transform: scale(0) declarations in transition or keyframe definitions. The skills/improve-animations/AUDIT.md checklist suggests looking specifically at modal entrances, dropdown reveals, and card expansions. Replace these with scale(0.95) or similar values combined with opacity transitions for immediate improvement in perceived quality.
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 →