CSSのdisplay:inline-blockを中央寄せするには?
2022/12/12
要素のdisplay
をinline-block
に変更することで、複数の要素を横に並べることができ、また幅と高さを指定できるようになります。
inline-block
要素は、よく「ブロック要素とインライン要素の良いとこ取り」などと表現されます。
しかし、両方の性質を持ち合わせている分、扱い方がところどころブロック要素的であったり、インライン要素的であったりします。
もっぱらinline-block
要素の取り扱いで迷うのは「中央寄せ」です。
ブロック要素と同様に「margin: 0 auto
」で中央寄せを試みて上手くいかない…なんていう初学者も多いのではないでしょうか。
そこで今回は、そんなinline-block
要素を水平方向(左右)または垂直方向(上下)で中央に配置するための方法を解説します。
もくじ
1.そもそもinline-blockとは?inlineやblockとの違い
まず、具体的なテクニックの解説に入る前にinline-block
要素の基本について、おさらいしておきたいと思います。
(※基本を把握されている方や、すぐに問題を解決したい方はこの章を読み飛ばしてください。)
そもそも「inline-block
」とは、要素の表示形式を決めるCSSプロパティ「display
」の値の一つです。
要素の表示形式とは?と疑問が湧くかもしれませんが、各値の役割や性能、それぞれの違いを理解すればイメージしやすくなります。
inline-block
以外のdisplay
の値として、主に以下2点があります。
inline
block
これら以外にCSS3から追加された「flex
」がありますが、今回は説明を省きます。
inline
またはblock
が反映されている要素のことを、それぞれ「インライン要素」「ブロック要素」と呼称します。
まず、インライン要素の特徴は以下の通りです。
- 改行が入らない(要素を横に並べることができる)
- 幅と高さを変えられない(デフォルトのサイズは中身にフィット)
- 余白を指定できない
デフォルトでdisplay
にinline
が指定されている要素として「a
」「span
」「strong
」「b
」「img
」などがあります。
今度は、ブロック要素の特徴を見てみましょう。
- 改行が入る(要素を横に並べられない)
- 幅と高さを指定できる(デフォルトはブラウザ幅一杯に広がる)
- 余白を指定できる
デフォルトでdisplay
にblock
が指定されている要素として「div
」「p
」「ul
」「table
」などがあります。
あと「h
」から始まる見出しタグもブロック要素の一つですね。
一方、display
をinline-block
に指定した場合、すなわちにinline-block
要素には以下のような特徴があります。
- 改行が入らない(要素を横に並べることができる)
- 幅と高さを指定できる(デフォルトのサイズは中身にフィット)
- 余白が指定できる
このようにinline-block
要素は、インライン要素とブロック要素の特徴を掛け合わせたような機能を持っています。
ちなみ、displayにデフォルトの値が指定されている要素であっても、他の表示形式に変更することができます。
例えば、div
のデフォルトはblock
ですが、CSSでdisplay
にinline
やinline-block
を指定することでき、各表示形式の特徴が上書きされます。
2.inline-blockにはmargin: 0 autoは効かない
ブロック要素を真ん中に寄せる方法としてmargin: 0 auto
があります。
例えば、以下のように使用します。
1 2 3 4 5 6 |
.sample { width: 200px; height: 200px; margin: 0 auto; background: tomato; } |
ただし、方法で中央寄せするには、ブロック要素に横幅が指定(2行目)されている必要があります。
では、上記の要素の表示形式をinline-block
に変更してみましょう。
1 2 3 4 5 6 7 |
.sample { display: inline-block; width: 200px; height: 200px; margin: 0 auto; background: tomato; } |
結果は下図のとおりです。
ご覧の通り、枠内の中央に配置できていないのがわかります。
margin: 0 auto
では、ブロック要素を中央寄せにできますが、inline-block
要素には効果が無いようです。
3.inline-blockを水平方向(左右)に中央寄せにする方法
では、inline-block
要素を中央に寄せるにはどうしたら良いでしょうか?
まず、左右の中央(水平上の真ん中)に寄せる方法として、以下3パターンを紹介します。
- 親要素の
text-align
をcenter
に指定する - 親要素の
justify-content
をcenter
に指定する position
とleft
で中央に移動させる
それぞれ詳しく解説していきます。
3-1.親要素のtext-alignをcenterに指定する
最も簡単なのは、親要素のtext-align
をcenter
に変更する方法です。
例えば、以下のようにブロック要素が入れ子になっている状態を想定してください。
1 2 3 |
<div class="parent"> <div class="child"></div> </div> |
このうち.childのdisplay
をinline-block
に変更し、中央寄せを試みます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
.parent { width: 600px; padding: 20px; border: 1px solid #333; text-align: center; } .child { display: inline-block; width: 200px; height: 200px; background: steelblue; } |
結果は下図のとおりです。
このように親要素のtext-align
をcenter
に変更することで、inline-block
の子要素を中央寄せすることができます。
ポイントはtext-align: center
をinline-block
要素ではなく、親要素に指定する点です。
インライン要素と同じ要領ですね。
3-2.親要素のjustify-contentをcenterに指定する
親要素のdisplay
がflex
である場合は、justify-content
をcenter
にすることで、同様な結果を得られます。
例えば、以下のようにです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
.parent { display: flex; justify-content: center; width: 600px; padding: 20px; border: 1px solid #333; } .child { display: inline-block; width: 200px; height: 200px; background: steelblue; } |
display: flex
は、いわゆるフレックスボックスと呼ばれるCSS3から追加されたレイアウト技法のことです。
主にブロック要素を横並びにしたい時などに用いられ、inline-block
要素にも効果があります。
justify-content
はフレックスボックスで使われるプロパティの一つで、子要素をどのように配置するか決めることができます。
justify-content
をcenter
に指定することで、中央に寄せることができます。
3-3.positionとleftで中央に移動させる
あまり一般的な方法ではありませんがposition
でもinline-block
要素を水平方向の中央に配置することが可能です。
まず、以下のCSSを見てください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
.parent { width: 600px; padding: 20px; border: 1px solid #333; } .child { display: inline-block; position: relative; left: 50%; transform: translateX(-50%); width: 200px; height: 200px; background: steelblue; } |
前述のtext-align
やjustify-content
を使った方法は親要素に働きかける必要がありましたが、position
は子要素に直接指定します。
position
にrelative
を指定(9行目)した場合、その要素が本来ある場所を基準に位置を調整することができます。
left
(10行目)は左からの距離を示し、パーセンテージは親要素の横幅に対する割合を表しています。
(※その要素が本来ある場所から右からの距離で調整する場合はright
で指定します)
すなわちleft
に50%
を指定することで、親要素の半分の位置(中央)に配置できるはずです。
しかし、このままだと下図のように子要素の左辺が中央に来てしまい、一般的な中央寄せのイメージとは異なる結果になります。
そこで、transform
(11行目)を使って微調整を施します。
上図のような状態の場合、子要素の半分だけ左に移動してくれれば良いわけです。
translateX()
関数をパーセンテージで指定することで、自分自身の横幅の割合分だけ移動させることができます。
半分なので50%
、さらに左方向に移動させるにはー
(マイナス)を付ける必要があります。
left: 50%
と合わせてtransform: translateX(-50%)
を指定することで、思惑通りの中央寄せになります。
4.inline-blockを垂直方向(上下)に中央寄せにする方法
では、inline-block
要素を垂直方向で中央寄せするにはどうしたら良いのでしょうか?
上下の真ん中に配置するには、主に以下2パターンを挙げることができます。
- 親要素の
align-items
をcenter
に指定する position
とtop
で中央に移動させる
各パターンについて解説します。
4-1.親要素のalign-itemsをcenterに指定する
align-items
とは、フレックスボックスで使えるCSSプロパティの一つです。
前章の「3-2」で紹介したjustify-content
は水平方向の配置を調整するプロパティでしたが、align-items
は垂直方向の配置を指定することができます。
例えば、以下のようにCSSを組みます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
.parent { display: flex; align-items: center; width: 500px; height: 500px; padding: 20px; border: 1px solid #333; } .child { display: inline-block; width: 200px; height: 200px; background: steelblue; } |
justify-content
の時もそうでしたが、フレックスボックスでは基本的に、親要素のCSSを操作し子要素の配置を決めます。
まず親要素(.parent)のdisplay
をflex
に変更(2行目)し、align-items
をcenter
に指定(3行目)してください。
結果は下図のとおりです。
無事、高さのある親要素の中で、上下真ん中にinline-block
要素を配置することに成功しました。
ちなみにjustify-content
と併用すれば、上下左右の中央に移動させることも可能です。
1 2 3 4 5 6 7 8 9 |
.parent { display: flex; justify-content: center; align-items: center; width: 500px; height: 500px; padding: 20px; border: 1px solid #333; } |
4-2.positionとtopで中央に移動させる
フレックスボックス以外の方法としてposition
を使って上下中央に移動させる方法があります。
まずは以下のCSSを見てください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
.parent { width: 500px; height: 500px; padding: 20px; border: 1px solid #333; } .child { display: inline-block; position: relative; top: 50%; width: 200px; height: 200px; background: steelblue; transform: translateY(-50%); } |
フレックスボックスでは親要素を操作する必要がありましたが、position
の場合はinline-block
要素に直接指定することができます。
position
をrelative
に指定(10行目)することで、本来要素がある位置を基準にして上下左右に移動させることができます。
top
は上からの距離を表し、パーセンテージは親要素の高さに対する割合です。
50%を指定(11行目)することで、親要素の高さの半分(つまり中央)に移動させることができます。
しかし、要素の上辺が中央に来てしまうため、親要素の中央と子要素の中央が重なり合うようtransform
で微調整(15行目)する必要があります。
traslateY
の「Y」は縦方向の座標軸を表し、-50%
と指定することで要素の高さの50%分、上に戻ります。
ちなみに、inline-block
要素を縦横両方の中央に寄せたい場合は、先程のCSSにleft
を追加します。
1 2 3 4 5 6 7 8 9 10 |
.child { display: inline-block; position: relative; top: 50%; left: 50%; width: 200px; height: 200px; background: steelblue; transform: translate(-50%,-50%); } |
この場合、transform
によって水平、垂直方向ともに移動しすぎた分を微調整(9行目)する必要があります。
translate()
にはカンマで区切って水平、垂直方向の距離を指定することができます。
それぞれー50%
を指定することで、理想通りの中央寄せになります。
まとめ
今回はinline-block
要素を中央寄せにする方法について解説しました。
以下、この記事の要点をまとめておきます。
inline-block
要素にはmargin:0 auto
は効かない- 水平方向で中央寄せするなら親要素の
text-align
にcenter
を指定するのが最も簡単 - 垂直方向で中央寄せするならフレックスボックスの
align-items
で調整しよう