Duration scales with size
Small elements stay under 200ms; large surfaces get 300 to 500ms.
Emil Kowalski@emilkowalskiAnimation duration should scale with the size of the animated element. Small UI elements like dropdowns can feel great under ~200ms. But large transitions, like full-screen menus, need more time to avoid feeling abrupt since they feel "heavier". Here's 150ms vs 300ms:
Emil KowalskiBuilding a drawer componentDuration of 500ms is also supposed to mimic iOS's Sheet.
From emil-design-eng, “How fast should it be?”.
Full-screen menu: 150 vs 300ms
Toggle both, then drag the right menu’s duration.
150msAbrupt
--d: 150ms300msSettled
--d: 300ms.menu {
--d: 300ms;
clip-path: inset(0 0 100% 0);
transition: clip-path var(--d) var(--ease-out);
}
.menu[data-open] { clip-path: inset(0); }
.menu li {
opacity: 0;
transform: translateY(8px);
transition: opacity var(--d) var(--ease-out), transform var(--d) var(--ease-out);
}
.menu[data-open] li {
opacity: 1;
transform: none;
transition-delay: calc(var(--i) * var(--d) * 0.12);
}
One duration cannot fit both
Open both, then find one duration that suits both.
Dropdown · 240pxSnappy
transform 150ms var(--ease-out)Sheet · full heightAbrupt
Share invoice INV-0142
transform 150ms var(--ease-drawer)The duration ladder
Press Play in each mode.
Tooltip125ms
Dropdown180ms
Modal250ms
Sheet500ms
:root {
--dur-tooltip: 125ms;
--dur-dropdown: 180ms;
--dur-modal: 250ms;
--dur-menu: 300ms;
--dur-sheet: 500ms;
--ease-drawer: cubic-bezier(0.32, 0.72, 0, 1);
}
.sheet { transition: transform var(--dur-sheet) var(--ease-drawer); }
Why it matters, pros and cons
Why it matters
Size reads as mass. A full-screen surface at tooltip speed seems to teleport.
Pros
- Small, frequent UI stays fast.
- Large surfaces stay trackable.
- One token per size tier.
Cons
- Frequent sheets can go shorter.
- 500ms needs the drawer curve; plain ease drags.
- Keyboard-triggered surfaces skip animation at any size.