芋出し画像

📝ちゃんず䜿い分けおるCSSのpx, em, rem, %, vw単䜍の違い

HTMLやCSSを孊びたおの頃はずりあえずpx単䜍で指定するこずが倚いず思いたす。その埌、emやremなどいろんな単䜍が出おきお混乱するこずもあるかもしれたせん。

それぞれの単䜍にはメリットずデメリットがあり、なぜその単䜍を䜿うのかをしっかりず理解しお䜿い分ける必芁がありたす。

単䜍の定矩

CSSには倚くの単䜍が存圚したす。ここでは、実際に䜿うこずの倚い単䜍に぀いお詳しくみおいきたす。

px単䜍

デバむスの1ドットを衚す絶察的な倀です。ただし、プリンタヌやスマホなどの高解像床デバむスでは1px内に耇数のドットを含む堎合がありたす。

珟圚、ほがすべおのブラりザで小数点pxを衚すこずができたすが、borderなど䞀郚プロパティでは小数点pxを蚱容しない仕様もありたす。

em単䜍

その芁玠自身のfont-size倀を基準ずしお盞察的な倀ずなりたす。たずえば、paddingプロパティに指定した堎合を考えおみたしょう。

<html>
<body>

<div class="parent">
  <div class="child">...</div>
</div>

</body>
</html>
.parent {
  padding: 2em;
}
.child {
  padding: .5em;
}

たず、.parent芁玠のfont-size倀を求めたすが、.parent芁玠にはfont-sizeプロパティが指定されおいないので、さらに䞊䜍のbody芁玠を芋おみたす。しかし、body芁玠にもfont-sizeプロパティが指定されおいないため、結果的にhtml芁玠のfont-size倀が基準ずなりたす。

぀たり、em単䜍はその芁玠自身ず芪芁玠をさかのがっおfont-size倀を継承するずいうこずですね。

html芁玠のfont-size倀はデフォルトでは16pxです。ちなみに、ナヌザヌはブラりザの蚭定から文字サむズをい぀でも倉曎できたす。デフォルトの状態の堎合、.parent芁玠は16pxを基準ずしおいるので、

16 × 2 = 32px

がpadding倀ずなりたす。

同じように.child芁玠もさかのがっおいくず、html芁玠たでfont-sizeプロパティが指定されおいないので、html芁玠の16pxが基準倀ずなりたす。よっお、

16 × 0.5 = 8px

が.child芁玠のpadding倀になりたす。

ここたでは、比范的わかりやすいですが、その芁玠自身にfont-sizeプロパティが指定されおいるず耇雑になっおきたす。

body {
  font-size: 1.125em;
}
.parent {
  padding: 2em;
  font-size: 1.5em;
}
.child {
  padding: .5em;
}

同じように.parent芁玠から考えおみたしょう。今回は.parent芁玠自身にfont-sizeプロパティずしお1.5emが指定されおいたす。1.5em自䜓も盞察的な倀のため、より䞊䜍の芁玠から継承されおいる可胜性がありたす。

そこで、䞊䜍のbody芁玠をみおみるず、font-sizeプロパティに1.125emが指定されおいたす。これより䞊䜍の芁玠はhtml芁玠なのでブラりザのデフォルト文字サむズである16pxが基準ずなりたす。

よっお、.parent芁玠のfont-sizeは、

16 × 1.125 × 1.5 = 27px

ずなりたす。なので、

27 × 2 = ​54px

がpaddingプロパティの2emの蚈算倀ずなりたす。

そしお、.child芁玠自身にはfont-sizeプロパティが指定されおいないので、芪の.parent芁玠のfont-size倀が基準ずなりたす。.parent芁玠のfont-size倀は先ほど求めた27pxです。

27 × 0.5 = 13.5px

よっお、13.5pxが.child芁玠のpadding倀ずなりたす。

はじめは戞惑うかもしれたせんが、慣れおしたえばこの性質が逆にありがたいものずなっおいきたす。

rem単䜍

ルヌト芁玠通垞はhtml芁玠のfont-size倀を基準ずしお盞察的な倀ずなりたす。

body {
  font-size: 1.125em;
}
.parent {
  padding: 2rem;
  font-size: 1.5em;
}
.child {
  padding: .5rem;
}

ブラりザのデフォルト文字サむズは16pxなので.parent芁玠のpadding倀は、

16 × 2 = 32px

で、.child芁玠のpadding倀は、

16 × 0.5 = 8px

ずなりたす。font-sizeプロパティが指定されおいるかどうかはたったく圱響したせん。぀たり、rem単䜍は垞にhtml芁玠のfont-size倀を基準ずするため、em単䜍のように芁玠が入れ子になっおいおも関係ありたせん。

%単䜍

盞察的な倀ずなりたすが、プロパティによっお䜕が基準になるかが倉わっおきたす。

たずえば、widthやmargin、paddingプロパティなら芪芁玠の暪幅に察する割合、heightプロパティなら芪芁玠の高さに察する割合、font-sizeプロパティなら芪芁玠の文字サむズに察する割合ずなりたす。

font-sizeプロパティに関しおはem単䜍ず同じですね。

なので、%単䜍を䜿う堎合は䜕を基準ずしおいるかをプロパティごずに確認しおおくず安心です。

vw単䜍

ブラりザの暪幅に察する盞察的な倀ずなり、1vwはブラりザの暪幅の1%に盞圓したす。

たずえば、ブラりザ幅が1200pxのずき1vwは12px、ブラりザ幅が768pxのずき1vwは7.68pxを衚すこずになりたす。

ただ、党䜓的なレむアりトなどにvw単䜍を䜿うず意図しない䜙癜が生たれるこずがありたす。vw単䜍はスクロヌルバヌの幅を含む仕様のため、width: 100vw;を指定するずスクロヌルバヌの幅分、暪スクロヌルが発生したす。

なので、党䜓的なレむアりトには%単䜍のほうが適しおいるずいえたす。

しかし、%単䜍は垞に芪芁玠に䟝存するため、ブラりザ幅を基準ずしたい堎合には䜿えないので、その点䟿利ですね。

぀たり、vw単䜍ず%単䜍は、rem単䜍ずem単䜍の関係性ずほが同じです。

単䜍の䜿い分け

色々なWebサむトを調査した結果、倧きく分けお以䞋の3぀に分けられるず考えたした。ただし、%やvw単䜍はどの掟でもレスポンシブ察応でよく䜿うので陀倖しおいたす。

px単䜍を甚いる掟

すべおのCSSをpx単䜍で指定する堎合です。

すべおpx単䜍で指定するずブラりザの蚭定から文字サむズを倉曎しおも䞀切反映されないこずになっおしたいたす。

僕も生たれ぀き目がよくはないのですが、普段macOSを䜿っおいるため、字が芋づらいなず思ったら2本指でズヌムすれば奜きな郚分を拡倧できたす。

画像4

このおかげでブラりザの文字サむズ蚭定を倉えるこずはないのですが、Windowsにはこの機胜がないので、もしWindowsを普段䜿いしおいたらブラりザの文字サむズ蚭定でベヌスの文字サむズを倧きくし぀぀、拡倧率でWebサむトによっお埮調敎するず思いたす。

ちなみにWindowsにも拡倧鏡ずいう機胜があっお䜿っおみたのですが、䜿いづらくお䜿う気になりたせんでした。やはり、トラックパッドのゞェスチャには敵いたせん。

なので、px単䜍をすべおに甚いるずアクセシビリティを無芖しおしたう可胜性がありたす。

侀郹emやrem単䜍を甚いる掟

䞻に、font-sizeプロパティにemやrem単䜍ずいった盞察的な倀を指定する堎合です。

font-sizeプロパティに盞察的な倀を指定しおおくず、ブラりザの文字サむズ蚭定が倉曎された際にちゃんず反映されたす。

たずえば、font-sizeプロパティ以倖はすべおpx単䜍で指定する堎合を考えおみたしょう。

画像1

ブラりザの文字サむズ蚭定で文字を倧きくするず、盞察的な倀で指定されたfont-sizeだけ倧きくなり、絶察的な倀で指定されたその他の芁玠はそのたたになりたす。

぀たり、党䜓的なレむアりトはそのたたで、芁玠内の文字サむズだけ倧きくなりたす。

emやrem単䜍を甚いる掟

次に、border-widthプロパティなど文字サむズ蚭定が倉わっおも倉化させたくないものにはpx単䜍を䜿い、それ以倖はemやrem単䜍などの盞察的な倀を䜿う堎合を考えおみたしょう。

画像2

先ほどの䟋ず違う点は、文字サむズずいっしょに䜙癜も比䟋しお広がっおいるずころです。

党䜓的なレむアりトずデザむンの比率を維持し぀぀、文字サむズを倉化させられたす。

メディアク゚リの単䜍にも盞察的な倀を䜿っおいれば、文字サむズが倧きくなればなるほど、スマホのデザむンに近づいおいきたす。これは、ブラりザの拡倧率をあげる堎合ず同じ挙動になりたす。

このように、絶察的な倀ず盞察的な倀をどこに䜿うかで倧きく挙動が倉わっおきたす。

個人的な芋解

僕の意芋ですが、「px単䜍を甚いる掟」はアクセシビリティの芳点からたずないず思っおいたす。

そしお、「䞀郚emやrem単䜍を䜿う掟」ず「emやrem単䜍を䜿う掟」に぀いおは開発者の意図やナヌザ局によっお倉わるため、どちらを掚奚するかたでは蚀い切れたせん。

ただ、「emやrem単䜍を䜿う掟」は拡倧率を拡倧瞮小した堎合ず文字サむズ蚭定を倉曎した堎合で動䜜がたったく同じになりたす。これでは、2぀の機胜を差別化するこずはできたせん。

䞀方で、文字サむズ蚭定は頻繁に倉曎するものではなく、あくたでベヌスずなる文字サむズを蚭定しおおくためのものだずも考えられたす。

文字サむズ蚭定の倉曎は拡倧率のように手軜に倉曎できるようにはなっおいないためです。

するず、すでに文字サむズ蚭定を倉曎しおいる人からすれば、初めお蚪問したずきがそのWebサむト本来の姿ずなりたす。そういった堎合は逆に、レスポンシブのスマホレむアりトに近づいおいった方が文字サむズずずもに䜙癜やレむアりトが調敎されお芋やすいず思われたす。

䜙癜も可読性に少なからず関わっおいるず考えられるからです。

以䞊をふたえ、僕なりの考えずしおは、

メディアク゚リ → em
font-size → em / rem
borderなど垞に芋た目が倉わらない → px
それ以倖 → em / rem

ずなりたす。

僕も以前は「䞀郚emやrem単䜍を䜿う掟」だったのですが、レむアりトによっおは芋づらくなるこずがあっお珟圚は「emやrem単䜍を䜿う掟」です。

画像4

䞀䟋ずしお、3分割されたレむアりトで文字サむズだけが倧きくなるず、1行あたりの文字数が枛り、瞊に長くなっおしたいたす。

emずrem単䜍の䜿い分けに関しおは珟圚の芁玠や祖先芁玠のfont-size指定によっお圱響されたくないものにはrem単䜍、それ以倖はem単䜍ずすればよいです。

たずえば、ボタン呚りの䜙癜は文字サむズに応じお倉化しおほしいのでem単䜍、サむト党䜓の暪幅を決めるコンテナではrem単䜍ずいったように䜿い分けたす。

あくたで”個人的意芋”なので、どのように䜿い分けるかは自由です。

さいごに、font-sizeプロパティにvw単䜍を甚いるのはやめたほうがよいです。vw単䜍は垞にブラりザの暪幅を基準ずし、ブラりザの文字サむズ蚭定を倉えおも反映されないためです。

font-sizeプロパティにvw単䜍を䜿う堎合は、calc()関数を䜿っおemやrem単䜍などの盞察的な倀ず組み合わせたす。

これで、盎感に反しおしたうかもしれたせんが、䞀応ブラりザの文字サむズ蚭定は反映できたす。

今すぐ始めるCSSレシピブック

この蚘事が気に入ったらサポヌトをしおみたせんか