em, px, pt,
cm, in…CSS offers a number of different units for expressing length.
Some have their history in typography, such as point
(pt) and pica (pc), others are known from
everyday use, such as centimeter (cm) and inch
(in). And there is also a “magic” unit that was
invented specifically for CSS: the px. Does that mean
different properties need different units?
No, the units have nothing to do with the properties, but everything with the output media: screen or paper.
There is no restriction on which units can be used where. If a
property accepts a value in px ('margin: 5px') it also
accepts a value in inches or centimeters ('margin: 1.2in; margin:
0.5cm') and vice-versa.
But in general you would use a different set of units for display on screen than for printing on paper. The following table gives the recommended use:
| Recommended | Occasional use | Not recommended | |
|---|---|---|---|
| Screen | em, px, % | ex | pt, cm, mm, in, pc |
| em, cm, mm, in, pt, pc, % | px, ex |
The relation between the absolute units is as follows: 1in = 2.54cm = 25.4mm = 72pt = 12pc
If you have a ruler handy you can check how precise your device
is: here is a box of 1in (2.54cm) high: ↑
72pt
↓
The so-called absolute units (cm,
mm, in, pt and
pc) mean the same in CSS as everywhere else. A length
expressed in any of these will appear as exactly that size (within
the precision of the hardware and software). They are not
recommended for use on screen, because screen sizes vary so much. A
big screen may be 60cm (24in), a small, portable screen is maybe
only 8cm. And you don't look at them from the same distance.
The em and ex units depend on the font
and may be different for each element in the document. The
em is simply the font size. In an element with a 2in
font, 1em thus means 2in. Expressing sizes, such as margins and
paddings, in em means they are related to the font
size, and if the user has a big font (e.g., on a big screen) or a
small font (e.g., on a handheld device), the sizes will be in
proportion. Declarations such as 'text-indent: 1.5em' and 'margin:
1em' are extremely common in CSS.
The ex unit is rarely used. Its purpose is to
express sizes that must be related to the x-height of a font. The
x-height is, roughly, the height of lowercase letters such as
a, c, m, or o. Fonts that have the same size (and
thus the same em) may vary wildly in the size of their
lowercase letters, and when it is important that some image, e.g.,
matches the x-height, the ex unit is available.
The px unit is the magic unit of CSS. It is not
related to the current font and also not related to the absolute
units. The px unit is defined to be small but visible,
and such that a horizontal 1px wide line can be displayed with
sharp edges (no anti-aliasing). What is sharp, small and visible
depends on the device and the way it is used: do you hold it close
to your eyes, like a mobile phone, at arms length, like a computer
monitor, or somewhere in between, like a book? The px
is thus not defined as a constant length, but as something that
depends on the type of device and its typical use.
To get an idea of the appearance of a px, imagine a
CRT computer monitor from the 1990s: the smallest dot it can
display measures about 1/100th of an inch (0.25mm) or a little
more. The px unit got its name from those screen
pixels.
Nowadays there are devices that could in principle display
smaller sharp dots (although you might need a magnifier to see
them). But documents from the last century that used
px in CSS still look the same, no matter what the
device. Printers, especially, can display sharp lines with much
smaller details than 1px, but even on printers, a 1px line looks
very much the same as it would look on a computer monitor. Devices
change, but the px always has the same visual
appearance.
CSS also defines that raster images (such as photos) are, by
default, displayed with one image pixel mapping to 1px. Thus a
photo with a 600 by 400 resolution will be 600px wide and 400px
high. The pixels in the photo thus do not map to pixels of the
display device (which may be very small), but map to
px units. That makes it possible to exactly align
images to other elements of a document, as long as you use
px units in your style sheet, and not pt,
cm, etc.
px for font sizesCSS inherited the units pt (point) and
pc (pica) from typography. Printers have traditionally
used those and similar units in preference to cm or
in. In CSS there is no reason to use pt,
use whichever unit you prefer. But there is a good reason
to use neither pt nor any other absolute unit
and only use em and px.
Here are a few lines of different thickness. Some or all of them may look sharp, but at least the 1px and 2px lines should be sharp and visible:
0.5pt, 1px, 1pt, 1.5px, 2px
If the first four lines all look the same (or if the 0.5pt line is missing), you are probably looking at a computer monitor that cannot display dots smaller than 1px. If the lines appear to increase in thickness, you are probably looking at this page on a high-quality computer screen or on paper. And if 1pt looks thicker than 1.5px, you probably have a handheld screen.
The magic unit of CSS, the px, is a often a good
unit to use, especially if the style requires alignment of text to
images, or simply because anything that is 1px or a multiple of 1px
wide is guaranteed to look sharp.
But for font sizes it is even better to use em. The
idea is (1) to not set the font size of the BODY element (in HTML),
but use the default size of the device, because that is a size that
the reader can comfortably read; and (2) express font sizes of
other elements in em: 'H1 {font-size: 2.5em}' to make
the H1 2½ times as big as the normal, body font.
The only place where you could use pt (or
cm or in) for setting a font size is in
style sheets for print, if you need to be sure the printed font is
exactly a certain size. But even there using the default font size
is usually better.
To make it even easier to make style rules that depend only on
the default font size, a new unit is in development: the
rem. The rem (for “root em”) is the
font size of the root element of the document. Unlike the
em, which may be different for each element, the
rem is constant throughout the document.
Other units in development make it possible to specify sizes
relative to the reader's window. These are the vw and
vh. The vw is 1/100th of the window's
width and the vh is 1/100th of the window's height.