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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

0回答

1173閲覧

Intersection Observer API発火させたい要素が2つあるときのJSの書き方を知りたい

siroman-ju

総合スコア0

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

1クリップ

投稿2020/07/22 14:40

前提・実現したいこと

Intersection Observer APIで発火させたい要素が2つあるときのJSの書き方を知りたい

現在ポートフォリオサイトを制作しているのですが、スクロールで要素をふわっと表示させるにあたって、Intersection Observer APIというものが便利そうだなと思い導入することにしました。

記事を参考にしつつ、スクロールをふわっと表示させることには成功したのですが、、

ついでにスクロールに合わせてヘッダーメニューに色を付けるアニメーションも実装したいと思いました。
こちらのICS Mediaさんの執筆されている記事を参考に実装したいと考えています
https://ics.media/entry/190902/

つまり、実現したい要件としましては
######スクロールに合わせてふわっとコンテンツを表示させる+スクロールに合わせてヘッダーメニューの色を変える

この2つの要件をintersection Observer APIで実現できればと思っています。

発生している問題・エラーメッセージ

ここからが問題なのですが、
発火を制御したい要素が二種類ある場合、Intersection Observer APIのJSの記法としてどんな風に書けばいいかわからず詰んでいます。

おそらく、JSの基本的な概念をしっかりと理解していれば困らないポイントだと思うのですが、JSに疎いためどうしたらいいかわからずです。
現状以下のようなコードです。(これだと両方発火しない。どちらかを消す必要がある)
重複した宣言をしているのがよくないと思うのですが、まとめて記述する方法が分かりません。。

初歩的な質問でお恥ずかしい限りですが、JSに知見のある諸兄の皆様に解決方法をご教示できればと思い質問させて頂きました!
大変拙い説明で恐縮ですが、何卒よろしくお願いします。

エラーメッセージ

該当のソースコード

javascript

1 2//1つ目の要件 3// ヘッダーメニューの色変更 4//columnが各セクションのwrapper 5const boxes = document.querySelectorAll(".column"); 6 7const options = { 8 root: null, 9 rootMargin: "-50% 0px", 10 threshold: 0 11}; 12 13const observer = new IntersectionObserver(doWhenIntersect, options); 14boxes.forEach(box => { 15 observer.observe(box); 16}); 17 18function doWhenIntersect(entries) { 19 // 交差検知をしたもののなかで、isIntersectingがtrueのDOMを色を変える関数に渡す 20 entries.forEach(entry => { 21 if (entry.isIntersecting) { 22 activateIndex(entry.target); 23 } 24 }); 25} 26 27 28 29// @param entries 30 31function activateIndex(element) { 32 // すでにアクティブになっている目次を選択 33 const currentActiveIndex = document.querySelector("#columnList .active"); 34 // すでにアクティブになっているものが0個の時(=null)以外は、activeクラスを除去 35 if (currentActiveIndex !== null) { 36 currentActiveIndex.classList.remove("active"); 37 } 38 // 引数で渡されたDOMが飛び先のaタグを選択し、activeクラスを付与 39 const newActiveIndex = document.querySelector(`a[href='#${element.id}']`); 40 newActiveIndex.classList.add("active"); 41} 42 43//2つ目の要件 44//スクロールに合わせてコンテンツをふわっと表示 45const target = document.querySelectorAll('.js_column'); 46 47const options = { 48 root: null, 49 rootMargin: "-50% 0px", 50 threshold: 0 51 }; 52 53const observer = new IntersectionObserver((changes) => { 54 if(changes[0].isIntersecting){ 55 changes[0].target.classList.add('is-actives'); 56 } else { 57 changes[0].target.classList.remove('is-actives'); 58 } 59}); 60 61//対象となる要素が複数かどうかを判定 62for(let i = 0; i < target.length; i++){ 63 observer.observe(target[i]); 64}

試したこと

思いつかなかった

補足情報(FW/ツールのバージョンなど)

作っているのはHTMLドキュメント、CSS、JSの静的なwebサイトです。

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

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

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

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

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

saoyagi2

2020/07/24 03:50

options, observer が const(定数)なのに同じ名前で使いまわされていますね。これをそれぞれ違う名前に変えてやったらどうなりますか?
Lhankor_Mhy

2020/07/25 03:28

「まだ回答を求めています」とのことですが、 上記のsaoyagi2さんの補足依頼がほとんどそのまま回答だと思います。 ご不明な点はなんですか?
siroman-ju

2020/07/25 03:37

saoyagi2様 回答いただきありがとうございます! 返信が遅くなってしまったことをご容赦頂ければ幸いです。 アドバイス通りに修正したところ、問題なく両方発火しました! 助かりました!改めてお礼申し上げます。
siroman-ju

2020/07/25 03:40

Lhankor_Mhy様 ご回答いただきありがとうございます。 saoyagi2様の回答で問題なく発火しました! テラテイルを使うのが初めてでして誤って「まだ回答を求めています」としてしまいました。 これで解決済みとさせていただきます。 お気遣いいただき、ありがとうございます!
siroman-ju

2020/07/25 04:55

Lhankor_Mhy様 ご教示頂き感謝します! ヘルプも参考にさせて頂き、解決済みの処理を進めようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問