1.函数定义
1.1这是一个实现平滑滚动的函数,可以让页面在滚动到指定位置时产生缓动效果。
该函数依赖于Math.easeInOutQuad函数和requestAnimFrame函数,其Math.easeInOutQuad函数用于计算当前滚动位置的值(根据时间、起始值、变化量和持续时间),requestAnimFrame函数用于实现动画效果。
1.2函数的参数包括:
- to : 目标滚动位置。
- duration : 滚动持续时间,默认为500毫秒。
- callback : 滚动结束后的回调函数。
2.函数的实现过程如下:
2.1 实现步骤
- 获取当前滚动位置(start)和需要滚动的距离(change)。
- 设置每次滚动的增量(increment),默认为20。
- 定义动画开始时间(currentTime),默认为0。
- 根据Math.easeInOutQuad函数计算新的滚动位置值,并将其应用于文档的scrollTop属性。
- 判断当前时间是否小于持续时间,如果是则使用requestAnimFrame函数继续执行动画,否则执行回调函数。
2.2 实现代码
Math.easeInOutQuad = function(t, b, c, d) {
t /= d / 2
if (t < 1) {
return c / 2 * t * t + b
}
t--
return -c / 2 * (t * (t - 2) - 1) + b
}
let requestAnimFrame = (function() {
return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || function(callback) { window.setTimeout(callback, 1000 / 60) }
})()
/**
* @param {number} amount
*/
function move(amount) {
document.documentElement.scrollTop = amount
document.body.parentNode.scrollTop = amount
document.body.scrollTop = amount
}
function position() {
return document.documentElement.scrollTop || document.body.parentNode.scrollTop || document.body.scrollTop
}
/**
* @param {number} to
* @param {number} duration
* @param {Function} callback
*/
export function scrollTo(to, duration, callback) {
const start = position()
const change = to - start
const increment = 20
let currentTime = 0
duration = (typeof (duration) === 'undefined') ? 500 : duration
let animateScroll = function() {
// 增加时间
currentTime += increment
// 用于二次入出缓和函数求值
let val = Math.easeInOutQuad(currentTime, start, change, duration)
move(val)
// 除非动画结束,否则继续
if (currentTime < duration) {
requestAnimFrame(animateScroll)
} else {
if (callback && typeof (callback) === 'function') {
// 动画结束,回调
callback()
}
}
}
animateScroll()
}
2.3 在项目中使用
- 将上述代码复制到你的项目中的一个文件中(比如scroll.js),并确保该文件被引入到你的Vue组件中。
import { scrollTo } from './scroll.js';
export default {
methods: {
smoothScroll() {
scrollTo(0, 1000, () => {
console.log('滚动结束!');
});
}
},
};
在上面的例子中,我们将scrollTo函数封装在Vue组件的methods选项中smoothScroll方法中。当你希望触发平滑滚动时,可以在模板或其他方法中调用这个方法。
在Vue组件的模板中,可以绑定按钮的点击事件来触发平滑滚动
<template>
<div>
<button @click="smoothScroll">平滑滚动到顶部</button>
</div>
</template>
在上面的例子中,当按钮被点击时,会调用smoothScroll
方法,从而触发平滑滚动。