| name | motion-sickness |
| description | Use when animation causes dizziness, nausea, disorientation, or vestibular discomfort |
Motion Sickness Prevention
Eliminate vestibular triggers using Disney's principles safely.
Problem Indicators
- Users report dizziness or nausea
- Disorientation during navigation
- Users avoid certain features
- Complaints increase with larger screens
- Parallax or zoom effects cause issues
Dangerous Patterns
These trigger vestibular responses:
- Large-scale zoom animations
- Parallax scrolling (especially multi-layer)
- Full-screen rotations
- Rapid direction changes
- Continuous/looping background motion
- Scroll-jacking
Diagnosis by Principle
Exaggeration
Issue: Over-dramatic motion
Fix: Reduce scale of transforms. Max 10-20% size change. Avoid full-screen zooms.
Arcs
Issue: Curved paths cause tracking strain
Fix: Use linear motion for functional UI. Save arcs for small, optional elements only.
Follow Through
Issue: Overshooting creates whiplash effect
Fix: Remove bounce/overshoot from navigation. Use critically damped springs or ease-out.
Secondary Action
Issue: Multiple moving elements cause confusion
Fix: Limit to one primary motion. Remove parallax layers.
Slow In and Slow Out
Issue: Acceleration patterns cause disorientation
Fix: Use consistent, predictable easing. Avoid sudden speed changes.
Quick Fixes
- Respect
prefers-reduced-motion - Non-negotiable
- Remove parallax effects - Common trigger
- Avoid zoom transitions - Use fades instead
- Keep motion small - Under 100px movement
- No scroll-jacking - Let scroll be scroll
Troubleshooting Checklist
Safe Alternatives
| Triggering | Safe Alternative |
|---|
| Zoom transition | Fade + slight scale (max 5%) |
| Parallax scroll | Static or single-layer |
| Rotation | Fade or slide |
| Bounce/spring | Ease-out (no overshoot) |
| Full-page slide | Crossfade |
Code Pattern
@media (prefers-reduced-motion: reduce) {
*,
*::before,
*::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
scroll-behavior: auto !important;
}
.parallax {
transform: none !important;
}
}
.safe-transition {
transition: opacity 200ms ease-out;
}