質問編集履歴

1

追記1を追加しました。

2018/10/30 07:33

投稿

zunda_mochi
zunda_mochi

スコア7

test CHANGED
File without changes
test CHANGED
@@ -177,3 +177,161 @@
177
177
  ankerClickPageMove();
178
178
 
179
179
  ```
180
+
181
+
182
+
183
+ ---
184
+
185
+
186
+
187
+ ## 追記1
188
+
189
+
190
+
191
+ アドバイスを元に修正してみました。
192
+
193
+ 前より軽くなり、計測もできるようになりました。
194
+
195
+ ただ、計測時は重くないブラウザが止まってしまいますが。。。
196
+
197
+
198
+
199
+ ```
200
+
201
+ const ankerClickPageMove = () => {
202
+
203
+ //定数
204
+
205
+ const anker = document.querySelectorAll('a[href^="#"]:not([target="_blank"])'),
206
+
207
+ ankerNum = anker.length,
208
+
209
+ max = 50,
210
+
211
+ interval = 10;
212
+
213
+
214
+
215
+ //アニメーション
216
+
217
+ function easeOut(p) {
218
+
219
+ return p * (2 - p);
220
+
221
+ };
222
+
223
+
224
+
225
+ //位置取得
226
+
227
+ function getTargetTop(elm) {
228
+
229
+ const href = elm.getAttribute('href'),
230
+
231
+ target = document.querySelector(href),
232
+
233
+ info = target.getBoundingClientRect(),
234
+
235
+ posY = info.top + window.pageYOffset;
236
+
237
+
238
+
239
+ return posY;
240
+
241
+ };
242
+
243
+
244
+
245
+ //位置情報へ移動
246
+
247
+ function setTargetMove(elm) {
248
+
249
+ //変数
250
+
251
+ let progress = 0,
252
+
253
+ goal = 0,
254
+
255
+ action = null;
256
+
257
+
258
+
259
+ //定数
260
+
261
+ const start = window.pageYOffset, //スタート位置
262
+
263
+ move = function() {
264
+
265
+ let pos = getTargetTop(elm), //最終位置
266
+
267
+ diff = pos - start,
268
+
269
+ upOrDown = diff <= 0;
270
+
271
+
272
+
273
+ progress++;
274
+
275
+ goal = start + (diff * easeOut(progress / max));
276
+
277
+
278
+
279
+ window.scrollTo(0, goal);
280
+
281
+
282
+
283
+ // 目的位置に到達したらSTOP
284
+
285
+ if ((upOrDown && pos >= goal) || (!upOrDown && goal >= pos)) {
286
+
287
+ clearInterval(action);
288
+
289
+
290
+
291
+ progress = null;
292
+
293
+ goal = null;
294
+
295
+ action = null;
296
+
297
+ }
298
+
299
+ };
300
+
301
+
302
+
303
+ action = setInterval(move, interval);
304
+
305
+ };
306
+
307
+
308
+
309
+ //クリックイベントをセットする
310
+
311
+ function setClickEvent() {
312
+
313
+ for(let i = 0; i < ankerNum; i++) {
314
+
315
+ const _self = anker[i];
316
+
317
+
318
+
319
+ _self.addEventListener('click', function(e) {
320
+
321
+ e.preventDefault();
322
+
323
+ setTargetMove(this);
324
+
325
+ });
326
+
327
+ }
328
+
329
+ };
330
+
331
+
332
+
333
+ setClickEvent();
334
+
335
+ }
336
+
337
+ ```