| 192 | } |
| 193 | } |
| 194 | function _end(pageY){ |
| 195 | if(!start) return; |
| 196 | |
| 197 | /** |
| 198 | * 思路: |
| 199 | * 0. touchstart 记录按下的点和时间 |
| 200 | * 1. touchmove 移动时记录前 40个经过的点和时间 |
| 201 | * 2. touchend 松开手时, 记录该点和时间. 如果松开手时的时间, 距离上一次 move时的时间超过 100ms, 那么认为停止了, 不执行惯性滑动 |
| 202 | * 如果间隔时间在 100ms 内, 查找 100ms 内最近的那个点, 和松开手时的那个点, 计算距离和时间差, 算出速度 |
| 203 | * 速度乘以惯性滑动的时间, 例如 300ms, 计算出应该滑动的距离 |
| 204 | */ |
| 205 | const endTime = new Date().getTime(); |
| 206 | const relativeY = $this[0].getBoundingClientRect().top + defaults.bodyHeight / 2; |
| 207 | end = pageY; |
| 208 | |
| 209 | // 如果上次时间距离松开手的时间超过 100ms, 则停止了, 没有惯性滑动 |
| 210 | if (endTime - startTime > 100) { |
| 211 | //如果end和start相差小于10,则视为 |
| 212 | if (Math.abs(end - start) > 10) { |
| 213 | stop(end - start); |
| 214 | } else { |
| 215 | stop(relativeY - end); |
| 216 | } |
| 217 | } else { |
| 218 | if (Math.abs(end - start) > 10) { |
| 219 | const endPos = points.length - 1; |
| 220 | let startPos = endPos; |
| 221 | for (let i = endPos; i > 0 && startTime - points[i].time < 100; i--) { |
| 222 | startPos = i; |
| 223 | } |
| 224 | |
| 225 | if (startPos !== endPos) { |
| 226 | const ep = points[endPos]; |
| 227 | const sp = points[startPos]; |
| 228 | const t = ep.time - sp.time; |
| 229 | const s = ep.y - sp.y; |
| 230 | const v = s / t; // 出手时的速度 |
| 231 | const diff = v * 150 + (end - start); // 滑行 150ms,这里直接影响“灵敏度” |
| 232 | stop(diff); |
| 233 | } |
| 234 | else { |
| 235 | stop(0); |
| 236 | } |
| 237 | } else { |
| 238 | stop(relativeY - end); |
| 239 | } |
| 240 | } |
| 241 | |
| 242 | start = null; |
| 243 | } |
| 244 | |
| 245 | $this |
| 246 | .on('touchstart', function (evt) { |