回答編集履歴

1

追記

2023/11/02 01:19

投稿

Lhankor_Mhy
Lhankor_Mhy

スコア36158

test CHANGED
@@ -1,3 +1,105 @@
1
1
  `currentSection`が更新されるのは`scrollToSection()`でだけなので、`touchScrollEnabled`のフラグが下りている時にセクションを通過しても更新されないのが問題のように思います。
2
2
  `currentSection`の管理をセクションスクロールと切り離してみてはどうでしょうか。
3
3
 
4
+ ---
5
+
6
+ ご希望とは違うかもしれませんが、IntersectionObserver と scroll-snap を使って似たようなものを書いてみました。
7
+
8
+ ```html
9
+ <!DOCTYPE html>
10
+ <html lang="en">
11
+
12
+ <head>
13
+ <meta charset="UTF-8">
14
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
15
+ <title>Document</title>
16
+ <link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/destyle.css@3.0.0/destyle.min.css">
17
+ <style>
18
+ .section {
19
+ height: 100vh;
20
+ }
21
+
22
+ .contents1 {
23
+ background: #ff8080;
24
+ }
25
+
26
+ .contents2 {
27
+ background: #ff80c0;
28
+ }
29
+
30
+ .contents3 {
31
+ background: #8080ff;
32
+ }
33
+
34
+ .contents4 {
35
+ background: #c0c0c0;
36
+ height: 800px;
37
+ }
38
+
39
+ .contents5 {
40
+ background: #70df00;
41
+ height: 700px;
42
+ }
43
+
44
+ .contents6 {
45
+ background: #5badff;
46
+ height: 600px;
47
+ }
48
+
49
+ html.scrollSnap {
50
+ scroll-snap-type: y mandatory;
51
+ }
52
+
53
+ .section {
54
+ scroll-snap-align: start;
55
+ }
56
+ </style>
57
+ </head>
58
+
59
+ <body>
60
+ <div class="section contents1">
61
+ コンテンツ1
62
+ </div>
63
+ <div class="section contents2">
64
+ コンテンツ2
65
+ </div>
66
+ <div class="section contents3">
67
+ コンテンツ3
68
+ </div>
69
+ <div class="scrollNotSnap">
70
+ <div class="section contents4">
71
+ コンテンツ4(通常スクロール)
72
+ </div>
73
+ <div class="section contents5">
74
+ コンテンツ5(通常スクロール)
75
+ </div>
76
+ <div class="section contents6">
77
+ コンテンツ6(通常スクロール)
78
+ </div>
79
+ </div>
80
+
81
+ <script>
82
+ const callback = (entries, observer) => {
83
+ entries.forEach((entry) => {
84
+ if (entry.isIntersecting) {
85
+ document.documentElement.classList.remove('scrollSnap')
86
+ } else {
87
+ document.documentElement.classList.add('scrollSnap')
88
+ }
89
+ });
90
+ };
91
+ const options = {
92
+ root: document,
93
+ rootMargin: '-99% 0px -1%',
94
+ threshold: 0
95
+ }
96
+
97
+ const observer = new IntersectionObserver(callback, options);
98
+ document.querySelectorAll('.scrollNotSnap').forEach(el => observer.observe(el))
99
+
100
+ </script>
101
+ </body>
102
+
103
+ </html>
104
+ ```
105
+