実現したいこと
IntersectionObserverで、ひとつめの画像とviewportが重なったとき複数の画像が同時に動き出すようにしたい
発生している問題・分からないこと
少しずつずらした画像を4枚配置していて、スクロールしてきたときに浮き出るようにしたく、以下で動かしてみました。
const fadeImg = document.querySelectorAll(".fade-img"); var options = {threshold:1}; var fadeObserver = new IntersectionObserver((entries) => { if(entries[0].isIntersecting) { entries[0].target.classList.add("fade"); } else { return; } }, options); fadeImg.forEach(function(value){fadeObserver.observe(value)});
上だと一応動くのですが、これだと画像それぞれがthreshold:1になったときに動くため、動作がバラバラになってしまうので、1枚目の画像にスクロールした時点で4枚すべてが同時に動くように変更したいです。
基準となる要素(1枚目の画像)fadeImgとすべての要素(画像4枚分)fadeImgsをそれぞれ取得して監視対象にfadeImgを指定しentries[0].isIntersectingがtrueのときにfadeImgsのすべてにfor文でクラス名を追加するようにしてみたのですが、うまく動きません。
初心者なので間違っている部分が多いかと思いますが、ご教示いただけますと幸いです。よろしくお願いいたします。
該当のソースコード
HTML
1 <div id="description-img"> 2 <img class="fade-img fade-img-first" src="img/img_01.png" alt=""> 3 <img class="fade-img" src="img/img_02.png" alt=""> 4 <img class="fade-img" src="img/img_03.png" alt=""> 5 <img class="fade-img" src="img/img_04.png" alt=""> 6 </div>
CSS
1#description-img { 2 position: relative; 3 width: 100%; 4 height: 50vh; 5} 6 7#description-img img{ 8 opacity: 0; 9 display: block; 10} 11 12#description-img img:nth-child(1) { 13 position: absolute; 14 left: 0.6%; 15 top: 36px; 16 width: 35%; 17} 18 19#description-img img:nth-child(2) { 20 position: absolute; 21 left: 36.5%; 22 top: 256px; 23 width: 13%; 24 rotate: 65deg; 25} 26 27#description-img img:nth-child(3) { 28 position: absolute; 29 left: 53.8%; 30 top: 20%; 31 width: 18%; 32 rotate: -19deg; 33} 34 35#description-img img:nth-child(4) { 36 position: absolute; 37 left: 74.4%; 38 top: 122px; 39 width: 18%; 40 rotate: 18deg; 41} 42 43.fade { 44 animation: fade 2s; 45 animation-fill-mode:forwards; 46} 47 48@keyframes fade { 49 0% { 50 opacity:0; 51 } 52 100% { 53 opacity:1; 54 } 55}
JavaScript
1// 動かす要素を取得 2const fadeImgs = document.getElementsByClassName(".fade-img"); 3 4// 起動の基準となる要素を取得 5const fadeImg = document.querySelector(".fade-img-first"); 6let options = {threshold:1}; 7let fadeObserver = new IntersectionObserver((entries) => { 8 if(entries[0].isIntersecting) { 9 // 動かしたい要素をひとつずつ取り出してクラス名を追加 10 for(var i=0; i<fadeImgs.length; i++) { 11 var element = fadeImgs[i]; 12 element.classList.add("fade"); 13 // ここでfor文が機能しているか確認のためconsole.logを追加しましたが動いていないようでした 14 console.log("succsess "+ [i]); 15 } 16 } else { 17 return; 18 } 19}, options); 20fadeObserver.observe(fadeImg);
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
element.classList.add("fade");
の部分にエラーが出ます。
補足
特になし

回答1件
あなたの回答
tips
プレビュー