viewport-units を使ってデバイスの画面サイズに関係なくレイアウトを一定に保つ方法
CSS3 100vh がモバイルブラウザで一定にならない問題
CSS3 の 100vh
は、画面の高さの 100% を表す単位です。しかし、モバイルブラウザでは、アドレスバーやツールバーなどの UI 要素が画面の高さに含まれるため、100vh
は一定ではなく、スクロールによって変化します。
原因
モバイルブラウザでは、画面の高さは、デバイスの物理的な高さではなく、ウィンドウの高さによって決定されます。ウィンドウの高さは、アドレスバーやツールバーなどの UI 要素によって変化するため、100vh
も変化します。
影響
100vh
を使用してレイアウトを構築すると、モバイルブラウザでスクロール時にレイアウトが崩れる可能性があります。
解決策
この問題を解決するには、以下の方法があります。
vh
ではなく、px
などの固定単位を使用する。- メディアクエリを使用して、モバイルブラウザ向けのレイアウトを調整する。
position: fixed
を使用して、要素を画面に固定する。
各方法の詳細
px
などの固定単位を使用すると、要素のサイズは画面の高さに関係なく一定になります。ただし、この方法を使用すると、モバイルブラウザで画面サイズが異なる場合、レイアウトが崩れる可能性があります。
メディアクエリを使用して、モバイルブラウザ向けのレイアウトを調整することができます。例えば、以下のように記述することで、モバイルブラウザでは 100vh
の代わりに 50vh
を使用するようにすることができます。
@media (max-width: 768px) {
body {
height: 50vh;
}
}
position: fixed
を使用すると、要素を画面に固定することができます。この方法を使用すると、スクロールしても要素が画面から移動しなくなります。
.element {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
}
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>100vh サンプル</title>
<style>
body {
height: 100vh;
margin: 0;
padding: 0;
}
.container {
width: 100%;
height: 100%;
background-color: #ccc;
}
</style>
</head>
<body>
<div class="container">
<h1>100vh サンプル</h1>
<p>この要素は画面全体を覆います。</p>
</div>
</body>
</html>
このコードを実行すると、画面全体を覆う灰色の背景が表示されます。
モバイルブラウザでの動作
このコードをモバイルブラウザで実行すると、アドレスバーやツールバーなどの UI 要素によって画面の高さ
解決策
vh ではなく、px などの固定単位を使用する
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>100vh サンプル</title>
<style>
body {
height: 100%;
margin: 0;
padding: 0;
}
.container {
width: 100%;
height: 500px;
background-color: #ccc;
}
</style>
</head>
<body>
<div class="container">
<h1>100vh サンプル</h1>
<p>この要素は 500px の高さになります。</p>
</div>
</body>
</html>
このコードを実行すると、モバイルブラウザでも画面全体を覆う灰色の背景が表示されます。ただし、画面サイズが異なるデバイスでは、レイアウトが崩れる可能性があります。
メディアクエリを使用して、モバイルブラウザ向けのレイアウトを調整する
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>100vh サンプル</title>
<style>
body {
height: 100%;
margin: 0;
padding: 0;
}
.container {
width: 100%;
height: 100vh;
background-color: #ccc;
}
@media (max-width: 768px) {
.container {
height: 50vh;
}
}
</style>
</head>
<body>
<div class="container">
<h1>100vh サンプル</h1>
<p>この要素は画面の高さの 100% または 50% になります。</p>
</div>
</body>
</html>
このコードを実行すると、画面幅が 768px 以下のデバイスでは、画面
viewport-units
は、CSS3 で導入された新しい単位です。vw
は画面幅の 1%、vh
は画面高さの 1% を表します。viewport-units
を使用すると、デバイスの画面サイズに関係なく、レイアウトを一定に保つことができます。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>100vh サンプル</title>
<style>
body {
height: 100vh;
margin: 0;
padding: 0;
}
.container {
width: 100vw;
height: 100vh;
background-color: #ccc;
}
</style>
</head>
<body>
<div class="container">
<h1>100vh サンプル</h1>
<p>この要素は画面の 100% の大きさになります。</p>
</div>
</body>
</html>
JavaScript を使用して、画面の高さを取得し、要素のサイズを設定することもできます。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>100vh サンプル</title>
<style>
body {
height: 100%;
margin: 0;
padding: 0;
}
.container {
width: 100%;
background-color: #ccc;
}
</style>
</head>
<body>
<div class="container">
<h1>100vh サンプル</h1>
<p>この要素は画面の高さに追従します。</p>
</div>
<script>
const container = document.querySelector('.container');
const vh = window.innerHeight;
container.style.height = `${vh}px`;
</script>
</body>
</html>
100vh
はモバイルブラウザで一定にならないため、レイアウトを構築する際には注意が必要です。上記の方法を参考に、状況に応じて適切な方法を選択してください。
html css viewport-units