Merge pull request #17057 from cnlon/optimize/scrolling-of-backtop

BackTop: use requestAnimationFrame and cubic bezier for scrolling
pull/17283/head
wurong 2019-09-02 11:55:34 +08:00 committed by GitHub
commit b6b9aaecce
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 18 additions and 9 deletions

View File

@ -18,6 +18,11 @@
<script> <script>
import throttle from 'throttle-debounce/throttle'; import throttle from 'throttle-debounce/throttle';
const cubic = value => Math.pow(value, 3);
const easeInOutCubic = value => value < 0.5
? cubic(value * 2) / 2
: 1 - cubic((1 - value) * 2) / 2;
export default { export default {
name: 'ElBacktop', name: 'ElBacktop',
@ -81,16 +86,20 @@ export default {
this.$emit('click', e); this.$emit('click', e);
}, },
scrollToTop() { scrollToTop() {
let el = this.el; const el = this.el;
let step = 0; const beginTime = Date.now();
let interval = setInterval(() => { const beginValue = el.scrollTop;
if (el.scrollTop <= 0) { const rAF = window.requestAnimationFrame || (func => setTimeout(func, 16));
clearInterval(interval); const frameFunc = () => {
return; const progress = (Date.now() - beginTime) / 500;
if (progress < 1) {
el.scrollTop = beginValue * (1 - easeInOutCubic(progress));
rAF(frameFunc);
} else {
el.scrollTop = 0;
} }
step += 10; };
el.scrollTop -= step; rAF(frameFunc);
}, 20);
} }
}, },