Buttons scale on press

Scale pressables to 0.97 on :active, 160ms ease-out.

Emil Kowalski@emilkowalski
An easy way to make your interface feel more responsive is to add a subtle scale down effect when a button is pressed. A scale of 0.97/0.98 scale on the :active pseudo-class with a ~150ms transition should do the job.
Aug 4, 2025View on X ↗
Emil Kowalski7 Practical Animation Tips
A scale of 0.97 on the :active pseudo-class should do the job
emilkowal.skiRead article ↗

From emil-design-eng; demo 1 rebuilds his Paste pill post.

No press, 0.97, and 0.85

Hold each Paste down to compare.

No pressBad
0
/* no :active */
scale(0.97)Good
0
scale(0.97) · 160ms ease-out
scale(0.85)Overdone
0
scale(0.85) · 160ms ease-out
.button {
  transition: transform 160ms cubic-bezier(0.23, 1, 0.32, 1);
}
.button:active:not(:disabled) {
  transform: scale(0.97);
}
@media (prefers-reduced-motion: reduce) {
  .button { transition: none; }
  .button:active { transform: none; }
}

Find where it turns mushy

Pick a scale, then press the button.

Your buttonIn range
0
scale(0.97) · 160ms ease-out -0.6px / side

Same 0.97, three transitions

Hold each button, then let go.

No transitionSnaps
transition: none
160ms ease-outGood
transform 160ms var(--ease-out)
400ms ease-inLags
transform 400ms ease-in

Why it matters, pros and cons

Why it matters

A click fires on release; the press answers on pointerdown.

Pros

  • Feedback before the click fires.
  • Transform only: no layout, no repaint.
  • Works on buttons, chips, cards, rows.

Cons

  • Below 0.95 it reads as a collapse.
  • Large cards move more: use 0.98 to 0.99.
  • Drop the scale under reduced motion.