如何使用平滑效果的window.scrollTo()

Kol*_*ine 35 html javascript css vanilla-typescript

我可以使用以下内容滚动到200px

btn.addEventListener("click", function(){
    window.scrollTo(0,200);
})
Run Code Online (Sandbox Code Playgroud)

但我想要一个流畅的滚动效果.我该怎么做呢?

kin*_*ser 93

2018年更新

现在,您可以使用刚刚window.scrollTo({ top: 0, behavior: 'smooth' })以平滑效果滚动页面.

const btn = document.getElementById('elem');

btn.addEventListener('click', () => window.scrollTo({
  top: 400,
  behavior: 'smooth',
}));
Run Code Online (Sandbox Code Playgroud)
#x {
  height: 1000px;
  background: lightblue;
}
Run Code Online (Sandbox Code Playgroud)
<div id='x'>
  <button id='elem'>Click to scroll</button>
</div>
Run Code Online (Sandbox Code Playgroud)

较旧的解决方案

你可以这样做:

var btn = document.getElementById('x');

btn.addEventListener("click", function() {
  var i = 10;
  var int = setInterval(function() {
    window.scrollTo(0, i);
    i += 10;
    if (i >= 200) clearInterval(int);
  }, 20);
})
Run Code Online (Sandbox Code Playgroud)
body {
  background: #3a2613;
  height: 600px;
}
Run Code Online (Sandbox Code Playgroud)
<button id='x'>click</button>
Run Code Online (Sandbox Code Playgroud)

ES6递归方法:

const btn = document.getElementById('elem');

const smoothScroll = (h) => {
  let i = h || 0;
  if (i < 200) {
    setTimeout(() => {
      window.scrollTo(0, i);
      smoothScroll(i + 10);
    }, 10);
  }
}

btn.addEventListener('click', () => smoothScroll());
Run Code Online (Sandbox Code Playgroud)
body {
  background: #9a6432;
  height: 600px;
}
Run Code Online (Sandbox Code Playgroud)
<button id='elem'>click</button>
Run Code Online (Sandbox Code Playgroud)

  • @PetrNagy 是的`行为:'平滑'` 也不适用于 iOS。我认为我们仍然需要在 Mac 和 iOS 上使用旧的 WebKit 解决方案。 (5认同)
  • 1年之后,我认为`scrollTo`已经发展了,你的脚本已经弃用了,因为现在,我们可以将一个对象传递给`scrollTo`,如:`window.scrollTo({top:0,behavior:'smooth'}) ;`我们使用较少的行代码也是同样的效果,并且它受到旧的和最近的浏览器的支持:) (4认同)
  • OSX 版 Safari 在使用 `window.scrollTo` 时似乎忽略了 `behavior: 'smooth'` 参数。 (4认同)