iOS版Safariで100vhがアドレスバーのせいではみ出る時の対処法

iOS版Safariで100vhがアドレスバーのせいではみ出る時の対処法:

こんちは。見習いエンジニアの'めんた'です。

今回の私のgithubを片手にご覧ください。

一応MITライセンスです。


これまでの100vh

私は画面ピッタリのシャレオツなSPAに憧れていた。

そんな時はbodyの高さを100vhで解決!

てことで、

old-master.css
body{ 
    display: flex; 
    flex-direction: column; 
 
    /* これで上下ぴったりなシャレオツSPAになるはず… */ 
    min-height: 100vh; 
} 
としたのですが、iOS版Safariではアドレスバーや下部のUIのサイズが計算されないようで、フッター部分がはみ出る事件が発生…

従来型サンプルページ

JSで解決できると思い、調べてみたがjQueryを使ったものがほとんど。

宗教上の理由でjQueryは使えないので、素のJavascriptでの解決方法を模索。

なんとか解決したので、紹介します。


改良型100vh

まず、完成品はこちら

改良型サンプルページ

どうやら、Javascriptにてwindow.innerHeightを取り出したところ、正しい内側の高さを示してくれているよう…

ということは、bodyが読み込まれた後と、ブラウザのサイズが変更された(iOSの場合は、アドレスバーが表示/非表示になった)時に、window.innerHeightの値をbodyのcssに設定するだけ!

ということで、まずはmin-heightを消し…

vh-master.css
body{ 
    display: flex; 
    flex-direction: column; 
 
    /* コメントアウトして削除するよ!! */ 
    /* min-height: 100vh; */ 
} 

bodyの一番下に以下のscriptを埋め込み完成!

index.html
<body> 
    <!-- いろいろページの本体… --> 
 
    <!-- bodyの一番下に記述 --> 
    <script> 
        // body読み込み時に一度だけbodyサイズを設定 
        document.body.onload = ()=>{ 
            document.body.style.minHeight = window.innerHeight + 'px'; 
        } 
 
        // リサイズを停止して500ms後にbodyサイズを設定 
        let timeoutId; 
        window.addEventListener("resize", () => { 
            clearTimeout(timeoutId); 
 
            timeoutId = setTimeout(() => { 
                document.body.style.minHeight = window.innerHeight + 'px'; 
            }, 500); 
        }); 
    </script> 
</body> 
以上でシャレオツなSPAに一歩近づきました。

それ以前にデザインセンスが絶望的なのをどうにかせねば…

あ、何か問題があればすぐにご連絡ください。

コメント

このブログの人気の投稿

投稿時間:2021-06-17 05:05:34 RSSフィード2021-06-17 05:00 分まとめ(1274件)

投稿時間:2021-06-20 02:06:12 RSSフィード2021-06-20 02:00 分まとめ(3871件)

投稿時間:2020-12-01 09:41:49 RSSフィード2020-12-01 09:00 分まとめ(69件)