実現したいこと
サイトのように、範囲を決めて、マウスを追いかけ、クリックで画像がランダムに表示され、一定枚数で、すべてが消滅する繰り返し処理を実現したい。
発生している問題・分からないこと
基本的には、マウスをイラストが追いかけるのだが、下の方に行くと追いかけなくなり、また、画像がランダムに表示されるが、一回出現したものが再び出現してしまう。
エラーメッセージ
error
1うまく処理が行われません
該当のソースコード
Html
1<!DOCTYPE html> 2<html> 3 4<head> 5 <meta charset="UTF-8"> 6 <title>カーソル追従イラストとランダム画像</title> 7 <style> 8 body { 9 margin: 0; 10 position: relative; 11 height: 200vh; 12 width: 100%; 13 background-color: #e97d7d; 14 } 15 16 #hero { 17 width: 100vw; 18 height: 120vh; 19 background-color: rgb(129, 125, 236); 20 margin-top: 0; 21 position: absolute; 22 } 23 24 25 .illustration { 26 position: absolute; 27 pointer-events: none; 28 will-change: transform; 29 z-index: 5; 30 display: none; 31 } 32 33 .active { 34 display: block; 35 } 36 37 .random-image { 38 position: absolute; 39 transition: opacity 0.5s linear; 40 opacity: 1; 41 } 42 43 * { 44 outline: 2px solid red; 45 } 46 </style> 47</head> 48 49 50<body> 51 <img src='https://via.placeholder.com/50x50/000000/ffffff?text=Cursor' alt="" class="illustration"> 52 <div id="hero"> 53 54 </div> 55 56 <script> 57 58 var mouseX = window.innerWidth / 2; 59 var mouseY = window.innerHeight / 2; 60 var illustrationX = mouseX; 61 var illustrationY = mouseY; 62 63 const illustration = document.querySelector(".illustration"); 64 65 illustration.onload = function () { 66 67 68 illustrationX = mouseX; 69 illustrationY = mouseY; 70 71 updateIllustration(); 72 73 }; 74 75 76 // 遅延付きでイラストの位置を更新★ 77 function updateIllustration() { 78 var dx = mouseX - illustrationX; 79 var dy = mouseY - illustrationY; 80 81 82 var delayFactor = 0.1; 83 // 遅延の調整 84 85 illustrationX += dx * delayFactor; 86 illustrationY += dy * delayFactor; 87 88 89 illustration.style.transform = 'translate(' + (illustrationX - illustration.width / 2) + 'px, ' + (illustrationY - illustration.height / 2) + 'px)'; 90 91 92 requestAnimationFrame(updateIllustration); 93 94 } 95 96 97 98 // マウス位置の更新 99 document.addEventListener('mousemove', onMouseMove); 100 101 102 function onMouseMove(event) { 103 mouseX = event.clientX; 104 mouseY = event.clientY; 105 106 107 } 108 109 110 111 112 113 114 115 hero.addEventListener('mouseover', () => handlerMouseStoker(true)); 116 hero.addEventListener('mouseout', () => handlerMouseStoker(false)); 117 118 function handlerMouseStoker(isActive) { 119 illustration.classList.toggle('active', isActive); 120 } 121 122 123 124 125 126 // 画像を管理する配列 127 var imagesArray = []; 128 129 // クリック回数をカウントする変数 130 var clickCounter = 0; 131 var maxClicks = 6; // 6回目のクリック後に画像がフェードアウト 132 133 // ランダム画像のURL配列 134 var randomImages = [ 135 'https://via.placeholder.com/100x100/ff0000/ffffff?text=1', 136 'https://via.placeholder.com/100x100/00ff00/ffffff?text=2', 137 'https://via.placeholder.com/100x100/0000ff/ffffff?text=3', 138 'https://via.placeholder.com/100x100/ffff00/ffffff?text=4', 139 'https://via.placeholder.com/100x100/00ffff/ffffff?text=5' 140 ]; 141 142 143 // クリック時にランダム画像を生成 144 document.addEventListener('click', onClick); 145 146 function onClick(event) { 147 clickCounter++; // クリックカウンターを増加 148 149 var randomImage = document.createElement('img'); 150 var randomIndex = Math.floor(Math.random() * randomImages.length); 151 randomImage.src = randomImages[randomIndex]; 152 randomImage.classList.add('random-image'); 153 randomImage.style.opacity = 1; 154 document.body.appendChild(randomImage); 155 156 // 画像の読み込み後に位置を設定 157 randomImage.onload = function () { 158 randomImage.style.left = (mouseX - randomImage.width / 2) + 'px'; 159 randomImage.style.top = (mouseY - randomImage.height / 2) + 'px'; 160 }; 161 162 // 画像を配列に追加 163 imagesArray.push(randomImage); 164 165 // 6回目のクリック後に全ての画像をフェードアウト 166 if (clickCounter === maxClicks) { 167 imagesArray.forEach(function (image) { 168 image.style.opacity = 0; 169 // フェードアウト後にDOMから削除 170 image.addEventListener('transitionend', function () { 171 if (image.parentNode) { 172 image.parentNode.removeChild(image); 173 } 174 }); 175 }); 176 // 配列をクリア 177 imagesArray = []; 178 // クリックカウンターをリセット 179 clickCounter = 0; 180 } 181 } 182 </script> 183</body> 184 185</html>
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
display:noneとblockの切り替えがうまくいっていないようにも思われるが分かりません。
補足
特になし
重複質問、マルチポスト。
https://teratail.com/questions/l5d27100zipt4x#reply-dyq901o5dn6vwc
https://qiita.com/codeazuki/questions/dadc116cbe4d631697aa
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10304520465
マルチに反応するのもあれですが
>下の方に行くと追いかけなくなり
この「下の方」とは具体的にどういう領域ですか? 画面の半分より下?
> 一回出現したものが再び出現してしまう
たった5つの画像をランダムに表示しているだけなので、同じものが複数出るのはあたりまえと思いますが、どうしたいのですか?
回答1件
あなたの回答
tips
プレビュー