此函数应从页面顶部向下滚动到下方215像素,并增加延迟,以便第一个window.scrollTo事件在10ms发生,下一个在20ms等,依此类推。
最后一行应延迟2150毫秒,因此总共需要2秒钟左右。
而是立即立即向下滚动215个像素。

function scrollDown() {
  var yFinal=216, delay=0;
  for (y=0; y<yFinal; y++) {
    delay = delay+10
    setTimeout(function() {
      window.scrollTo(100,y);
    },delay);
  }
}


悲伤的脸。为什么?

[编辑:感谢您的帮助!我用它来写这个最终的解决方案,它有点复杂,我在这里提供给任何人都可以窃取。首先会快速滚动,然后缓慢滚动。正是我想要的。通过使用setInterval的setTimeout实例,它可以为您提供对速度曲线的更多控制,因此您可以轻松地使其呈指数级下降]

function showCategory(categoryId)
{
  var yInitial=document.body.scrollTop,
      yFinal=216,
      delay=0;

  if (yInitial<yFinal)
  {
    yInitial=(yFinal-yInitial)/1.3+yInitial;
    window.scrollTo(100, yInitial);

    for (var yCurrent = yInitial; yCurrent < yFinal; yCurrent+=2)
    {
      delay += 30;
      (function(position)
      {
        setTimeout(function()
        {
          window.scrollTo(100, position);
        }, delay);
      })(yCurrent);
    }
  }
}

最佳答案

超时并非一次发生,而是按照您期望的时间发生。但是,它们都尝试滚动到由同一y变量表示的位置,因此,当循环结束时,它们都使用y的值。

通常的解决方法是引入闭包:

function scrollDown() {
    var yFinal = 216,
        delay = 0;

    for (var y = 0; y < yFinal; y++) {
        delay += 10;
        (function(position) {
            setTimeout(function() {
                window.scrollTo(100, position);
            }, delay);
        })(y);
    }
}​


(还请注意,您的y变量是全局变量:您应使用var声明它以使其成为本地变量。)

09-26 22:30
查看更多