アニメーションで画像をフュージョンさせる方法。Javascriptを用いてクリックで2枚の画像が徐々に切り替わるように設定します。
2枚の画像を用意
画像A
画像B
切り替えたいAとBの2枚の画像を用意します。サイズは違っても構いませんが、アスペクト比を合わせておく必要があります。
クリックで画像を切り替える
通常の切り替え
これはシンプルに画像Aと画像Bをクリックごとに切り替えるパターンです。
-
【JavaScript】触れる・クリックの両方で2枚の画像を切り替える方法【PC・スマホ対応】
続きを見る
クリックで画像をフュージョンさせる
フュージョン切り替え
これはアニメーションで画像をフュージョンさせるパターンです。
画像Aをクリックすると徐々にじわぁ~っと画像Bに切り替わります。再度クリックすると、徐々にじわぁ~っと画像Aに戻ります。
画像Aと画像Bを重ね、Javascriptを用いて透明度opacityの値を徐々に変化させ、フュージョンしているように見せる、といったカラクリです。フュージョン中はクリックできないように制限をかけています。
ソースコード
JavaScriptコード
<script> (function() { const animationConfig = { duration: 2000, // 2秒 easing: function easeInOutQuad(t) { return t < 0.5 ? 2 * t * t : 1 - Math.pow(-2 * t + 2, 2) / 2; } }; function preloadImages(sources) { sources.forEach(src => { const img = new Image(); img.src = src; }); } function handleImageClick(event) { const container = event.target.closest('.fusion-container'); if (!container) return; const bottomImg = container.querySelector('.bottom'); const topImg = container.querySelector('.top'); container.style.pointerEvents = 'none'; let progress = 0; const startTime = performance.now(); function animate(currentTime) { progress = (currentTime - startTime) / animationConfig.duration; if (progress < 1) { const easeProgress = animationConfig.easing(progress); topImg.style.opacity = easeProgress; requestAnimationFrame(animate); } else { topImg.style.opacity = 1; [bottomImg.src, topImg.src] = [topImg.src, bottomImg.src]; topImg.style.opacity = 0; container.style.pointerEvents = 'auto'; } } requestAnimationFrame(animate); } document.addEventListener('click', function(event) { const container = event.target.closest('.fusion-container'); if (container) { handleImageClick(event); } }); document.querySelectorAll('.fusion-container').forEach(container => { const bottomSrc = container.querySelector('.bottom').getAttribute('data-src-a'); const topSrc = container.querySelector('.top').getAttribute('data-src-b'); preloadImages([bottomSrc, topSrc]); }); })(); </script>
JavaScriptコードは</body>の前に入れます。
3行目のduration: 2000はフュージョンする時間(ミリ秒)を表します。3500にすれば3.5秒になります。
HTMLコード
<div class="fusion-container" style="position: relative; width: 100%; max-width: 200px; height: 200px; cursor: pointer;"> <img src="a.jpg" class="fusion-img bottom" data-src-a="a.jpg" data-src-b="b.jpg" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; object-fit: cover;"> <img src="b.jpg" class="fusion-img top" data-src-a="a.jpg" data-src-b="b.jpg" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; opacity: 0; object-fit: cover;"> </div>
a.jpgとb.jpgを各3箇所ずつ設定します。初期表示はa.jpgです。
画像のサイズはmax-width: 200px;、height: 200px;と設定しています。画像サイズに応じてイジってください。
画像に触れた時にカーソルが手の形になるようcursor: pointer;を設定しています。これはクリックできる要素だよ~とわかりやすくするためですが、普通のカーソルのままがよければ削除してください。
JavaScriptを使わないシンプルなパターン
簡易フュージョン切り替え
HTMLとCSSだけでも似たようなことができます。
画像Aと画像Bが切り替わる瞬間に画像が若干薄れて見える、アニメーション中にクリックできてしまう、という欠点はありますが、JavaScriptを使わないので実装は簡単です。