問題
100vh
を使ったフルスクリーンセクションが、モバイルブラウザでスクロールバーが表示されてしまいます。
HTML
<div class="hero-section">
<h1>フルスクリーンヒーロー</h1>
<p>画面いっぱいに表示されるはず</p>
</div>
<div class="next-section">
<h2>次のセクション</h2>
</div>
CSS
.hero-section {
height: 100vh; /* 問題の原因 */
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
color: white;
}
.next-section {
padding: 50px;
background-color: #f5f5f5;
}
実行結果
※ モバイルブラウザでアドレスバーが表示されている時、100vhがビューポートより高くなります
🔧 実際に試してみよう(リアルタイム更新)
上部でHTMLまたはCSSタブを選択して編集すると、下部の結果エリアがリアルタイムで更新されます。
📺 ライブプレビュー
更新中
ヒント
クリックしてヒントを表示
モバイルブラウザの100vh
は、アドレスバーを含めた高さになることがあります。
より安全な高さの指定方法や、CSS変数を使った解決策があります。
新しいビューポート単位も検討してみましょう。
解答
クリックして解答を表示
問題の原因
モバイルブラウザでは、100vhがアドレスバーを含む高さになるため、実際の表示領域より高くなってしまいます。
修正方法
方法1: min-heightとheightの組み合わせ
.hero-section {
min-height: 100vh;
min-height: -webkit-fill-available; /* iOS Safari対応 */
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
color: white;
}
方法2: 新しいビューポート単位(dvh)
.hero-section {
height: 100vh; /* フォールバック */
height: 100dvh; /* 動的ビューポート高さ */
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
}
方法3: JavaScriptでカスタムプロパティを設定
// JavaScript
const setVH = () => {
const vh = window.innerHeight * 0.01;
document.documentElement.style.setProperty('--vh', `${vh}px`);
};
setVH();
window.addEventListener('resize', setVH);
// CSS
.hero-section {
height: 100vh; /* フォールバック */
height: calc(var(--vh, 1vh) * 100);
}
新しいビューポート単位
単位 | 説明 | 使用場面 |
---|---|---|
vh/vw |
従来のビューポート単位 | デスクトップ向け |
dvh/dvw |
動的ビューポート | モバイル対応 |
svh/svw |
小さいビューポート | 最小表示領域 |
lvh/lvw |
大きいビューポート | 最大表示領域 |
覚えておくポイント
- モバイルブラウザの100vhは予想より大きい
- 新しいビューポート単位(dvh)が推奨
- フォールバックを必ず用意する
- -webkit-fill-availableでiOS対応
- JavaScriptソリューションも検討