ios15のsafari15.4からcssの「svh」が使用できるようになり、画面に表示されたアドレスバーを除いたビューポートの高さで表示できるようになっている。
「dvh」を使用するとアドレスバー有り無しでの切り替えも自動で行う。
ios14以前では「svh」が使えないためjavascriptを使って対応する
css
.hogehoge {
height: 100vh; /* CSS変数をサポートしていないブラウザ用のフォールバック */
height: calc(var(--vh, 1vh) * 100);
}
javascript
const setVh = () => {
const vh = window.innerHeight * 0.01;
document.documentElement.style.setProperty('--vh', `${vh}px`);
};
window.addEventListener('load', setVh);
window.addEventListener('resize', setVh);
javascript 別パターン
const setFillHeight = () => {
const vh = window.innerHeight * 0.01;
document.documentElement.style.setProperty('--vh', `${vh}px`);
}
let vw = window.innerWidth;
window.addEventListener('resize', () => {
if (vw === window.innerWidth) {
// 画面の横幅にサイズ変動がないので処理を終える
return;
}
// 画面の横幅のサイズ変動があった時のみ高さを再計算する
vw = window.innerWidth;
setFillHeight();
});
// 初期化
setFillHeight();
});
「-webkit-fill-available」を使ってcssのみで対応する方法もあるが、ネストされた要素には適用されないなどの問題もあるのであまり実用的ではない。
html{
height: -webkit-fill-available;
}
body{
min-height: 100vh;
min-height: -webkit-fill-available;
}
@supports (-webkit-touch-callout: none) {
html{
height: -webkit-fill-available;
}
body {
min-height: 100vh;
height: -webkit-fill-available;
}
}