简体   繁体   English

纯JavaScript的缓和效果

[英]Easing effect in pure javascript

I am working on a function that will scroll the window to a given position. 我正在使用一个将窗口滚动到给定位置的函数。 My script works, but I would like to make the easing effect more smooth. 我的脚本有效,但是我想使缓动效果更加平滑。

How can I make a easing effect in javascript (i dont want to use plugins like jquery or others)? 如何在javascript中产生轻松的效果(我不想使用jquery或其他插件)?

Here's my easing function: 这是我的缓动功能:

function myScrollFunction(yPositionToScrollTo){

    setTimeout(function(){
        if(window.pageYOffset < yPositionToScrollTo - 640){window.scroll(0, window.pageYOffset+64)}
        else if(window.pageYOffset < yPositionToScrollTo - 320){window.scroll(0, window.pageYOffset+32)}
        else if(window.pageYOffset < yPositionToScrollTo - 160){window.scroll(0, window.pageYOffset+16)}
        else if(window.pageYOffset < yPositionToScrollTo - 80){window.scroll(0, window.pageYOffset+8)}
        else if(window.pageYOffset < yPositionToScrollTo - 40){window.scroll(0, window.pageYOffset+4)}
        else if(window.pageYOffset < yPositionToScrollTo - 10){window.scroll(0, window.pageYOffset+2)}
        else{window.scroll(0, window.pageYOffset+1)}
        if(window.pageYOffset < yPositionToScrollTo){
            myScrollFunction(yPositionToScrollTo);
        }
    },20)

}

Update: 更新:

function myScrollFunction(yPositionToScrollTo){

var differens = yPositionToScrollTo - window.pageYOffset;

    setTimeout(function(){
        window.scroll(0, yPositionToScrollTo + differens/2);
        if(window.pageYOffset < yPositionToScrollTo){
            myScrollFunction(yPositionToScrollTo);
        }
    },20)

}

Except for the yPositionToScrollTo - 10 case, your code is approximating this: 除了yPositionToScrollTo - 10情况外,您的代码yPositionToScrollTo - 10近似:

var scrollDistance = yPositionToScrollTo - window.pageYOffset;
var scrollSpeed = scrollDistance/10;
if (scrollSpeed > 64) {
    scrollSpeed = 64;
}
window.scroll(0,window.pageYOffset+scrollSpeed);

The first line is simply rearranging your repeated ifs: 第一行只是重新排列您重复的ifs:

if (window.pageYOffset < yPositionToScrollTo - 640) ...

// Take out the expression:

window.pageYOffset < yPositionToScrollTo - 640

// Replace hardcoded value with a variable:

window.pageYOffset < yPositionToScrollTo - scrollDistance

// Rearrange expression:

window.pageYOffset + scrollDistance < yPositionToScrollTo

// Rearrange some more:

scrollDistance < yPositionToScrollTo - window.pageYOffset

// Restate equation in the form of an assignment to calculate scrollDistance:

var scrollDistance = yPositionToScrollTo - window.pageYOffset

The second line is inferred from the fact that the hardcoded scroll number is always 1/10 the value of the hardcoded number in the if expressions: 第二行是从以下事实推断出来的:硬编码滚动数始终是if表达式中硬编码数的值的1/10:

64 is 640/10
32 is 320/10 ... etc

The if expression is simply referring to the fact that for all distances larger than 640 the scroll speed is 64. Put it another way the maximum speed is 64. if表达式仅表示所有距离大于640的滚动速度为64的事实。换句话说,最大速度为64。

Now you can smoothly scroll using the calculated, rather than hardcoded, scroll speed. 现在,您可以使用计算的而不是硬编码的滚动速度平滑滚动。

With this code it's much simpler to play around with the variables to get the correct easing speed. 使用此代码,可以更轻松地处理变量以获得正确的缓动速度。 For example, for most of my projects I personally prefer to set scrollSpeed to scrollDistance/2 which is faster than scrollDistance/10 and not limit it to any maximum speed. 例如,对于我的大多数项目,我个人更喜欢将scrollSpeed设置为scrollDistance/2 ,该速度比scrollDistance/10快,并且不将其限制为任何最大速度。 Change the divisor and max speed constants to get the easing you want. 更改除数和最大速度常数以获得所需的缓动。

Actually, you can make the code much more readable if you give the constants names: 实际上,如果您提供常量名称,则可以使代码更具可读性:

var INERTIA = 10;   // lower = faster, higher = slower
var MAX_SPEED = 64;

var scrollDistance = yPositionToScrollTo - window.pageYOffset;
var scrollSpeed = scrollDistance/INERTIA;
if (scrollSpeed > MAX_SPEED) {
    scrollSpeed = MAX_SPEED;
}
window.scroll(0,window.pageYOffset+scrollSpeed);

You might wanna check this smooth scrolling solution out: http://cferdinandi.github.io/smooth-scroll/ 您可能想检查一下此平滑滚动解决方案: http : //cferdinandi.github.io/smooth-scroll/

It works (almost) out of the box — see instructions on page — and is very very lightweight (especially if you strip the code down to the minimum you actually need and then minify and compress). 它几乎是开箱即用的(请参阅第1页的说明),并且非常轻巧(尤其是如果将代码缩减到实际需要的最小数量,然后最小化和压缩)。 It has a good bunch of easing curves in a well commented code. 在注释良好的代码中,它具有大量的缓和曲线。 It should be perfect for you :) 它对您来说应该是完美的:)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM