結論:横並びにしたい要素の「親」に display: flex を1行書けば、子は横一列に並びます。中央寄せは横方向が justify-content: center、縦方向が align-items: center で、この2つを取り違えているのが「中央寄せできない」のほぼ全部です。
CSSのレイアウトは、float や display: inline-block を使っていた時代の情報がまだ大量に残っているせいで、初心者ほど遠回りしがちです。いまは横並びも中央寄せも、Flexboxだけでほぼ片が付きます。この記事は「学ぶ順番」ではなく「具体的なやり方」に絞ってまとめます。
なぜ横並びが難しく感じるのか
そもそもHTMLの要素は、最初から2種類の性質に分かれています。
- ブロック要素:
<div><p><h1>など。前後で改行され、縦に積まれる。横幅は親いっぱいに広がる - インライン要素:
<span><a><strong>など。文章の流れの中に横に並ぶ。幅は中身ぶんだけ
「箱を3つ横に並べたい」と思って <div> を3つ書くと縦に積まれるのは、<div> がブロック要素だからです。ここで悩む必要はありません。この性質は display プロパティで変えられます。実際の挙動は display ― 並び方を変える で <span> を block に変えたり戻したりしながら確認できます。<div> と <span> の違いそのものは divとspan ― 汎用の箱 が入口です。
昔は「ブロック要素を無理やり横に並べる」ために float や inline-block を使っていました。回り込みの解除や隙間の調整といった副作用が多く、初心者が最初に触るものではありません。横並びが目的なら、いまはFlexbox一択と考えて構いません。
display: flex は「親」に書く
Flexboxの最大のポイントは、並べたい子ではなく、子を囲んでいる親に指定することです。
<div class="row">
<div>1</div>
<div>2</div>
<div>3</div>
</div>
<style>
.row {
display: flex;
gap: 12px;
}
</style>
.row が親、その中の <div> 3つが子です。親に display: flex を付けた瞬間、子は横一列に並びます。子側には何も書きません。
うまくいかないときの原因は、だいたいこの3つです。
- 子のほうに
display: flexを書いている(.row div { display: flex }にしてしまう) - 並べたい要素を囲む親がそもそも無い(
<div>を3つ並べただけで、外側の箱を作っていない) - セレクタが要素に当たっていない(
class="row"と.rowの対応がずれている)
3つ目は Flexbox 以前の話で、. と # の意味を確認すると解決します。classとidで印を付ける と セレクタ ― classとidで狙う がその範囲です。
この横並びは Flexboxで横に並べる でブラウザ上にそのまま書いて、隣のプレビューで結果を見ながら試せます。エディタの内容を書き換えれば即座に反映されるので、この記事のコードを貼り付けて数字をいじるだけでも感覚がつかめます。
主軸と交差軸 ― これが分かれば中央寄せは迷わない
Flexboxには2本の軸があります。ここを言葉で覚えておくと、以降のプロパティを丸暗記しなくて済みます。
- 主軸(しゅじく):子が並んでいく方向。既定では横(左→右)
- 交差軸(こうさじく):主軸と直角の方向。既定では縦
そして、配置を決めるプロパティは軸ごとに分かれています。
| やりたいこと | プロパティ | 既定の向き |
|---|---|---|
| 並んでいる方向の位置を決める | justify-content | 横方向 |
| 直角方向の位置を決める | align-items | 縦方向 |
つまり justify-content は横、align-items は縦(既定の状態では、という条件付き)。「中央寄せできない」と検索している人の多くは、縦に寄せたいのに justify-content: center を書いています。
justify-content に指定できる代表的な値は次のとおりです。
flex-start… 左寄せ(既定)center… 横方向の中央flex-end… 右寄せspace-between… 両端に寄せて、間を均等に空ける(ヘッダーのロゴとメニューの配置に頻出)space-around/space-evenly… 外側にも余白を配りつつ均等配置
align-items の代表は次のとおりです。
stretch… 高さを親いっぱいに引き伸ばす(既定)center… 縦方向の中央flex-start/flex-end… 上寄せ/下寄せbaseline… 文字のベースラインを揃える
justify-content: center と space-between の違いは、Flexboxの回 のエディタで値を書き換えるとその場で見比べられます。
上下中央寄せの決まり文句
「文字を箱の真ん中に置きたい」は次の3行です。
<div class="center-box">まんなか</div>
<style>
.center-box {
display: flex;
justify-content: center; /* 横方向の中央 */
align-items: center; /* 縦方向の中央 */
height: 200px;
border: 1px solid gray;
}
</style>
ここで見落としがちなのが height です。親の高さが中身ぶんしか無ければ、縦方向に動かせる余白が存在せず、align-items: center を書いても見た目は変わりません。「縦中央にならない」ときは、まず親に高さがあるかを疑ってください。画面いっぱいに縦中央を取りたい場合は height: 100vh(表示領域の高さ)を使います。
なお、この例の border のように枠線や余白を扱うときは、padding(内側の余白)・border(枠線)・margin(外側の余白)の3層構造を押さえておくと調整が速くなります。これは ボックスモデル ― 余白と枠線 の内容で、こちらもブラウザ上で数値を変えながら確認できる回です。
余白の付け方の定石は gap
子どうしの間隔は、子に margin-right を付けて回るのではなく、親に gap を1行書くのが定石です。
.row {
display: flex;
gap: 16px;
}
margin 方式だと「最後の要素にだけ余白が余る」問題が起きて、:last-child で打ち消す小細工が必要になります。gap は要素と要素の“あいだ”にだけ効くので、その手間がありません。縦横で違う値にしたいときは gap: 8px 16px(行方向 列方向の順)と書けます。
よく使う組み合わせも覚えておくと早いです。
/* ヘッダー:ロゴは左、メニューは右 */
.header { display: flex; justify-content: space-between; align-items: center; }
/* 縦に積む(主軸を縦にする) */
.stack { display: flex; flex-direction: column; gap: 12px; }
/* 画面が狭いとき、はみ出さずに折り返す */
.cards { display: flex; flex-wrap: wrap; gap: 16px; }
flex-direction: column にすると主軸が縦になるので、justify-content と align-items の担当する向きが入れ替わります。「縦積みにしたら中央寄せの指定が効かなくなった」ときは、たいていこれが原因です。軸で覚えていれば、値をひっくり返すだけで解決します。
flex-wrap: wrap は、子が親の幅に収まらないときに折り返す指定です。カード型の一覧を作るときの必需品で、これだけでも小さい画面である程度形が保たれます。本格的に画面幅で切り替えたいなら、メディアクエリを使います。入り口は レスポンシブの入り口 で、プレビュー幅を変えると切り替わりを実際に目で見られる回です。用語としての整理は レスポンシブデザイン にあります。
つまずきやすいところ
子の幅がバラバラになる/伸びすぎる。 Flexの子は、余った幅の分配ルールを持っています。均等に伸ばしたければ子に flex: 1 を付けます。逆に「この要素だけ縮ませたくない」ときは flex-shrink: 0 です。長いテキストが入ると勝手に縮む、という現象はこれで説明できます。
画像が親からはみ出す。 画像には元のサイズがあるため、max-width: 100% を付けておくのが定番です。画像の扱いそのものは 画像を表示する にあります。
CSSが効かない。 Flexbox以前に、そもそも指定が届いていないケースがあります。セレクタのつづり、{ } の閉じ忘れ、; の付け忘れ。CSSはエラーで止まらず「その行だけ黙って無視される」ので、書き間違いに気づきにくい言語です。効かないときは、いったん background: pink のような露骨な指定を足して、そもそも当たっているかを確かめると切り分けが速くなります。CSSの基本の書き方は CSSで見た目を変える に戻れば確認できます。
Flexboxで全部やろうとする。 横一列・縦一列の配置はFlexboxが得意ですが、「行と列の両方をきっちり揃えた格子」はCSS Gridのほうが素直です。まずはFlexboxを手に馴染ませて、必要になったらGridを足す順番で問題ありません。
手を動かして覚えるのがいちばん早い
CSSのレイアウトは、読んだだけでは身につきません。値を変えて、崩れて、直す、という往復が理解を作ります。当サイトの HTML/CSSコース は、書いたHTMLとCSSがその場でプレビューに反映される形式で、インストールも登録も不要・無料で開いてすぐ試せます。
レイアウトに関係する回はこの並びです。
- CSSで見た目を変える — セレクタとプロパティの書き方
- divとspan ― 汎用の箱 — 囲むための箱を用意する
- classとidで印を付ける — 狙うための印
- セレクタ ― classとidで狙う —
.と#の使い分け - ボックスモデル ― 余白と枠線 —
padding/border/margin - display ― 並び方を変える — ブロックとインライン
- Flexboxで横に並べる —
display: flexとgap・justify-content - レスポンシブの入り口 — メディアクエリ
7の回のエディタに、この記事の align-items や flex-direction: column を書き足して結果を見比べると、軸の感覚が一気に固まります。
次に読む
- HTML/CSSコース — 書いてその場でプレビュー。無料・登録不要
- Flexboxで横に並べる — この記事の内容をそのまま試せる回
- CSSとは / HTMLとは — 用語の位置づけ
- Web制作独学は何から — HTML→CSS→JavaScriptの学ぶ順番
- JavaScriptコース — 見た目の次に「動き」を付ける
- 未経験のポートフォリオの作り方 — 作ったページを成果物にする