この記事はフラー株式会社 Advent Calendar 2022 の2日目の記事です。1日目は@shogo82148で「ラバーダックデバッグのすゝめ」でした。

2022年を振り返ると,最も大きな出来事のひとつに「Internet Explorer(以下,IE)のサポート終了」が思いつきます。これにより多くのWebサービスではユーザーがIEを利用してWebページを閲覧する状況を考慮する必要が無くなりました。開発者としては,IEに対応するために利用を控えていた機能が解禁されました。 そんな数ある機能のうち,今回は “CSS Masks” に焦点を当てて,JavaScriptをほとんど書かずに楽しい視覚効果を実装する方法について見ていきます。(マスクも今年の大きな話題でしたからね!🐤)

CSS Masksとは

CSSの clipmask プロパティを使うと,要素の一部(または全部)を隠したり切り取ったりすることができます。clip はずいぶん昔から多くのブラウザで実装されていたプロパティなのですが,現在は非推奨です。一方で mask は比較的新しいプロパティで,IEでのサポートはありませんでした(* ブラウザ対応状況)。

解禁された mask プロパティたち

IEを切ることで,以下の mask プロパティが利用可能になりました。(※ -webkit- プレフィクスをつける必要があります。)

  • mask-image : 要素のmaskレイヤーを画像で指定する。
  • mask-position : maskレイヤーの位置を指定する。
  • mask-size : maskレイヤーの大きさを指定する。
  • mask-repeat: maskレイヤーをリピートするか否かを指定する。

他にもいくつかの mask プロパティがあるのですが,残念ながら各ブラウザで対応状況が芳しくないため,本記事では取り上げません。

画像をMaskする

mask-image にはgradientプロパティを指定できます。以下の例は線形グラデーションで下方へいくにつれて画像が消えていくような効果を追加しています。

radial-gradient を組み合わせることで,画像を丸型にして,ぼんやりしたフチを演出できます。

さまざまなgradient系のプロパティを駆使すれば,市松模様や縞々模様のマスクを作ることができます。市松模様をつくるために使用している conic-gradient もIEでは動作しないCSSプロパティです。

マウスの位置に合わせてマスクした画像を重ねてあげると,スポットライトのようにできます。

画像表示アニメーションに応用する

実は,いくつかの mask プロパティはCSSアニメーション可能です。画像の読み込みが完了したり,要素がスクロール領域に入ったりしたタイミングで画像をフェードインで表示するような演出はよく用いられますが,これを mask プロパティで味付けすることができます。(ここからのCodePenのサンプルコードではReactを使用していきます。)

まずは比較のために味付けなしの普通のアニメーションです。

以下が mask プロパティでちょいと味付けしたアニメーションたちです。mask-position をアニメーションしています。

最後に mask-size をアニメーションしてみます。

おわりに

IEが引退したことで,これまではJavaScriptやWebGLを使わないと実現できなかった演出を数行のCSSで実装できるようになりました。IEにお疲れ様でしたの気持ちを込めて締めくくりたいと思います。明日3日は @masaya82 です。