是否有window.scrollTo的回调?

Geo*_*bol 17 javascript

我想focus()在寡妇滚动后调用输入.我正在使用该scrollTo()方法的平滑行为.问题是focus方法切割顺畅的行为.解决方案是focus在滚动结束后调用该函数.

但我找不到任何关于如何检测scrollTo方法结束的文档或线程.

let el = document.getElementById('input')
let elScrollOffset = el.getBoundingClientRect().top
let scrollOffset = window.pageYOffset || document.documentElement.scrollTop
let padding = 12
window.scrollTo({
  top: elScrollOffset + scrollOffset - padding,
  behavior: 'smooth'
})
// wait for the end of scrolling and then
el.focus()
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

Fab*_*rts 8

我基于George Abitbol的解决方案编写了一个通用函数,而没有覆盖window.onscroll:

/**
 * Native scrollTo with callback
 * @param offset - offset to scroll to
 * @param callback - callback function
 */
function scrollTo(offset, callback) {
    const onScroll = function () {
        if (window.pageYOffset === offset) {
            window.removeEventListener('scroll', onScroll)
            callback()
        }
    }
    window.addEventListener('scroll', onScroll)
    onScroll()
    window.scrollTo({
        top: offset,
        behavior: 'smooth'
    })
}
Run Code Online (Sandbox Code Playgroud)

  • @ caroso1222谢谢!我补充说,经过一些测试,因为如果滚动位置已经正确,则没有该调用就不会触发回调。 (3认同)
  • @btjakes澄清一下:“offset”需要与“window.pageYOffset”完美匹配。与其他浏览器不同,在 MS Edge 中,“window.pageYOffset”是一个浮点数。由于浏览器之间的精度不匹配,这种方法将失败,除非您小心舍入并可能制作完成缓冲区: `if (roundedPageYOffset + 2 >= roundedOffset && roundedOffset >= roundedPageYOffset - 2) { .. . }`,而不仅仅是 `if (window.pageYOffset === offset) { ... }` (2认同)