レスポンシブデザインを実現する上で、画面サイズに応じて柔軟に対応できるCSSのビューポート単位は非常に便利です。
この記事では、vw、vh、vmin、vmaxといったビューポート単位について、基本から実践的な使い方まで詳しく解説します。
Contents
ビューポート単位とは?(vw、vh、vmin、vmax)
ビューポート単位は、ブラウザのビューポート(表示領域)のサイズに基づいて要素のサイズを指定できるCSS単位です。
画面サイズが変わると、自動的にサイズが調整されるため、レスポンシブデザインに最適です。
ビューポート単位(vw, vhなど)は、原則としてスクロールバーやモバイルのアドレスバーも幅を含みません。
主要なビューポート単位
1. vw (viewport width)
ビューポートの幅に対する割合を表します。
1vw
= ビューポート幅の1%100vw
= ビューポート幅の100%(全幅)
.full-width {
width: 100vw;/* 画面幅いっぱい */
}
.half-width {
width: 50vw;/* 画面幅の半分 */
}
使用例:
- フルスクリーン幅の要素
- 画面サイズに応じて変化するフォントサイズ
2. vh (viewport height)
ビューポートの高さに対する割合を表します。
1vh
= ビューポート高さの1%100vh
= ビューポート高さの100%(全高)
.full-height {
height: 100vh;/* 画面高さいっぱい */
}
.hero-section {
height: 80vh;/* 画面高さの80% */
}
使用例:
- ヒーローセクション
- フルスクリーンのランディングページ
- 固定高さのセクション
3. vmin (viewport minimum)
ビューポートの幅と高さのうち小さい方に対する割合を表します。
- 縦長の画面: vwと同じ
- 横長の画面: vhと同じ
.square {
width: 50vmin;
height: 50vmin;/* 常に正方形を維持 */
}
使用例:
- 縦横比を保ちたい要素
- どんな画面サイズでも見やすいサイズを保つ要素
下のサンプルでは、widthの方が小さいので、widthを基準に高さは比率が固定されます。
試しに「Result」ボタンを押し、window幅を狭めたりしてみてください。
- ビューポートの30%の幅を維持
- ビューポートの高さは3:9を維持
- ビューポートの幅を変えると30%を維持しようと変動し、それに合わせて文字や高さも比率を維持しながら変動
See the Pen Untitled by naoq (@naoq) on CodePen.
補足:文字のサイズについて
親要素のサイズや、要素自体のwidth
やheight
がvminを未指定であっても、ビューポート(表示領域)の幅と高さのうち、小さい方を基準に変動します。
4. vmax (viewport maximum)
ビューポートの幅と高さのうち大きい方に対する割合を表します。
- 縦長の画面: vhと同じ
- 横長の画面: vwと同じ
.large-text {
font-size: 10vmax;/* 画面の大きい方の10% */
}
使用例:
- インパクトのある大きなテキスト
- 画面の向きに関わらず大きさを保つ要素
実践的な使用例
レスポンシブなフォントサイズ
h1 {
font-size: calc(2rem + 2vw);
/* 基本サイズ + 画面幅に応じた可変サイズ */
}
p {
font-size: clamp(1rem, 2vw, 1.5rem);
/* 最小1rem、理想2vw、最大1.5rem */
}
フルスクリーンセクション
.hero {
width: 100vw;
height: 100vh;
display: flex;
align-items: center;
justify-content: center;
}
アスペクト比を維持する要素
.thumbnail {
width: 30vmin;
height: 30vmin;
object-fit: cover;
}
object-fitについては以下の記事を参照
カード型レイアウト
.card {
width: calc(100vw - 2rem);
max-width: 600px;
padding: 5vmin;
}
注意点とベストプラクティス
1. スクロールバーの影響
100vw
を使用すると、スクロールバーの幅も含まれるため、横スクロールが発生する場合があります。
/* 回避策 */
.container {
width: 100%;
max-width: 100vw;
}
この組み合わせは、「通常は親要素の幅(100%
)を使い、横スクロールの発生を防ぐ。ただし、意図せず親要素が広がりすぎた(ビューポート以上)としても、ビューポートの幅(100vw
)を絶対に超えない」という、安全なレスポンシブなコンテナを作るための定石です。
2. モバイルブラウザのアドレスバー(vhよりdvh)
モバイルブラウザでは、スクロール時にアドレスバーが表示/非表示になり、100vh
の値が変動することがあります。
/* 新しいビューポート単位を使用(対応ブラウザのみ) */
.section {
height: 100dvh;/* Dynamic Viewport Height */
}
3. アクセシビリティへの配慮
フォントサイズに使用する場合は、ユーザーのブラウザ設定を尊重するためにrem
と組み合わせましょう。
/* 推奨 */
font-size: calc(1rem + 0.5vw);
/* 非推奨(ユーザー設定が反映されない) */
font-size: 3vw;
vw
はビューポート(画面)のサイズにのみ依存する絶対的な単位です。ユーザーがブラウザの設定(「文字の大きさ」設定など)で文字サイズを大きく変更した場合でも、3vw
で指定されたフォントサイズは一切変わりません。
これはアクセシビリティ(利用しやすさ)を損ないます。これはWCAG(ウェブコンテンツ・アクセシビリティ・ガイドライン)の観点からも推奨されません。
ユーザーがブラウザ設定を変更すると、この1rem
の部分が変動し、文字サイズがそれに合わせて拡大・縮小されます。
つまり、この方法は、「ユーザーが設定した基本サイズ」をベースにしながら、「画面幅に応じた自動的な調整」を加えるためのベストプラクティスなのです。
4. パフォーマンス
ビューポート単位は再計算が必要なため、過度な使用はパフォーマンスに影響する可能性があります。
必要な箇所に絞って使用しましょう。
ブラウザ対応状況
基本的なビューポート単位(vw、vh、vmin、vmax)は、現在のほとんどのモダンブラウザでサポートされています。
ただし、古いブラウザ(IE11以前など)では、フォールバック値を用意することをおすすめします。
.container {
height: 500px;/* フォールバック */
height: 50vh; /* 対応ブラウザで適用 */
}
モバイルでの高さを安定させる新しいビューポート単位
従来の vh
(viewport height) は、モバイルブラウザのアドレスバーや操作バーが表示・非表示になる際に値が変動し、レイアウトが崩れるという問題がありました。この問題を解決するために、新しいビューポート単位が導入されました。
これらの単位を使うことで、モバイル環境でも予測可能で安定した高さの指定が可能になります。
lvh
(Large Viewport Height)
lvh
は、モバイルブラウザのUI(アドレスバーやツールバーなど)が完全に非表示になった状態の、最大の表示可能領域を基準とします。
- 100lvh = UIが隠れた時の、画面の高さいっぱい。
- 用途: ヒーローセクションなど、コンテンツの表示領域が最も広い状態の高さに固定したい場合に適しています。
svh
(Small Viewport Height)
svh
は、モバイルブラウザのUIが完全に表示された状態の、最小のコンテンツ表示領域を基準とします。
- 100svh = UIが表示されている時の、画面の高さいっぱい。
- 用途: 要素が画面からはみ出さず、UIが表示されても確実に収まるように、最小限の高さを固定したい場合に適しています。
dvh
(Dynamic Viewport Height)
dvh
は、モバイルブラウザのUIの表示・非表示に動的に連動し、現在のコンテンツ表示領域を基準とします。
- 100dvh = ユーザーが現在見ている表示領域の高さ。
- 用途: スクロールによってUIが隠れると、要素の高さがリアルタイムで追従して伸びます。記事で言及したように、従来の
100vh
が抱える変動問題を回避したい場合の、最も柔軟な代替手段です。
💡 従来の vh
との使い分け
モバイルの高さを扱う際には、特別な理由がない限り、従来のvh
ではなく、lvh
、svh
、またはdvh
のいずれかを使用することが現代のベストプラクティスです。
実現したいこと | 単位 |
UI非表示時の最大の高さに固定したい | lvh |
UI表示時の最小の高さに固定したい | svh |
アドレスバーの表示/非表示に連動させたい | dvh |
まとめ
ビューポート単位を適切に使用することで、より柔軟でレスポンシブなデザインを実現できます。
それぞれの単位の特性を理解し、用途に応じて使い分けることが重要です。
- vw/vh: 画面の幅/高さに応じたサイズ指定
- vmin/vmax: 画面の向きに依存しないサイズ指定
- calc()やclamp()との組み合わせ: より細かい制御
これらの単位をマスターして、ユーザー体験の良いウェブサイトを作成しましょう!