回答編集履歴

2

修正

2022/01/06 02:14

投稿

erp
erp

スコア46

test CHANGED
@@ -74,9 +74,9 @@
74
74
 
75
75
  正規表現でページ内リンクを指定して、できました。
76
76
 
77
- 22.01.06 追記
78
77
 
79
78
 
79
+ 22.01.06 追記
80
80
 
81
81
  これだとなぜか<header>にアンカーリンクがある場合、発火しないので、以下に書き換えました。
82
82
 

1

追記

2022/01/06 02:13

投稿

erp
erp

スコア46

test CHANGED
@@ -73,3 +73,107 @@
73
73
 
74
74
 
75
75
  正規表現でページ内リンクを指定して、できました。
76
+
77
+ 22.01.06 追記
78
+
79
+
80
+
81
+ これだとなぜか<header>にアンカーリンクがある場合、発火しないので、以下に書き換えました。
82
+
83
+
84
+
85
+ ```js
86
+
87
+ /* smooth scroll --------------------------------------------- */
88
+
89
+ let Ease = {
90
+
91
+ easeInOut: function (t) {
92
+
93
+ return t < .5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1;
94
+
95
+ }
96
+
97
+ },
98
+
99
+ duration = 1200;
100
+
101
+ let smoothScrollTriggers = [].slice.call(document.querySelectorAll('a[href^="#"]'));
102
+
103
+ smoothScrollTriggers.forEach(function (smoothScrollTrigger) {
104
+
105
+ smoothScrollTrigger.addEventListener('click', function (e) {
106
+
107
+ href = smoothScrollTrigger.getAttribute('href');
108
+
109
+ e.preventDefault();
110
+
111
+ e.stopPropagation();
112
+
113
+ smooth();
114
+
115
+ });
116
+
117
+ });
118
+
119
+ document.addEventListener('click', function (e) {
120
+
121
+ let trigger = e.target;
122
+
123
+ if (trigger.tagName.toLowerCase() === 'a' && trigger.getAttribute('href').match(/^#([a-zA-Z0-9!-/:-@¥[-`{-~]*$)/)) {
124
+
125
+ href = trigger.getAttribute('href');
126
+
127
+ e.preventDefault();
128
+
129
+ e.stopPropagation();
130
+
131
+ smooth();
132
+
133
+ }
134
+
135
+ });
136
+
137
+
138
+
139
+ function smooth() {
140
+
141
+ let targetElement = document.getElementById(href.replace('#', ''));
142
+
143
+ if (targetElement) {
144
+
145
+ let currentPosition = document.documentElement.scrollTop || document.body.scrollTop,
146
+
147
+ targetPosition = window.pageYOffset + targetElement.getBoundingClientRect().top - 115;
148
+
149
+ let startTime = performance.now();
150
+
151
+ let loop = function (nowTime) {
152
+
153
+ let time = nowTime - startTime,
154
+
155
+ normalizedTime = time / duration;
156
+
157
+ if (normalizedTime < 1) {
158
+
159
+ window.scrollTo(0, currentPosition + ((targetPosition - currentPosition) * Ease.easeInOut(normalizedTime)));
160
+
161
+ requestAnimationFrame(loop);
162
+
163
+ } else {
164
+
165
+ window.scrollTo(0, targetPosition);
166
+
167
+ }
168
+
169
+ }
170
+
171
+ requestAnimationFrame(loop);
172
+
173
+ }
174
+
175
+ }
176
+
177
+ /* smooth scroll ----------------------------------------- end */
178
+
179
+ ```