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

質問編集履歴

1

追記1を追加しました。

2018/10/30 07:33

投稿

zunda_mochi
zunda_mochi

スコア7

title CHANGED
File without changes
body CHANGED
@@ -87,4 +87,83 @@
87
87
  }
88
88
 
89
89
  ankerClickPageMove();
90
+ ```
91
+
92
+ ---
93
+
94
+ ## 追記1
95
+
96
+ アドバイスを元に修正してみました。
97
+ 前より軽くなり、計測もできるようになりました。
98
+ ただ、計測時は重くないブラウザが止まってしまいますが。。。
99
+
100
+ ```
101
+ const ankerClickPageMove = () => {
102
+ //定数
103
+ const anker = document.querySelectorAll('a[href^="#"]:not([target="_blank"])'),
104
+ ankerNum = anker.length,
105
+ max = 50,
106
+ interval = 10;
107
+
108
+ //アニメーション
109
+ function easeOut(p) {
110
+ return p * (2 - p);
111
+ };
112
+
113
+ //位置取得
114
+ function getTargetTop(elm) {
115
+ const href = elm.getAttribute('href'),
116
+ target = document.querySelector(href),
117
+ info = target.getBoundingClientRect(),
118
+ posY = info.top + window.pageYOffset;
119
+
120
+ return posY;
121
+ };
122
+
123
+ //位置情報へ移動
124
+ function setTargetMove(elm) {
125
+ //変数
126
+ let progress = 0,
127
+ goal = 0,
128
+ action = null;
129
+
130
+ //定数
131
+ const start = window.pageYOffset, //スタート位置
132
+ move = function() {
133
+ let pos = getTargetTop(elm), //最終位置
134
+ diff = pos - start,
135
+ upOrDown = diff <= 0;
136
+
137
+ progress++;
138
+ goal = start + (diff * easeOut(progress / max));
139
+
140
+ window.scrollTo(0, goal);
141
+
142
+ // 目的位置に到達したらSTOP
143
+ if ((upOrDown && pos >= goal) || (!upOrDown && goal >= pos)) {
144
+ clearInterval(action);
145
+
146
+ progress = null;
147
+ goal = null;
148
+ action = null;
149
+ }
150
+ };
151
+
152
+ action = setInterval(move, interval);
153
+ };
154
+
155
+ //クリックイベントをセットする
156
+ function setClickEvent() {
157
+ for(let i = 0; i < ankerNum; i++) {
158
+ const _self = anker[i];
159
+
160
+ _self.addEventListener('click', function(e) {
161
+ e.preventDefault();
162
+ setTargetMove(this);
163
+ });
164
+ }
165
+ };
166
+
167
+ setClickEvent();
168
+ }
90
169
  ```