px
Screen pixel geometries vary wildly so using numbers like 1px
is rather vague
and inaccurate to how it will be displayed. Using pixels in a layout encourages
us to pretend that pixel perfect layouts are possible or even desirable.
For fonts especially pixels should be avoided as you will disregard/overwrite the user's chosen browser font sizes (rather than say, multiplying them).
rem
The units em, rem, ch, and ex
present no such issues as they are all relative
to the user's selected font sizes. Browsers and systems typically allow the
users to adapt the base
or body
sizes. This can be expressed as 1rem
and
your paragraph sizes should generally be that size as that's the user's selected
paragraph size. Fortunately it's the default value so you do not need to set it.
Headings should generally be larger, 2.5rem
for an <h2>
is common for
example.
Width-based @media
queries should generally be avoided. They represent the
hard coding of layout reconfigurations, and are not sensitive to the immediate
available space actually afforded the element of component in question. Scaling
the interface at a discrete breakpoint is arbitrary. What's so special about
960px
compared to 959px
?
vw
and vh
Using viewport units
instead will be relative to the browser's viewport size.
For example 1vw
is equal to 1% of the screen's width and 1vh
is equal to 1%
of the screen's height. Using viewport units and calc
to can create an
algorithm whereby dimensions are scaled proportionally, but from a minimum
value.
:root {
font-size: calc(1rem + 0.5vm);
}
The 1rem
part of the equation ensures the font-size
never drops below the
default value (1rem + 0vv = 1rem
).
em
The em
unit is relative to the immediate context rather than the outer
document. If I wanted to slightly enlarge a <strong>
element's font-size
within an <h2>
, I could use em
units:
h2 {
font-size: 2.5rem;
}
h2 strong {
font-size: 1.125em;
}
The strong inside an h2 is now 1.125 * 2.5rem = 2.53125rem
. If you instead
used rem
inside the strong it would simply override the value instead of
scaling it. As a rule of thumb em
units are better for sizing inline
elements whereas rem
are better for block elements. SVG icons are perfect
candidates for em
-based sizing.
ch
and ex
The ch
and ex
units pertain to the (approximate) width and height of one
character. Where 1ch
is the width of a 0
and 1ex
is the height of your
font's x
character (also known as the corpus size or x-height).
The ch
unit is often used to restrict an element's measure for readability.
Since measure is a question of characters per line, ch
(short for character)
is the appropriate unit for this styling task.
h2,
h3 {
max-inline-size: 60ch;
}
h3 {
font-size: 2rem;
}
h2 {
font-size: 2.5rem;
}