質問編集履歴
2
言語に関するマークアップを修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -16,9 +16,7 @@
|
|
16
16
|
|
17
17
|
|
18
18
|
|
19
|
-
HTML
|
19
|
+
```HTML
|
20
|
-
|
21
|
-
```
|
22
20
|
|
23
21
|
<div id="elemB">要素B</div>
|
24
22
|
|
@@ -26,9 +24,7 @@
|
|
26
24
|
|
27
25
|
|
28
26
|
|
29
|
-
CSS
|
27
|
+
```CSS
|
30
|
-
|
31
|
-
```
|
32
28
|
|
33
29
|
#elemB {
|
34
30
|
|
@@ -76,7 +72,7 @@
|
|
76
72
|
|
77
73
|
|
78
74
|
|
79
|
-
```
|
75
|
+
```JavaScript
|
80
76
|
|
81
77
|
const elemB = document.querySelectorAll("#elemB");
|
82
78
|
|
1
表記ゆれを修正。JSコードを追加
test
CHANGED
File without changes
|
test
CHANGED
@@ -2,9 +2,7 @@
|
|
2
2
|
|
3
3
|
|
4
4
|
|
5
|
-
要素A(body内に1つのみ)が可視領域に入ったら要素Bに対してclassを付与し、
|
5
|
+
「要素A(body内に1つのみ)が可視領域に入ったら要素Bに対してclassを付与し、可視領域から外れたらclassを外す」ことを実現したいです。
|
6
|
-
|
7
|
-
可視領域から外れたらクラスを外すということを実現したいです。
|
8
6
|
|
9
7
|
|
10
8
|
|
@@ -54,7 +52,13 @@
|
|
54
52
|
|
55
53
|
`.is-active`という要素を可視状態にするユーティリティクラスを用意しており、
|
56
54
|
|
57
|
-
|
55
|
+
以下ように`.is-active`の与奪を行うことで、`#elemB`の表示/非表示を切り替えたいです。
|
56
|
+
|
57
|
+
|
58
|
+
|
59
|
+
- 要素Bが画面内に入った場合(上図①→② or ④→③):`.is-active`の付与
|
60
|
+
|
61
|
+
- 要素Bが画面外に出た場合(上図②→① or ③→④):`.is-active`の剥奪
|
58
62
|
|
59
63
|
|
60
64
|
|
@@ -72,6 +76,60 @@
|
|
72
76
|
|
73
77
|
|
74
78
|
|
79
|
+
```
|
80
|
+
|
81
|
+
const elemB = document.querySelectorAll("#elemB");
|
82
|
+
|
83
|
+
|
84
|
+
|
85
|
+
const options = {
|
86
|
+
|
87
|
+
root: null,
|
88
|
+
|
89
|
+
rootMargin: "-100% 0px 0px 0px",
|
90
|
+
|
91
|
+
threshold: 0
|
92
|
+
|
93
|
+
};
|
94
|
+
|
95
|
+
const observer = new IntersectionObserver(doWhenIntersect, options);
|
96
|
+
|
97
|
+
elemB.forEach(entries => {
|
98
|
+
|
99
|
+
observer.observe(entries);
|
100
|
+
|
101
|
+
});
|
102
|
+
|
103
|
+
|
104
|
+
|
105
|
+
function doWhenIntersect(entries) {
|
106
|
+
|
107
|
+
entries.forEach(entry => {
|
108
|
+
|
109
|
+
if (entry.isIntersecting) {
|
110
|
+
|
111
|
+
activateIndex(entry.target);
|
112
|
+
|
113
|
+
}
|
114
|
+
|
115
|
+
});
|
116
|
+
|
117
|
+
}
|
118
|
+
|
119
|
+
|
120
|
+
|
121
|
+
function activateIndex(element) {
|
122
|
+
|
123
|
+
(略)
|
124
|
+
|
125
|
+
}
|
126
|
+
|
127
|
+
```
|
128
|
+
|
129
|
+
※参考:[JSでのスクロール連動エフェクトにはIntersection Observerが便利 - ICS MEDIA](https://ics.media/entry/190902/)
|
130
|
+
|
131
|
+
|
132
|
+
|
75
133
|
- 要素Bが画面内に入った場合(上図①→② or ④→③):コールバックがあるのでクラスの付与が可能
|
76
134
|
|
77
135
|
- 要素Bが画面外に出た場合(上図②→① or ③→④):コールバックがなく、**クラスの剥奪が機能しない**
|