为什么这行代码的判断条件是与1作比较?

新手上路,请多包涵

if (Math.abs(distance) < 1)
对这行代码的疑问主要有两个:
1、为什么这行代码的判断条件是与1作比较?可以与2、3或者其他值作比较吗?
2、为什么不直接将Math.abs(distance)等于某个具体值作为判断条件呢?

完整代码在:

/**
 @description 页面垂直平滑滚动到指定滚动高度
 @author zhangxinxu(.com)
*/
var scrollSmoothTo = function (position) {
    if (!window.requestAnimationFrame) {
        window.requestAnimationFrame = function(callback, element) {
            return setTimeout(callback, 17);
        };
    }
    // 当前滚动高度
    var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
    // 滚动step方法
    var step = function () {
        // 距离目标滚动距离
        var distance = position - scrollTop;
        // 目标滚动位置
        scrollTop = scrollTop + distance / 5;
        if (Math.abs(distance) < 1) {
            window.scrollTo(0, position);
        } else {
            window.scrollTo(0, scrollTop);
            requestAnimationFrame(step);
        }
    };
    step();
};
阅读 1.7k
3 个回答
// 距离目标滚动距离
var distance = position - scrollTop;
// 目标滚动位置
scrollTop = scrollTop + distance / 5;

循环中有这两行代码,distance是剩下的距离,除5表示滚动条每次移动剩下距离的五分之一,所以这个滚动效果就是刚开始很快,然后逐渐变慢的一个过程。

1、1只是一个阈值,他可以是任何值.但需要注意是否合适,结合上面的动画效果,他需要是一个小值,2、3也可以,10就有点跳跃的感觉了,100就会很明显

2、为什么不要等于,因为等于会把判断条件写的太死了,这大大增加了bug出现的几率,而且你不知道distance会是多少,写小于可以更好的判断

应该是某些浏览器会返回小数。所以只要在 (-1,1) 的区间内就算。

但是在咱们的理解中像素肯定不会有小数的,但是浏览器的确返回了小数。

  1. 为了解决本身滚动幅度过小的问题,可以是2,3,看效果
  2. 因为不知道distance是多少啊,所以怎么用等于

要带着自己的认识去看代码,不然会累死的。
上面写了是用于平滑滚动的方法,那么什么是平滑滚动呢?就是利用动化效果然页面“慢慢”的拖动滚动条呗。鼠标操作不适于这个,所以肯定是类似锚点跳转之类的场景,例如,目前滚动条定位是0,用户点了某书签,然后通过计算得知需要滚动200px,那么就慢慢的滚过去,而不是唰的一下,这样有闪烁感。
好了,那么就出现了问题
1-要滚多少
2-滚动速度是多少
要滚多少就不说了,滚动速度在这段代码中如何解决的呢?每次取所需滚动长度的1/5,连续滚。那么第一次滚动1/5,第二次滚动1/25...所以永远不会滚动到预期位置,而是无限接近预期位置。所以需要设置一个值,代码中设的是1,你改成5改成10都可以,意思是如果这次滚动距离不足1/5/10,那就直接滚到位吧,别再1/5,1/5的慢慢蹭了。
至于为什么取1,回答取10是什么结果就好了,在滚动需求为50px时,单次滚动1/5,则10,8,7,5,4,3,2之后残留滚动为10,前面已经越滚越慢了,到结尾一下滚10相当于来个一个加速,视觉效果不好。就像小孩子升国旗,在最后会停留,直到最后一个“进”字一使劲干到顶,结果一样,但是不好看。

推荐问题