Javascript 根据曲线/方程式/公式修改滚动持续时间

Javascript 根据曲线/方程式/公式修改滚动持续时间,javascript,jquery,math,Javascript,Jquery,Math,我需要滚动到顶部,并希望根据滚动前视口在文档下方的距离修改滚动的持续时间。随着滚动长度的增加,我想增加更小的时间增量。所以我很难解决的是如何将曲线应用于一个数字,一个我假设的方程。我的数学生疏了 举个例子,我怎样才能做到: 0 to 1000 pixels -> 300 (+300) 1001 to 2000 -> 500 (+200) 2001 to 3000 -> 700 (+200) 3001 to 4000 -> 800 (+100) 4001 to 5000 -

我需要滚动到顶部,并希望根据滚动前视口在文档下方的距离修改滚动的持续时间。随着滚动长度的增加,我想增加更小的时间增量。所以我很难解决的是如何将曲线应用于一个数字,一个我假设的方程。我的数学生疏了

举个例子,我怎样才能做到:

0 to 1000 pixels -> 300 (+300)
1001 to 2000 -> 500 (+200)
2001 to 3000 -> 700 (+200)
3001 to 4000 -> 800 (+100)
4001 to 5000 -> 900 (+100)
然后继续增加每1000像素100的增量。或者,一条曲线到达某一点后,每1000条曲线的最小值为100

我知道我可以用
if/else if
语句来实现上述功能,但我希望用数学来实现这一功能,因为它简单明了,因此更容易处理值

抱歉,因为我肯定其他地方已经存在此信息,但我不确定如何使用搜索词组来查找我要查找的答案。只要一个指向正确数学类型的指针或一个教程就足够了,但当然,如果能给出更详细的答案,我们将不胜感激

对于这个特定的用例,我还想听听关于什么会感觉更自然的建议。我试过:

var duration = Math.ceil ( $('html').scrollTop() / 1000 ) * 300;
但是它感觉太慢,跑不了更长的距离

更新

关于
if/else if
选项,我提出了下面的伪代码,它使用
if/else if
,但是有一些灵活性,非常紧凑。我仍然想用一些数学来替换
if/else if
语句

num = scrollTop
duration = 0
while ( num > 0 ) {
    a = Math.ceil(num/1000)
    if ( a >= 4 ) {
        duration += 100
    } else if ( a >= 2 ) {
        duration += 200
    } else {
        duration += 300
    }
    num -= 1000
}
更新2

我已经实现了这一点,而不是更好的解决方案,以下是JS:

var num = $('html').scrollTop();
var duration = 0;
while ( num > 0 ) {
    var a = Math.ceil(num/1000);
    if ( a >= 4 ) {
        duration += 100;
    } else if ( a >= 2 ) {
        duration += 200;
    } else {
        duration += 300;
    }
    num -= 1000;
}
癫痫警告! 您可以使用对
requestAnimationFrame
的“递归”调用,其中的值可以更改以控制滚动速度

示例: 恒定速度和恒定加速度:

var速度=3;
var位置=2000;
var加速度=1.3;
滚动到(0,位置);
滚动到动画();
函数scrollToTopAnimated(){
requestAnimationFrame((增量)=>{
var deltaSec=delta/1000;
速度+=加速度*deltaSec;
位置-=速度*deltaSec;
滚动到(0,位置);
如果(位置>0)
滚动到动画();
})
}
正文{
高度:2000px;
宽度:100%;
背景图像:线性渐变(至底部,红色、黄色、绿色、蓝色、红色、黄色、绿色、蓝色);
}

你好,世界
谢谢,有意思的主意。但我希望用线性速度或jQuery/Velocity(easeInOut等)提供的各种选项来控制滚动,而不是像这样加速,尽管它确实在某一点上实现了相同的总体目标。添加了sinwave。我只是找不到一个简单的方法来得到这个的通用公式。谢谢。同样是为了提醒我“公式”,我知道还有一个词我遗漏了!