line-heightプロパティで単位のある値を使用する際の小技

ウェブページの文章の行の高さは、CSSのline-heightプロパティで設定しますが、emなどの単位がある値 (parcentageやlength) と、単位のない数値 (number) とでは、子孫要素に継承させた結果が異なります。一般的には、数値での設定が好ましいとされています。

今回は、em値を使用しても、数値を使用した場合と同様の結果を得る方法を紹介します。

line-heightプロパティの数値とem値を比較

数値はフォントサイズに乗算する数、em値はフォントサイズの文字数分です。

/* 行の高さは 1文字 16px 掛ける 2 */
.number {
  font-size: 16px;
  line-height: 2;
}

/* 行の高さは 1文字 16px の 2文字分 */
.length {
  font-size: 16px;
  line-height: 2em;
}

上記のCSSコードの .number .length の行の高さは、いずれも 32px です。

しかし、これらの子孫要素に継承される行の高さは異なります。

数値は数値そのものが継承されるため、子孫要素のフォントサイズが 32px の場合、行の高さは 32px 掛ける 264px になります。

一方、em値は、line-heightプロパティを設定した要素 (.length) で計算された値が継承されるため、子孫要素のフォントサイズが 32px の場合でも 32px のままです。

em値を使用して、数値と同様の結果を得るためには、継承させた結果が異なるという問題をクリアする必要があります。

継承させた結果が問題なら継承させなければ良い

継承させた結果が問題なら継承させないというのが結論になります。つまり、子孫要素にもline-heightプロパティを設定します。

しかし、この方法だと、継承させることで可能になる、要素内の行の高さを一括で変更できるという利便性が無くなってしまいます。

そこで、継承させることで得られるメリットと、継承させないことで得られるメリットの両方を享受するためにカスタムプロパティ (CSS変数) を使用します。

.parent {
  --line-height: 2em;
  font-size: 16px;
  line-height: var(--line-height);
}
.parent * {
  line-height: var(--line-height);
}
.parent .descendant {
  --line-height: 1.5em;
}

上記のCSSコードの親要素 (.parent) とすべての子孫要素 (*) にline-heightプロパティを設定します。その値は、line-heightカスタムプロパティで設定した値を使用します。

行の高さを変更したい場合は、line-heightプロパティを上書きするのではなく、line-heightカスタムプロパティを設定します。

こうすることで、数値で継承させた場合と同様の結果がem値でも得られるようになり、継承による利便性は、カスタムプロパティで代替させることができます。

line-heightプロパティでem値を使用したいケース

line-heightプロパティにem値を使用したくなるケースとしては、行内の文字列の上下にpxやremといった単位を使用したい場合です。

/* 文字列の上下に 0.5rem の余白、行間は 1rem */
.rem {
  --line-height: calc(1em + 1rem);
}

CodePen

See the Pen line-height by nov (@numerofive) on CodePen.

カスタムプロパティをうまく活用すると、それまで出来なかったことが出来るようになるという好例じゃないでしょうか。

関連記事