回答編集履歴

2

加筆

2020/05/01 08:05

投稿

AkitoshiManabe
AkitoshiManabe

スコア5434

test CHANGED
@@ -134,7 +134,7 @@
134
134
 
135
135
 
136
136
 
137
- MDNの説明にもあるように root(表示基準要素) と target(監視対象要素) との2つの矩形の重なり具合(交差率)を監視するもので、スクロールが発生したときには、重なり具合の再計算が行われているのでスクロールにも使える実装のようです。
137
+ MDNの説明にもあるように root(表示基準要素) と target(監視対象要素) との2つの矩形の重なり具合(交差率)を監視するもので、スクロールが発生したときには、重なり具合の再計算が行われているのでスクロールにも使える実装のようです。
138
138
 
139
139
 
140
140
 
@@ -146,11 +146,13 @@
146
146
 
147
147
  ※CODEPEN でも[動かしてみました](https://codepen.io/AkitoshiManabe/pen/zYvKxvL?editors=1111)。
148
148
 
149
+ (ゆっくりスクロール操作すると、重なり具合が 25%~75% のときに着色される動作になっています)
150
+
149
151
 
150
152
 
151
153
  root(デフォルトはviewport)の矩形に対して、監視指定した要素の交差率を考えるだけで良いため、
152
154
 
153
- コンストラクタに渡すオプションには、表示の変化をイメージして、マージンやしきい値を定義する必要があるようです。
155
+ コンストラクタに渡すオプションには、表示の変化をイメージして、マージンやしきい値を定義する必要があるようです。
154
156
 
155
157
 
156
158
 

1

追記

2020/05/01 08:05

投稿

AkitoshiManabe
AkitoshiManabe

スコア5434

test CHANGED
@@ -96,9 +96,9 @@
96
96
 
97
97
  }
98
98
 
99
+ else {
99
100
 
100
-
101
- if( entry.isIntersecting ){
101
+ //if( entry.isIntersecting ){ // コメントを受けて修正
102
102
 
103
103
  console.log(elm.className + 'を着色');
104
104
 
@@ -121,3 +121,37 @@
121
121
  iObserver.observe( document.querySelector(".Blue") );
122
122
 
123
123
  ```
124
+
125
+
126
+
127
+ ----
128
+
129
+ 追記)コードブロックを訂正してあります
130
+
131
+
132
+
133
+ IntersectionObserver は 「監視イベントであって、スクロールイベントではない」という点に着目すべきかもしれません(**「何ピクセルスクロールしたから…」という考え方ではない**ように思います)。
134
+
135
+
136
+
137
+ MDNの説明にもあるように root(表示基準要素) と target(監視対象要素) との2つの矩形の重なり具合(交差率)を監視するもので、スクロールが発生すしたときには、重なり具合の再計算が行われているのでスクロールにも使える実装のようです。
138
+
139
+
140
+
141
+ しきい値に設定した1回以上の**任意のタイミングで発火させることができる**ので、回答に例示したコードでは4つのタイミングで「重なり具合を意味する entry.intersectionRatio」で切り分ける処理をイベントリスナに書いたつもりです。他にもイベント発火を1回にしつつ、矩形情報 BoundingRect を比較演算した結果を切り分ける条件もできそうです。
142
+
143
+
144
+
145
+
146
+
147
+ ※CODEPEN でも[動かしてみました](https://codepen.io/AkitoshiManabe/pen/zYvKxvL?editors=1111)。
148
+
149
+
150
+
151
+ root(デフォルトはviewport)の矩形に対して、監視指定した要素の交差率を考えるだけで良いため、
152
+
153
+ コンストラクタに渡す、オプションには、表示の変化をイメージして、マージンやしきい値を定義する必要があるようです。
154
+
155
+
156
+
157
+ [前回のご質問で cobm さんの回答](https://teratail.com/questions/257427#reply-370478)にあるリンク先の説明も読み返してみると解りやすいかと思います。