一方、親要素であるwrapper
では高さ(今回は350vh
)を設定し、子要素が追従可能な領域を明示的に確保しています。この高さがあることで、container
を固定したままマスクと画像のアニメーションを発動させる余白ができます。
.wrapper { width: 100%; height: 350vh;}
JavaScript(GSAP)では、スクロール操作に応じて2つの異なるアニメーションを設定しています。マスクと画像、それぞれに異なる動きを与えることで、よりダイナミックな視覚効果を実現しています。
対象要素 | アニメーションの内容 |
---|---|
.mask (マスク) | 画像を覆うマスクのサイズを拡大する |
.img (画像) | 画像自体のスケールを縮小する(拡大から通常サイズに戻す) |
.mask
要素にはoverflow: hidden;
を指定することで、画像の一部だけが表示されるようにしています。これによりマスクのサイズが変化することで画像の見え方も変化します。
アニメーションの中では、width
を40% → 100%に変化させ、あたかも画像がズームインしているような効果を演出しています。
プロパティ | 初期値 | アニメーション完了時 |
---|---|---|
width | 40% | 100% |
height | 成り行き(aspect-ratioで計算された値) | ブラウザの高さ |
また、height
はaspect-ratio
による自動計算ではなく、window.innerHeight
を用いてブラウザの高さに合わせています。
height: () => window.innerHeight + "px",
このようにwidth
とheight
を同時に拡大することで、マスクの拡大がより自然に、かつ全画面へと切り替わるように見せることが可能となります。
次に、画像そのものに対してscale
アニメーションを設定しています。初期状態では画像を拡大表示(scale: 2)させ、アニメーションの完了時には等倍(scale: 1)に戻しています。
プロパティ | 初期値 | アニメーション完了時 |
---|---|---|
scale | 2 | 1 |
このアニメーションは、マスクの拡大と組み合わせることで、「マスクが拡がり、画像はちょうどよく収まる」ように見せる工夫です。視覚的なバランスの問題で追加している処理なので、必要に応じて省略も可能です。
以上、GSAPを用いた画像拡大・固定アニメーションの仕組みでした。デザインのアクセントとして取り入れたい場合にぜひ活用してみたいです。