Zero units in CSS: duration, frequency, resolution require units

In most cases, the value zero does not require units to be specified in CSS, however, this is not the case when using non-length and non-angle units.

CSS doesn’t usually require zeros to have units — because zero is zero, regardless of units. Since these are all equivalent, the unitless version is often used:

{
  padding: 0px;  /* ✅ */
  padding: 0pt;  /* ✅ */
  padding: 0em;  /* ✅ */
  padding: 0rem; /* ✅ */

  padding: 0;    /* ✅ */
}

This works for all length-based units and angle-based units, but does not work other types of values. The CSS spec requires units to be specified for duration, frequency, and resolution values — even for zero.

Length units

Unit Zero (with unit) Zero (without unit)
em 0em 0
ex 0ex 0
ch 0ch 0
rem 0rem 0
vw 0vw 0
vh 0vh 0
vmin 0vmin 0
vmax 0vmax 0
cm 0cm 0
mm 0mm 0
Q 0Q 0
in 0in 0
pc 0pc 0
pt 0pt 0
px 0px 0

Angle units

Unit Zero (with unit) Zero (without unit)
deg 0deg 0
grad 0grad 0
rad 0rad 0
turn 0turn 0

Duration units

Unit Zero (with unit) Zero (without unit)
s 0s
ms 0ms

Frequency units

Unit Zero (with unit) Zero (without unit)
Hz 0Hz
kHz 0kHz

Resolution units

Unit Zero (with unit) Zero (without unit)
dpi 0dpi
dpcm 0dpcm
dppx 0dppx

This means that, although leaving units off a zero for transitions seems to be correct, it is in fact invalid:

{
  transition: opacity 0 ease;  /* ❌ */
  transition: opacity 0s ease; /* ✅ */
}

Quirky! For further reading, see CSS Values and Units Module Level 3, Sections 5 and 6.