要素を画面と同じ縦幅に設定する際の、height: 100% と height: 100vm の違いについて調べてみました。
height: 100%
height を % で指定した場合、親要素の高さに対しての割合での指定ということになります。したがって、height: 100% で設定する場合は <html> までの親要素もすべて height: 100% の設定が必要になります。
例えば以下のようなHTMLで4行目の div.mv の縦幅を画面の縦幅と同じにする場合は、
<html>
<body>
<header>
<div class="mv"></div>
</header>
</body>
</html>
以下のように <html>、<body>、<header>、.mv の全てに height: 100% が必要です。height を固定するとスクロールができなくなるため、<body> には overflow-y: scroll も必要となります。
html, body, header, .mv {
height: 100%;
}
body {
overflow-y: scroll;
}
height: 100vh
vh は画面の縦幅に対する割合での指定なので、特定の要素以外へのスタイルの指定は必要ありません。
.mv {
height: 100vh;
}
Android 版 Chrome での差異
iPhone は分からないのですが、Android 版の Chrome ではスクロールに応じてアドレスバーが出たり引っ込んだりします。その影響で 100% を指定した時と 100vh を指定した時で差異が生じます。
100% を指定した場合
要素の縦幅は画面の縦幅からアドレスバーを差し引いた高さとなります。
100vh を指定した場合
要素の縦幅は画面の縦幅と同じ高さになります。
どちらを使うべきか
Android の Chrome での挙動を踏まえて、どちらを使うべきか考えてみました。
ページの最上部に表示する要素には 100% で指定したほうが良いでしょう。ページの最上部であれば常にアドレスバーが表示されるため、100vh で指定するとはみ出てしまいます。
逆にページの途中の要素であれば 100vh で良いでしょう。下にスクロールしている途中であればアドレスバーが消え、100vh が画面にちょうどフィットします。

2 thoughts to “100% と 100vh の違い”