ことの始まり
最近、フロントエンドを勉強し直しているのですが、インライン要素はline-height
で縦方向の中央揃えができる、という話を聞きました。
お手軽で便利ですね。
ところがこれ、画像と並べただけで割と簡単にこわれます。
理由が気になったので色々と調べてみたところ、
どうも高さが不揃いの要素が並ぶとうまく機能しないようです。
これは、インライン要素のbaseline
という概念が関係しています。
baseline とは
端的に説明すると、文字列の下端を貫く線です。
アルファベットのg
やy
のようにはみ出す無作法者もいますが、基本的に文字はbaseline
を基準に整列しています。
インライン要素が複数並ぶとき、一本のbaselineが用意され、それに沿って要素が配置されます。
これが重要です。
意外にも画像はブロック要素ではなくインライン要素であり、baseline
があります。
baseline
は下端と一致しています。
これが画像と並んだときに、文字が中央揃えされない理由でした。
vertical-align というプロパティ
ところで、インライン要素にはvertical-align
というプロパティがありbaseline
がデフォルト値になっていますが、text-top
、text-bottom
、middle
などを指定することも可能です。
試してみましょう。
これはなに???
この現象がこの記事を書こうと思ったきっかけでした。
更に調査してみましょう。
ブラウザが壊れてしまったかのような表示ですが、一つ一つ検証してひもといてみましょう。
text-top と text-bottom
MDN によると、text-top
およびtext-bottom
は以下のような定義になっています。
- text-top
- 要素の上端を親要素のフォントの上端に揃えます。
- text-bottom
- 要素の下端を親要素のフォントの下端に揃えます。
順に見ていきましょう。
まず、line-height: 100px
を指定された文字があります。
これの横にtext-top
を指定された文字を並べます。
要素の上端をフォントの上端に揃えるので、緑色の円で示したラインが接続されます。
さらにtext-bottom
を指定された文字を並べます。
要素の下端をフォントの下端に揃えるので、緑色の円で示したラインが接続されます。
さあ、完成しました。これがline-height
を指定されたtext-top
とtext-bottom
の配置です。
top と bottom と middle
MDNには以下のようにあります。
- top
- 要素と子孫要素の上端を行全体の上端に揃えます。
- bottom
- 要素と子孫要素の下端を行全体の下端に揃えます。
- middle
- 要素の中央を親要素の baseline + x-height の半分 に揃えます。
一気に配置しましょう。こういうことです。
-
top
は要素の上端を揃えるので、上の赤線を接続。 -
bottom
は要素の下端を揃えるので下の赤線を接続。 -
middle
はbaseline
を基準に要素の中心を揃えるので緑線を接続。
(矢印部分がx-height
の半分にあたります)
これが完成形です。いかがでしょうか?
最後にもう一度、実際の配置を見てみましょう。
実際には、line-height
と行全体の上下端
は別なのですが、通常はほぼ近似するため、今回は同一のものとして説明させていただきました。
(よく見ると、text-bottom
とtop
が少しずれて並んでいますよね)
蛇足
line-height
と行全体の上下端
が別であると考えるきっかけとなったサンプルです。
-
line-height
が水色の領域 -
フォントの上下端
は見た目通り文字の上下端 - そして、(おそらく)
行全体の上下端
がtop
とbottom
の配置から推測できます。
line-height
を大きくしても、行全体の上下端
が一緒に広がるわけではないということですね。
あれこれと表示をいじった末の推測ですので、間違いがあったら教えてください。