mirror of https://github.com/ElemeFE/element
Merge pull request #17057 from cnlon/optimize/scrolling-of-backtop
BackTop: use requestAnimationFrame and cubic bezier for scrollingpull/17283/head
commit
b6b9aaecce
|
@ -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);
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue