流畅的滚动功能,包括页面切换

Smooth scrolling function including page change

我正在尝试编写一个平滑的滚动函数,如果 href 需要先加载一个新页面然后 运行 滚动,它可以处理。

我看到了一些将 /page-template.html#anchor 添加到 href 的选项,但是动态站点的主页 url 只是 /#anchor.

所以下面的代码没有将斜杠视为目标 href 的一部分。

const $anchor = $('a')

$anchor.on('click', function(event) {

    if (this.hash !== "") {
      event.preventDefault()
      let hash = this.hash

      $('html, body').animate({
        scrollTop: $(hash).offset().top
      }, 800, function(){
        window.location.hash = hash
      })
    }
})

有点想出一种方法来实现这一点,但它不是非常漂亮。如有任何改进建议,我们将不胜感激。

// If loading a page with a hash in the URL, scroll to it
if (window.location.hash) {
    setTimeout(function() {
        $('html, body').scrollTop(0)
        $('html, body').animate({
            scrollTop: $(window.location.hash).offset().top
            }, 1000)
    }, 0)
}

// Get the current url path
const currUrl = window.location.pathname

$anchor.on('click', function(e) {

    // Get the href and a hash into variables
    const href = $(this).attr('href')
    const hash = this.hash

    // If a hash is present
    if (hash) {

        // Check if there is a URl path before the hash
        if (href.charAt(0) !== '#') {

            // Check if this URL path matches the current page's href
            if (currUrl == href.split('#')[0]) {
                e.preventDefault()

                // As they match, just run the scroll within the same page
                $('html, body').animate({
                    scrollTop: $(hash).offset().top
                }, 800, function() {
                    window.location.hash = hash
                })
            }

        // There is no URL accompanying the hash, so it's got to be within the same page
        } else {
            e.preventDefault()
            // Run smooth scrolling within the page
            $('html, body').animate({
                scrollTop: $(hash).offset().top
            }, 800, function() {
                window.location.hash = hash
            })
        }
    }
})