Safariの時、z-indexが効かない場合がある。
今回も実際の事例です。
背景を重ねて表示し、cssのz-indexを使い、背景の表示順を指定していたのですが、その際に、Safariで表示した際に、このz-indexが効かない事象に遭遇しました。
根本原因はSafariのバグっぽいのですが、transform: translateZ(1px);を用いて回避する事ができました。
メモしておきます。
z-indexが効かない条件
発生時のHTML文(簡易的に記載)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <body class="blog20220109"> <div class="page-header"> <p>疑似要素afterを使い、z-index:-1で画像を背景に使用</p> </div> <div class="page-body"> </div> <div class="page-beforefooter"> <p>z-index:1を指定しています。</p> </div> <!--事象の発生する箇所(背景が上に来る)--> <div class="page-footer"> <p>z-index:2を指定しています。</p> </div> </body> |
発生時のCSS文(簡易的に記載)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | .page-header{ width:100%; padding-top:300px; position:relative; display:block; z-index:1; } .page-header:after{ content:''; display:block; width:100%; height:100%; background:url('./images/blog/blog20220109.jpg') center center / cover no-repeat; z-index:-1; position:fixed; top:0; left:0; } .page-beforefooter{ position: relative; z-index: 1; } .page-footer{ /* 後ろの背景が上に乗る */ position: relative; z-index: 2; } |
デザイン的に、ページのヘッダー(class=”page-header”のdiv)の画像部分をスクロールしても動かない背景画像にしたいため、疑似要素を使いz-index:-1;を指定し、position:fixed;で固定しました。
こうすることで、スクロールすると本文(class=”page-body”のdiv)がスクロールされ、ページのヘッダーに配置した画像は動くことなく、ページのヘッダーの枠だけが狭まっていくイメージになります。
後ろに固定した画像が表示されると困るので、フッターの前の要素(class=”page-beforefooter”のdiv)と、フッター(page-footer)に、それぞれ、z-indexを指定しています。
ところが、この時スクロールしていくと、後ろに固定し、z-index:-1;で指定した画像がフッター(z-index:2)の上に乗っかってくるという事象に遭遇しました。
フッターの前の要素(class=”page-beforefooter”のdiv)は、問題なく上に来ていました。
原因は、transformのレンダリングにあるようです。
今回、CSSのtransformは使用していないと思っているのですが、調べて見ると、Safariのtransformのレンダリング(プログラムで要素を操作する機能)の問題が原因で、z-indexが効かない事象に遭遇している方が多数いらっしゃいました。
調べて見ると、transformの2Dのレンダリングと3Dのレンダリングで表示順を制御する部分が異なり、混合して利用した場合、制御順に異常生じることがあるようです。
回避手段:transform: translateZ(1px);の埋め込み
transformは使用していないと思っていたのですが、safariの2Dレンダリングと3Dレンダリングで表示順を制御する部分が異なるとの事でしたので、回避手段として、transform:translateZ(1px);を埋め込んだところ回避できました。
回避した時のCSS文(簡易的に記載)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | .page-header{ width:100%; padding-top:300px; position:relative; display:block; z-index:1; } .page-header:after{ content:''; display:block; width:100%; height:100%; background:url('./images/blog/blog20220109.jpg') center center / cover no-repeat; z-index:-1; position:fixed; top:0; left:0; } .page-beforefooter{ position: relative; z-index: 1; } .page-footer{ position: relative; z-index: 2; transform:translateZ(1px);/* 回避手段 */ } |
今回は、根本原因にはたどり着けませんでした。
WordPressで利用しているテーマやプラグインも関係しているかもしれません。
まずは回避できたので、良かった。。。
- タグ
- プログラミング
WEB DESIGN全てお任せ!ホームページ制作
RishunTradingでは、日本にはないコンセプトや高いデザイン性をもったヨーロッパ製品の輸入販売、及び、Webサイト制作事業などをおこなっております。
「全てお任せ!ホームページ制作」は、ドメイン取得からサーバー設定、レスポンシブルデザイン(スマホ、タブレット対応)、SEO対策がすべて含まれたお得なホームページを制作するサービス商品です。
運用開始後に「Webサイト運用管理サービス(保守)」と組み合わせて購入しますと、メンテナンス、更新も含めてすべて弊社で実施しますので、お客様は安心して本業に集中する事ができます。
しかもなんと、「全てお任せ!ホームページ制作」は、¥100,000!で提供しております。
本業が忙しい中小企業様に大変ご好評を頂いている商品です。
独自ドメイン取得
サーバー開設&設定
レイアウト設計
レスポンシブルデザイン
(*1)検索エンジン最適化
(SEO対策)場所Maps
お問い合わせフォーム
SSL化
各種SNS連携
運用マニュアル