如何在网页上进行滚动操作

119 阅读2分钟

了解如何与滚动互动,对滚动事件作出反应并对其进行控制

滚动页面以查看折叠下方的内容可能是页面上最常见的事件,比点击或键盘事件还要多。

你可以监听window 对象上的scroll 事件,以获得用户每次滚动页面时的信息。

window.addEventListener('scroll', event => {
  // scroll event detected
})

在事件处理程序中,你可以通过检查window 属性window.scrollY 来检查当前的垂直滚动位置,并使用window.scrollX 来检查水平滚动。

window.addEventListener('scroll', event => {
  console.log(window.scrollY)
  console.log(window.scrollX)
})

请记住,scroll 事件不是一次性的。

它在滚动过程中会多次触发,而不仅仅是在滚动结束或开始时,所以如果你需要做任何形式的操作,就会出现问题。

你不应该直接在handler事件处理程序中做任何计算或操作,我们应该使用节流来代替。

节流

scroll 事件不是在每个事件中一次性触发的,而是在所有动作的持续时间内连续调用其事件处理函数。

这是因为它提供了坐标,所以你可以跟踪正在发生的事情。

如果你在事件处理程序中执行复杂的操作,你会影响性能,并导致你的网站用户体验迟缓。

Lodash这样提供节流功能的库在100多行代码中实现它,以处理每一种可能的使用情况。一个简单易懂的实现是这样的,它使用setTimeout来缓存每100ms的滚动事件。

let cached = null
window.addEventListener('scroll', event => {
  if (!cached) {
    setTimeout(() => {
      //you can access the original event at `cached`
      cached = null
    }, 100)
  }
  cached = event
})

缓冲也适用于我们在鼠标事件课上看到的mousemove 事件。同样的事情--当你移动鼠标时,该事件被多次触发。

这里是Codepen上的一个例子。

请看Flavio Copes (@flaviocopes)在CodePen上的笔滚动事件

当你在浏览器中构建用户界面时,你可能会有一个可以滚动的元素,而了解它当前的水平和垂直滚动是一种常见的需求。

你怎么能做到这一点呢?

一旦你有了这个元素,你可以检查它的scrollLeftscrollTop 属性。

0, 0 的位置总是在左上角,所以任何滚动都是相对于它的。

例子。

const container = document.querySelector('. container')
container.scrollTop
container.scrollLeft

这些属性是读/写的,所以你也可以设置滚动位置。

const container = document.querySelector('. container')
container.scrollTop = 1000
container.scrollLeft = 1000

scrollLeft and scrollTop