How CSS line-height works and best practices

Michael Lazarski
3 min readFeb 5, 2019

--

The `line-height` CSS property defines the space between two inline elements. The typical use is, to space-out text. You can see people comparing it to ‘leading’ which is a term used in typography that refers to the space between the baseline of two lines of text. `line-height` works differently. It adds space above and under the text.

Left: Leading, Right: line-height

Usage

You can use `line-height` with different values like this:


body {
line-height: normal; /* default */
line-height: 2;
line-height: 1em;
line-height: 1rem;
line-height: 200%;
line-height: 20px;
}

Oh boy 😧! That’s a lot. Let’s get through them one by one 👍.

Default value and unitless value

‘normal’ is the default value if you don’t set it to something different. Usually, this means that it is set to `1.2`, this depends on the browser vendor. So what does just a number value without any unit mean? It is actually a multiplier. It takes the `font-size` value and multiplies it by `1.2`. Let’s calculate the height of one line with the following example.

body {
font-size: 16px;
line-height: 1.5;
}

We just have to do the following calculation: 16 * 1.5 = 24px. So we now know that our text will have a minimum height of 24px. So it will add 4 pixels under the text and above it. Cool that easy 😎!

em and rem

Next one is `em` and `rem`. `rem` is relative to the `font-size` of the root element and `em` is relative to the current elements font-size. Here is an example

html {
font-size: 12px;
}
.remExample {
font-size: 16px;
line-height: 1.5rem; /* line-height will be 12 * 1.5 = 18px */
}
.emExample {
font-size: 16px;
line-height: 1.5em; /* line-height will be 16 * 1.5 = 24px */
}

Percentage

The % value is a little bit tricky to read. 100% means multiply by 1. Again an example to make it clear.


body {
font-size: 12px;
}
.percentage {
font-size: 24px;
line-height: 1.5%; /* line-height will be 16 * 1.5 = 24px */
}

pixel (px)

The easiest also most confusing one for me is the `px` value. Setting it to any pixel value will set it to exactly this value. So if your `font-size` for example is 16px and you set `line-height` to 12px your font will be bigger then the container it is wrapped in. In general, you should try to avoid using `px` values in line-height!


body {
font-size: 16px;
}
.pixel {
line-height: 12px;
}

Some best practices

In general, I would start with setting the `font-size` and `line-height` in the `body` element to the following values.

body {
font-size: 16px;
line-height: 1.5;
}

From this, you can build all your other stylings. I would try to avoid using anything else then unitless numbers. Also, try to use a value for the `font-size` that easily divided, like 16 or 12. This will help you to keep balance in your design. You can use this in `margin`s and `padding`s too. It’s easier to calculate 16 * 1.5 in your head then for example 13 * 1.5. You then will always know what the actual value is.

body {
font-size: 16px;
line-height: 1.5;
}
h1, h2, h3, h4, ul, ol {
margin-bottom: 15rem;
}
button {
display: inline-block;
padding: 0.75rem 1.5rem;
}

Of course, you can experiment with this and there will be exceptions to these rules but this is how I always start.

Resources

- http://www.indesignskills.com/tutorials/leading-typography/
- https://developer.mozilla.org/en-US/docs/Web/CSS/line-height
- https://www.w3schools.com/cssref/pr_dim_line-height.asp
- https://css-tricks.com/almanac/properties/l/line-height/
- https://ux.stackexchange.com/questions/35270/is-there-an-optimal-font-size-line-height-ratio

Thanks for reading!

Say Hallo! Instagram | Twitter | LinkedIn | dev.to

--

--