質問するログイン新規登録

回答編集履歴

2

修正

2022/01/06 02:14

投稿

erp
erp

スコア46

answer CHANGED
@@ -36,8 +36,8 @@
36
36
  ```
37
37
 
38
38
  正規表現でページ内リンクを指定して、できました。
39
+
39
40
  22.01.06 追記
40
-
41
41
  これだとなぜか<header>にアンカーリンクがある場合、発火しないので、以下に書き換えました。
42
42
 
43
43
  ```js

1

追記

2022/01/06 02:13

投稿

erp
erp

スコア46

answer CHANGED
@@ -35,4 +35,56 @@
35
35
 
36
36
  ```
37
37
 
38
- 正規表現でページ内リンクを指定して、できました。
38
+ 正規表現でページ内リンクを指定して、できました。
39
+ 22.01.06 追記
40
+
41
+ これだとなぜか<header>にアンカーリンクがある場合、発火しないので、以下に書き換えました。
42
+
43
+ ```js
44
+ /* smooth scroll --------------------------------------------- */
45
+ let Ease = {
46
+ easeInOut: function (t) {
47
+ return t < .5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1;
48
+ }
49
+ },
50
+ duration = 1200;
51
+ let smoothScrollTriggers = [].slice.call(document.querySelectorAll('a[href^="#"]'));
52
+ smoothScrollTriggers.forEach(function (smoothScrollTrigger) {
53
+ smoothScrollTrigger.addEventListener('click', function (e) {
54
+ href = smoothScrollTrigger.getAttribute('href');
55
+ e.preventDefault();
56
+ e.stopPropagation();
57
+ smooth();
58
+ });
59
+ });
60
+ document.addEventListener('click', function (e) {
61
+ let trigger = e.target;
62
+ if (trigger.tagName.toLowerCase() === 'a' && trigger.getAttribute('href').match(/^#([a-zA-Z0-9!-/:-@¥[-`{-~]*$)/)) {
63
+ href = trigger.getAttribute('href');
64
+ e.preventDefault();
65
+ e.stopPropagation();
66
+ smooth();
67
+ }
68
+ });
69
+
70
+ function smooth() {
71
+ let targetElement = document.getElementById(href.replace('#', ''));
72
+ if (targetElement) {
73
+ let currentPosition = document.documentElement.scrollTop || document.body.scrollTop,
74
+ targetPosition = window.pageYOffset + targetElement.getBoundingClientRect().top - 115;
75
+ let startTime = performance.now();
76
+ let loop = function (nowTime) {
77
+ let time = nowTime - startTime,
78
+ normalizedTime = time / duration;
79
+ if (normalizedTime < 1) {
80
+ window.scrollTo(0, currentPosition + ((targetPosition - currentPosition) * Ease.easeInOut(normalizedTime)));
81
+ requestAnimationFrame(loop);
82
+ } else {
83
+ window.scrollTo(0, targetPosition);
84
+ }
85
+ }
86
+ requestAnimationFrame(loop);
87
+ }
88
+ }
89
+ /* smooth scroll ----------------------------------------- end */
90
+ ```