質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

287閲覧

JavaScript IntersectionObserverでひとつの要素の条件を満たした際に複数要素が動くようにしたい

mizuta_tamari

総合スコア3

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2024/04/10 03:11

実現したいこと

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");

の部分にエラーが出ます。

補足

特になし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

int32_t

2024/04/10 03:24

> の部分にエラーが出ます。 どのようなエラーですか。
mizuta_tamari

2024/04/10 03:40

すみません、エラーが出ていたのはfor文をforEachで記述していた修正前の段階の話でした。質問に記載したコードではエラーが出ません。一応forEachにしていたときのエラーを載せておきます。 Uncaught TypeError: Cannot read properties of undefined (reading 'classList') at script.js:27:41 at NodeList.forEach (<anonymous>) at IntersectionObserver.<anonymous> (script.js:27:16)
guest

回答1

0

ベストアンサー

js

1const fadeImgs = document.getElementsByClassName(".fade-img");

document.getElementsByClassName("fade-img") (.を消す)か document.querySelectorAll(".fade-img") にすると動くかもしれません。

投稿2024/04/10 03:44

編集2024/04/10 03:45
int32_t

総合スコア21927

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mizuta_tamari

2024/04/10 03:52

・document.getElementsByClassName("fade-img") (.を消す) ・document.querySelectorAll(".fade-img") 両方試して両方とも思い通りに動作しました!ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問