【初心者向け完全解説】CSSの100vh問題とは?スマホで高さが崩れる原因と正しい解決方法

【初心者向け完全解説】CSSの100vh問題とは?スマホで高さが崩れる原因と正しい解決方法

2026.01.01

はじめに:100vhを使ったらスマホでレイアウトが崩れた

CSSで画面いっぱいの高さを指定したいとき、
多くの人が次のように書きます。

.section {
  height: 100vh;
}

PCでは問題ないのに、

  • スマホで高さが大きすぎる
  • 下に余白ができる
  • 画面からはみ出してスクロールできてしまう

といった現象が起きることがあります。

これがいわゆる 「CSSの100vh問題」 です。

この記事では、
100vhがスマホで崩れる理由と正しい対処法
初心者向けにわかりやすく解説します。


そもそも100vhとは何か

vh は viewport height の略で、

  • 1vh = 画面の高さの1%

を意味します。

height: 100vh;


「画面の高さいっぱいにする」
という意図で使われます。


なぜ100vhはスマホで問題になるのか

原因は
スマホブラウザの表示仕様 にあります。

スマホ特有の挙動

  • アドレスバーが表示・非表示で高さが変わる
  • 100vhは「最大時の画面高さ」で計算される
  • 実際に見えている領域と一致しない

その結果、

  • 要素が画面より大きくなる
  • 不要な縦スクロールが発生する

という問題が起こります。


よくある100vh問題の具体例

.hero {
  height: 100vh;
}

この指定は、

  • PC:問題なし
  • スマホ:高さが余る・はみ出す

という状態になりやすいです。

特に
ファーストビューやヒーローエリアで
問題が目立ちます。


応急処置①:min-height を使う

まず試したい簡単な対策です。

.hero {
  min-height: 100vh;
}

ポイント

  • コンテンツ量に応じて高さが伸びる
  • はみ出しにくくなる

ただし、
完全な解決ではありません。


応急処置②:100vhを少し小さくする

.hero {
  height: 90vh;
}

この方法で
問題が目立たなくなることもありますが、
場当たり的な対処です。


根本解決①:dvh・svh・lvhを使う

現在のCSSでは、
スマホ対応のために新しい単位が用意されています。


dvh(dynamic viewport height)

.hero {
  height: 100dvh;
}
  • 表示中の画面高さに追従
  • アドレスバーの変化を考慮
  • 現在もっともおすすめ

svh(small viewport height)

height: 100svh;
  • アドレスバー表示時の最小高さ

lvh(large viewport height)

height: 100lvh;
  • アドレスバー非表示時の最大高さ

どの単位を使うべきか

初心者の方は、
次だけ覚えておけば大丈夫です。

height: 100dvh;

これが
100vh問題の最も安全な解決策です。


フォールバック対応(古いブラウザ)

すべての環境で安全に使う場合は、
次のように書きます。

.hero {
  height: 100vh;
  height: 100dvh;
}

対応しているブラウザでは
後ろの指定が優先されます。


JavaScriptで対応する方法(最終手段)

どうしてもCSSだけで対応できない場合は、
JavaScriptを使う方法もあります。

const vh = window.innerHeight * 0.01;
document.documentElement.style.setProperty('--vh', `${vh}px`);
.hero {
  height: calc(var(--vh) * 100);
}

ただし現在は
dvhが使えるため、
JS対応は基本不要です。


100vhを使わない方がよいケース

次の場合は、
100vh自体を避ける方が安全です。

  • コンテンツ量が可変
  • テキストが多い
  • スマホでの可読性を優先したい

この場合は、

padding + min-height

の組み合わせがおすすめです。


スマホ対応で意識すべき基本ルール

100vh問題を避けるための考え方です。

  • heightよりmin-heightを検討する
  • 100vhをそのまま使わない
  • 可能なら100dvhを使う

初心者向けおすすめ設定

迷ったら、
次の指定を使ってください。

.hero {
  min-height: 100dvh;
}

多くのスマホ環境で
安定します。


まとめ:100vh問題は「スマホ特有の仕様」

CSSの100vh問題は、

  • スマホのアドレスバー仕様が原因
  • PCでは気づきにくい
  • 正しい単位を使えば解決できる

という特徴があります。

これからは、

  • 100vh → 100dvh
  • height → min-height

という意識を持つだけで、
スマホ表示のトラブルは大きく減ります。

初心者の方は、
100vhはそのまま使うと危険
という点だけでも覚えておきましょう。

タグ:

#CSS #HTML #初心者向け