【CSS】 「Safari」で「filter」の描画に不具合が出る

この記事は約2分で読めます。

Safari の画面

こんにちは、さち です。

先日、サイトを作るときに「CSS」の filter プロパティで drop-shadow(ドロップシャドウ) を使ったのですが、困った不具合に遭遇しました。

fitler を実装している「要素」に CSS の animation を追加すると、iPhone の「Safari」で表示したときに「ドロップシャドウ」の描画(レンダリング)が途切れるんです。

地味に困るので、解決していきましょう。

スポンサーリンク

不具合の詳細

ソース

不具合に関係しない記述はなるべく省略し、見やすくしています。

<div id="circle"></div>
#circle {
  filter: drop-shadow(20px 20px 5px #444);
  animation: moving 2s forwards;
  border-radius: 999px;
}

@keyframes moving {
  ~省略~
}

1つの「要素」に filter と animation を同時に使っています。

結果

Safari の画面

iPhone の「Safari」で表示すると、filter の「ドロップシャドウ」の下部分が途切れてしまいました。

PC だと正常に表示されるので、「Safari」の不具合です。

解決方法

ソース

<div id="circle"></div>
#circle {
  filter: drop-shadow(20px 20px 5px #444);
  animation: moving 2s forwards;
  border-radius: 999px;
  will-change: filter;
}

@keyframes moving {
  ~省略~
}

不具合の原因は、filter の「ドロップシャドウ」の描画が「CPU」で行われることでした。「CPU」ではアニメーションの処理が追いつかず、表示に問題が出るようです。

will-change: filter; を追加することで、filter の描画をグラフィック処理に特化した「GPU」でするように変更できます。(いわゆる「ハードウェアアクセラレーション」が行われる)

will-change は、指定したプロパティ(今回は filter )の値を変更する予定だと事前に伝えることで、描画処理の速度を向上させる効果があります。(指定したプロパティの描画処理を高速な「GPU」でするように強制できる)

結果

Safari の画面

iPhone の「Safari」でも、filter の「ドロップシャドウ」が正常に描画されるようになりました。

 

コメント

タイトルとURLをコピーしました