目次
- CSSで高さを揃えるとは?
- なぜ高さがバラバラになるのか
- 最短で解決する方法:Flexbox
- なぜ揃うのか
- Flexboxで揃わないときのチェックリスト
- DevToolsで高さを確認する手順
- 手順
- Gridで高さを揃える方法
- Gridの強み
- 固定heightが危険な理由
- min-heightはどう使う?
- よくある誤解:高さが揃えばOK?
- 対策
- スマホ崩れを防ぐレスポンシブ設計
- 料金表やボタン位置まで揃えたい場合
- table / table-cell を使う方法(過去の手法)
- JavaScriptで高さを揃える必要はある?
- 高さが揃わない原因まとめ(保存用チェックリスト)
- 結局どれを使えばいい?
- まとめ
CSSで高さを揃えるとは?
CSSで高さを揃えるとは、横並びやグリッド状に配置した複数の要素を、見た目上同じ高さにすることです。
カード型レイアウト、料金表、ブログ一覧、商品一覧。
どれも「高さが揃っているかどうか」で、印象がかなり変わります。
少しズレているだけで、素人っぽく見えてしまう。
これ、本当にあります。
なぜ高さがバラバラになるのか
原因はシンプルです。
中身の量が違うから。
<div class="card">短い文章</div>
<div class="card">とても長い文章が入っているカードです。改行も入っています。</div>
CSSは基本的に「中身に合わせて高さを自動調整」します。
なので、テキスト量が違えば高さも変わります。
ここを理解せずに height: 300px; を書いてしまうと、あとで痛い目を見ます。
実際、私は新人の頃、固定高さで無理やり揃えて、
スマホで文字がはみ出してクレームになりました。
あれは忘れません…。
最短で解決する方法:Flexbox
横並びで高さを揃えたいなら、まずこれです。
.container {
display: flex;
}
.card {
flex: 1;
}
これだけ。
なぜ揃うのか
Flexboxは「同じ行に並んだ要素の高さを自動的に揃える」性質があります。
正確には align-items: stretch; が初期値だからです。
.container {
display: flex;
align-items: stretch; /* デフォルト */
}
指定しなくても効いています。
Flexboxで揃わないときのチェックリスト
高さが揃わないときは、ほぼ次のどれかです。
- 親要素に
display: flex;を書いていない - 高さを揃えたい要素が同じ親の中にいない
align-items: center;にしてしまっている- 子要素に
heightを固定している - 画像の高さが不定で読み込み後にズレている
特に多いのがこれ。
.container {
display: flex;
align-items: center; /* ← これ */
}
これを指定すると、中央揃えになり、高さは揃いません。
DevToolsで高さを確認する手順
「本当に揃っているのか?」は目視だけでは不十分です。
手順
- Chromeで右クリック → 検証
.containerを選択- Stylesタブで
display: flex;が適用されているか確認 - LayoutパネルでFlex表示を可視化
ここで青いガイドが出ればFlexが有効です。
さらにElementsパネルで .card をホバーすると、
高さが同じ数値になっているか確認できます。
実務では、見た目より「実際のboxサイズ」を確認します。
ここ、差が出るポイントです。
Gridで高さを揃える方法
複数行にまたがるカード一覧ならGridが便利です。
.container {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 24px;
}
Gridは同じ行の高さを自動で揃えます。
Gridの強み
- 3列・4列レイアウトが簡単
- レスポンシブ切り替えが楽
- gapが使える
ただし、1列レイアウトでは高さを揃える意味がありません。
固定heightが危険な理由
.card {
height: 300px;
}
これ、一見楽です。
でも…
- テキストがはみ出す
- スマホで崩れる
- 多言語対応で破綻する
特に英語対応すると文字数が増えます。
固定高さはあとで必ず問題になります。
min-heightはどう使う?
.card {
min-height: 250px;
}
これは「最低ライン」を保証するものです。
- 短いカード → 250pxになる
- 長いカード → それ以上に伸びる
デザイン上、ある程度揃えたいときには使えます。
ただし、完全一致はしません。
よくある誤解:高さが揃えばOK?
高さを揃えた結果、
横スクロールが出るケースがあります。
特にこれ。
.container {
display: flex;
}
.card {
flex: 1;
padding: 40px;
}
box-sizing: border-box; がないと、
padding分で横幅がオーバーしてスマホで崩れます。
対策
* {
box-sizing: border-box;
}
横スクロール問題は実務でかなり多いです。
スマホ崩れを防ぐレスポンシブ設計
PCで高さを揃えても、
スマホでは縦並びにすることがほとんどです。
@media (max-width: 768px) {
.container {
flex-direction: column;
}
}
縦並びにすれば、高さを揃える必要自体がなくなります。
無理にスマホでも横並びにしない。
これ、地味に大事です。
料金表やボタン位置まで揃えたい場合
カードの「高さ」ではなく
ボタンの位置を揃えたいケースもあります。
その場合はこれ。
.card {
display: flex;
flex-direction: column;
}
.card .button {
margin-top: auto;
}
margin-top: auto; でボタンを一番下に押し出します。
これを知らないと、
ボタンがバラバラに見えます。
table / table-cell を使う方法(過去の手法)
.container {
display: table;
}
.card {
display: table-cell;
}
昔はよく使われました。
今はFlexやGridで十分です。
新規制作で使うことはほぼありません。
JavaScriptで高さを揃える必要はある?
結論:ほぼ不要です。
以前はjQueryで高さを計算していました。
今はCSSで完結できます。
JSはメンテナンスコストが増えるので、
特別な理由がない限り使いません。
高さが揃わない原因まとめ(保存用チェックリスト)
- 親に
display: flex;を書いていない - 子が同じ親にいない
align-itemsを変更している- 固定heightが入っている
- 画像の高さが読み込み後に変わる
- box-sizingが未指定
- paddingで横幅が溢れている
ここを順番に見れば、ほぼ解決します。
結局どれを使えばいい?
シンプルな横並び → Flexbox
カード一覧 → Grid
高さ最低保証 → min-height
迷ったら、まずはこれ。
.container {
display: flex;
}
.card {
flex: 1;
}
これで解決できるケースが一番多いです。
まとめ
CSSで高さを揃える問題は、
仕組みを理解すると一気に楽になります。
- 原因はコンテンツ量の違い
- 現代の正解はFlexboxかGrid
- 固定heightは避ける
- DevToolsで実際のboxサイズを確認する
- スマホでは無理に揃えない
高さが揃うだけで、サイトは一段整って見えます。
もし今、カードがバラバラで悩んでいるなら、
まずはFlexを試してみてください。
驚くほど、あっさり揃います。