font 指定は html 要素に指定すべきか・body 要素に指定すべきか
font-family
や font-size
といったフォント指定は、html
要素に指定すべきか、body
要素に指定すべきか?
TL;DR : html
要素・body
要素、どちらに書いても別に変わんないから好きな方にしたらいい。
目次
参考にした文献
以下のような文献を読んでみたり、自分で色々と HTML・CSS を書いて検証してみたが、「html
要素に書いたから・body
要素に書いたから、こんな挙動の違いが出た」みたいなモノは見つけられなかった。 どっちにどう書こうが、結果は変わらなかった。
- CSS - Bootstrapはなぜhtmlとbody両方にfont-familyを記述しているのか?|teratail
-
非表示になっていることが前提とはいえ、その装飾を適用したい要素以外に装飾が適用され得る状態は好ましくない
html
要素自体のフォントを変えたいワケでないなら、body
要素に書いた方が良い
-
- Reboot & Type cleanup by MartijnCuppens · Pull Request #28698 · twbs/bootstrap
- Normalize.css は
html
要素に対しline-height
プロパティがあった - Bootstrap Reboot はフォント関連は全て
body
要素に寄せる方針になったが、コレはhtml
要素にてフォント情報を上書きした時に扱いやすくする意図がある
- Normalize.css は
- HTML vs Body in CSS | CSS-Tricks
font
やbackground
系はhtml
要素に書いた方が良いとしている
- css - Where to set font-family: body or html element? - Stack Overflow
body
要素に指定した方が、html
要素に指定した場合より詳細度が強く優先される
- 『CSSの実習(3) - 余白の指定』の発展学習 : 要素と要素へのスタイル附与
- CSS: * vs :root vs html vs body. What is the standard practice for setting defaults for font-size, font-family? - Stack Overflow
- ちなみに
html
要素よりも:root
要素の方が詳細度が強いので、より優先されるモノから順に書くと* < body < :root < html
となるのが基本
- ちなみに
html
要素に書きたい派
html
要素に書きたい派の一部は、font-size: 62.5%
などとして 10px
計算したがる、未だにピクセルパーフェクトでやろうとするダメダメデザイナータイプが多かった。だからこういうのは参考にしてはならない。
ただ、rem
単位は html
要素の状態から導かれるので、body
要素以降は相対的なサイズ指定のみにしておき、html
要素でルートサイズを指定する、という方法自体は覚えておくと良いのかもしれない。
html {
font-size: 20px; /* ココの数値を変えることで全体のフォントサイズを変更できる */
}
body {
font-size: 1rem; /* ベースは 20px となる */
}
h1 {
font-size: 2rem;
}
でもコレを以下のように書こうとするのは気に食わない。
html {
font-size: 62.5%; /* コレで 10px になったはず、だと? */
}
body {
font-size: 1.6rem; /* コレで 16px になったはず、だと? */
}
ブラウザのベースフォントサイズって変更可能なので、「62.5%
にしたから 10px
だー」って考えは浅はか。こういうことしようと思うことがそもそも間違ってるので、こういう文献はアテにしちゃあかん。
body
要素に書きたい派
Bootstrap Reboot は body
要素に寄せてあった。「rem
単位は html
要素に従う」といわれているものの、特にその違いを感じるような組み合わせは作れなかったので、body
要素にだけフォント指定を入れても全く問題ないようだ。
body
要素にフォント指定を書く理由はいくつか見られる。
- 前述のように、
body
要素はfont-size: 1rem
(未指定と同じ) にしておき、html
要素側でルートサイズを変更しやすくしておくため、というライブラリ作成者的な目線 - 俺たちは「
html
要素」や、それを継承する「head
要素」のフォントサイズを大きくしたいワケじゃないだろ?適用させるつもりのない要素に対するセレクタを書くのは気持ち悪いのだ、という意見- 実際そんなことは起こらないものの、
head
要素の中身がfont-size: 1.5rem
で画面に表示されても嫌だし、この理屈は分からんではない - ただコレは、
html
要素にoverflow
やmargin
プロパティの指定が必要なケースがあることも考えると、微妙に腑に落ちないところもある感じ
- 実際そんなことは起こらないものの、
- 昔の HTML では、
body
要素にbgcolor
やtext
といった属性を指定してフォント調整をしていた。basefont
要素もbody
要素の直後に配置したものだ。今までずっとフォント調整はbody
要素で行うモノだったのだから、CSS でもその方が自然だろう- 理屈は分かる
適用対象からしても、歴史的経緯からしても、body
要素でフォント指定するのが自然に読めるよな、というのはよく分かる。
俺はどうするか
自分は以前からずっと html
要素に寄せて書いている。
html
要素と body
要素にそれぞれ background-color
を指定すると、ページ内容が1画面内で収まっている時に、html
要素に指定した background-color
が下部に登場するので、html
要素には overflow
指定や height
指定をすることが多い。
それに合わせて、フォントなどの指定も html
要素に寄せていて、body
要素の方はほとんど空っぽだったりする。
*
は border-box
指定のみ、body
は margin
削除のみ、:root
は CSS 変数宣言のみ、そして html
要素はルートから全体の指定。ということで、継承や優先度には問題がないかなーと思っている。あちこちにスタイルが散らばらず html
要素にまとまるので見通しも良いかなーと思う。
最近は clamp()
を使ってルートフォントサイズを可変させる手法をよく使うが、それも html
要素で指定している。
body
要素に書いた方が適用対象が正確じゃね?という指摘はよく分かるのだが、結局 html
要素にも色々書くことになることが多いので、だったら html
要素に寄せちゃお〜、という感じである。