こんにちは。
Intersection Observer を使うのはいかがでしょうか。
Intersection Observer API - Web API | MDN
サンプルを作りました。
html
1 <section></section>
2 <section></section>
3 <section></section>
css
1 html {
2 scroll-snap-type: y mandatory;
3 }
4
5 section {
6 width: 100%;
7 height: 100vh;
8 scroll-snap-align: start;
9 opacity: 0;
10 transition: 1s;
11 }
12 section.active {
13 opacity: 1;
14 }
js
1 const observer = new IntersectionObserver(
2 entries => {
3 entries.forEach(e => {
4 if (e.isIntersecting) e.target.classList.add('active');
5 })
6 },
7 { threshold: 0.5 }
8 );
9 document.querySelectorAll('section').forEach(e => {
10 observer.observe(e);
11 });
コメントを受けて追記
サンプル
css
1 section {
2 width: 100%;
3 height: 100vh;
4 box-sizing: border-box;
5 opacity: 0;
6 transition: 1s;
7 position: fixed;
8 }
9
10 section.active {
11 opacity: 1;
12 z-index: 2;
13 }
js
1 let f = true;
2 document.addEventListener('wheel', e => {
3 if (f) {
4 const target = document.querySelector('section.active');
5 const shown = (e.deltaY > 0) ?
6 target.nextElementSibling :
7 target.previousElementSibling;
8 shown?.classList.add('active');
9 target.classList.remove('active');
10 f = false;
11 }
12 });
13 document.querySelectorAll('section').forEach(el => el.addEventListener('transitionend', e => {
14 f = true;
15 }));
境界の処理とかはしてないので、上手くやってください。
ただ、これ、自前で実装するよりも、パララックスやスクロールのプラグインを使った方が上手くいくかもしれませんよ。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/08 02:26
2020/08/08 02:29
2020/08/08 02:31
2020/08/08 02:42
2020/08/08 02:45
2020/08/08 02:51
2020/08/08 02:52
2020/08/08 02:54
2020/08/08 02:54
2020/08/08 02:59
2020/08/08 03:04
2020/08/08 03:53