UGA Boxxx

つぶやきの延長のつもりで、知ったこと思ったこと書いてます

【iOS】iOS Safariでposition:fixedを使ってoverlayするとスクロール時に下のレイヤーが見える

iOS15からSafariでは画面下部にナビゲーションがつくようになった

このナビゲーションはスクロールの方向によって大きさが変わる

f:id:uggds:20220406120941p:plain:w400

position:fixedを使って高さいっぱいの手前にoverlayするモーダルをつくる場合、大きい方のナビゲーションが表示されている状態でスクロールさせると、モーダルの高さがナビゲーションの縮小に追随できず下に隙間ができてしまう

そして、スクロールが終わると急に吸着する挙動になる

f:id:uggds:20220406122543p:plain:w550

iOSの仕様というかバグというか、これに付き合わなければならないみたい

対策

いろいろ調べた結果、モーダル表示時に以下のスタイルをあてるととりあえず回避できる

  1. bodyタグにposition: fixed; overflow: hidden; inset: 0px;
    ※スクロール位置を保持したい場合は、topを調整する
  2. htmlタグにheight: 100vh;

まず、1. はよく見かけるが、これだけおこなった場合

下のレイヤーも上のレイヤーも、大きい方のナビゲーションの高さ分上に押し上げられるような見た目になる

これによってスクロールによるナビゲーションの伸び縮みに関係なく常にその高さ分のスペースが確保されるので、事象は解決するが、何も描画されない無駄なスペースができてしまう

f:id:uggds:20220406142644p:plain:w550

そこで、2.のスタイルも追加であてる

AirbnbIndeedもこの方法を行なっていた

これにより無駄なスペースもなくなり、事象も解消する

ただ、position: fixed;height: 100vh;など、何か想定外の操作でモーダルを閉じてもスタイルが外れない場合、ユーザが先に進めないなどの障害になりうるので気をつけたいところ

参考

https://developer.apple.com/forums/thread/691428