2020.09.03 [木] CSSの単位
9月3日、トライデントコンピュータ専門学校では、まだまだ夏休みです。
以前から書いていますが、長期期間中には時間が取りやすいので、普段はなかなか深堀りできないことを調べてみても良いのではないでしょうか。
今回は、CSSの単位についてちょっと調べてみました。

CSSの仕様書は、W3Cが策定しています。
単位に関する使用は「CSS Values and Units Module Level 4」のLengthに書かれています。
このLevel4は、まだ草案段階ですので、ブラウザが対応していない新しい単位も紹介されていたりします。
長さは距離の測定値を指し、プロパティ定義では<length>で表されます。長さは寸法です。
長さが0の場合、単位識別子はオプションです(つまり、構文的には<number>0として表現できます)。しかし、0がプロパティ(line-heightなど)で<number>または<length>のどちらかとして解析される場合は、<number>として解析されなければなりません。
プロパティは、lengthの値をある範囲に制限することができます。値が許容範囲外の場合、その宣言は無効であり、無視しなければなりません。
いくつかのプロパティでは負の長さの値を許可していますが、これは書式を複雑にする可能性があり、実装固有の制限があるかもしれません。負の長さの値が許可されていても対応できない場合は、対応できる最も近い値に変換する必要があります。
使用される長さがサポートできない場合,ユーザエージェントは,実際の値で近似しなければならない。
長さの単位には、絶対値と相対値の2種類がある。
上記のように、単位には絶対単位と相対単位があると明記されています。
では、その絶対単位と相対単位に分けて調べたいと思います。
絶対単位(Absolute Lengths)
絶対単位とは、他の長さとの関係で決まりません。
一般的にこの単位は常に同じサイズとして扱われます。
単位 | 名前 | 他の単位との関係 |
---|---|---|
cm | センチメートル(centimeter) | 1cm = 96px/2.54 |
mm | ミリメートル(millimeter) | 1mm = 1/10 cm |
Q | 四分ミリメートル(quarter-millimeter) | 1Q = 1/40 cm |
in | インチ(inch) | 1in = 2.54cm = 96px |
pc | パイカ(pica) | 1pc = 1in の 1/6 |
pt | ポイント(point) | 1pt = 1in の 1/72 |
px | ピクセル(pixel, "画素") | 1px = 1in の 1/96 |
長さの絶対単位はすべて互換性があり、px はそれらの標準単位です。
pxは親要素の影響を受けず、相対単位の時、子要素の基準となります。
フォントサイズ:30px
フォントサイズ:16px
div{ font-size:30px; border: 1px solid #ccc; } p.size16px{ font-size:16px; }
親要素div
内にp
を二つ用意して、それぞれ文字を設置します。
div
には、font-size:30pxを設定し、一つのpには、font-size:16pxを設定します。
font-size:16pxを設定していないp
は、div
に設定した30pxのフォントサイズで表示され、font-size:16pxで設定したp
は、親要素のdiv
の影響を受けず、そのまま16pxのフォントサイズが表示されます。
相対単位(Relative Lengths)
相対単位とは、何かとの比較によってサイズが決まります。それは、親要素のフォントサイズやビューポート(画面幅)などになります。
フォント基準
親要素のフォントサイズや、ルートのフォントサイズを基準にした単位です。
単位 | 名前 | 相対基準 |
---|---|---|
em | element | 要素のフォントサイズ |
ex | element x-height | 要素のフォントの"x"の高さ |
cap | cap height | 要素のフォントの cap-高さ(大文字の名目上の高さ) |
ch | chracter unit | 要素のフォントにおける半角グリフの平均 文字送り幅ー文字 "0"(U+0030 ZERO)のグリフで表現される。 |
ic | 要素のフォントにおける全角グリフの平均 文字送り幅ー文字 "水"(CJK 表語文字, U+6C34 )のグリフで表現される。 | |
rem | root element | ルート要素のフォントサイズ |
lh | line height | 要素の行高 |
rlh | root line height | 根要素の行高 |
親要素のフォントサイズとの相対単位は、em, ex, cap, ch, icとなります。
lhは、親要素のline-heightとの相対単位になります。
フォントサイズ:30px
フォントサイズ:16px
フォントサイズ:1em
フォントサイズ:1ex
フォントサイズ:5cap
フォントサイズ:1ch
フォントサイズ:5ic
フォントサイズ:5lh
div{ font-size:30px; font-family:sans-serif; } p.size16px{ font-size:16px; } p.size18px{ font-size:1em; } p.size1ex{ font-size:1ex; } p.size1cap{ font-size:5cap; /*ブラウザが対応していません。*/ } p.size1ch{ font-size:1ch; } p.size1ic{ font-size:5ic; /*ブラウザが対応していません。*/ } p.size1lh{ font-size:5lh; /*ブラウザが対応していません。*/ }
em
親要素のfont-sizeの要素に継承されたフォントの大きさを表します。
親要素に10pxが設定されていた場合、子要素に1.2emが設定されていた場合、12pxが表示されます。
ex
親要素のfontにおける x-height です。
"x"の文字を持つフォントでは一般的に、フォントにおける小文字の高さに相当します。
x-heightを測定することが不可能または非現実的な場合、0.5em(=1ex)の値が設定されます。
ch
親要素fontにおける"0"の幅に相当します。
"0" の文字の大きさを判断することが不可能または無意味である場合、幅が0.5em、高さが1emと仮定されます。
先程の絶対単位の例と同様にdiv
にfont-size:30pxを、子要素にはfont-size:16pxを設定したp
を置いてあります。
1emを設定したp
は、div
に設定した30pxのフォントサイズ:1(相対)で表示されます。1exもdiv
の30pxの"x"の縦の長さ:1(相対)、1chも同様にdiv
の30pxの"0"の幅:1(相対)で表示されています。
capとic、lhに関しては、まだ非対応のブラウザが多いので、実際の表示はできません。
Code Penで、それぞれ5cap、5ic、5lhを設定してみましたが、そのまま親要素のフォントサイズが継承されて表示されました。
ルート要素のフォントサイズとの相対単位は、remです。
rlhは、ルート要素のline-heightとの相対単位になります。
フォントサイズ:30px
フォントサイズ:16px
フォントサイズ:1em
フォントサイズ:1rem
フォントサイズ:5rlh
:root{ font-size:24px; } div{ font-size:30px; font-family:sans-serif; } p.size16px{ font-size:16px; } p.size1em{ font-size:1em; } p.size1rem{ font-size:1rem; } p.size1rlh{ font-size:5rlh; }
rem
ルート要素(ふつうは )のfont-sizeを基準とした相対値になります。
ルートに24pxを設定して、フォントの大きさを比べてみましょう。
remは、ルートのフォントサイズとの相対単位ですので、div
にfont-size:30pxの子要素ですが、影響を受けていません。
:rootの24pxとの:1(相対)で表示されています。
rlhは、lhと同じように対応しているブラウザは、まだありませんが、コリスで使い方などが紹介されていました。
ビューポート基準
viewportのサイズを基準とした単位になります。
viewportとは、Webサイトの表示領域のことを言います。端的に言えばブラウザのウインドウの広さのことです。

単位 | 名前 | 相対基準 |
---|---|---|
vw | viewport width | ビューポート幅の1% |
vw | viewport height | ビューポート高さの1% |
vi | viewport’s inline | インライン方向のビューポートのサイズの1% |
vb | viewport’s block | ブロック方向のビューポートのサイズの1% |
vmin | viewport’s minimum | vwとvh の小さい方のサイズの1% |
vmax | viewport’s maximum | vwとvh の大きい方のサイズの1% |
viewportとの相対単位は、vw, vh, vmin, vmaxとなります。
viはインライン方向のviewportサイズとの相対単位、vbはブロック方向のviewportサイズとの相対単位になります。横書きの場合と日本語の縦書きの場合では対象が縦横逆になります。
viとvbは、まだ対応するブラウザがありません。
ビューポート:width:px, height:px
フォントサイズ:1em
フォントサイズ:5vw
フォントサイズ:5vh
フォントサイズ:1vi
フォントサイズ:1vb
フォントサイズ:5vmin
フォントサイズ:5vmax
:root{ font-size:16px; } div{ font-size:30px; font-family:sans-serif; } p.size1em{ font-size:1em; } p.size1vw{ font-size:5vw; } p.size1vh{ font-size:5vh; } p.size1vi{ font-size:1vi; } p.size1vb{ font-size:1vb; } p.size1vmin{ font-size:5vmin; } p.size1vmax{ font-size:5vmax; }
vw
ビューポートの初期値の"幅"の1%と同じです。
vh
ビューポートの初期値の"高さ"の1%と同じです。
vmin
vwとvh の小さい方です。
vmax
vwとvh の大きい方です。
Code Penでは、Result画面のサイズがviewportとなるようです。記事に埋め込んだ時のサイズが小さいので若干大きく5vw, 5vh, 5vmin, 5vmaxに設定しました。
ビューポートのサイズを基準にしていますので、親要素div
のフォントサイズやrootの影響を受けていません。
vwは、ビューポートのwidthサイズ1%:5(相対)で表示され、vhは、heightサイズ1%:5(相対)で表示されています。
vmin, vimaxは、それぞれvw, vhの小さい方・大きい方と同サイズになっています。
See the Pen 相対単位_viewport by tridentwebdesign (@tridentwebdesign) on CodePen.
今回は、フォントサイズのみで検証してみましたが、単位はmarginやpadding, widthなど長さを表す部分に利用できます。
文字サイズを基準にすることで、読みやすいレイアウトや、ビューポートを基準にして多岐にわたるデバイスや状況によって最適なレイアウトなども実装できます。
せっかく使える単位ですので、最適な単位を利用していきたいですね。
参考:The new (and old) CSS units you've never heard about
- 関連記事
-
- JavaScriptで要素を挿入する。 (2023/09/30)
- map()?new Map? (2023/08/10)
- ポートフォリオサイトを印刷用CSSでプリントする。 (2022/03/05)
- @useの使い方がわからない…ので (2022/02/12)
- display:contentsを使ってみたい。 (2021/09/30)
- jQueryだっていいじゃない。 (2021/03/09)
- TypeScriptってなんだ?! (2021/03/01)
- CSSの単位 (2020/09/03)
- JavaScriptのclassについて、書いてみた。 (2019/12/30)
- picture要素と、source要素と、srcset属性と (2018/10/02)