单击锚点链接时平滑滚动

JavaScript

A逆天猿

2020-03-12

我的页面上有几个超链接。用户访问我的帮助部分时将阅读的常见问题解答。

使用锚点链接,我可以使页面滚动到锚点并在那里引导用户。

有没有办法使滚动平滑?

但是请注意,他正在使用自定义JavaScript库。也许jQuery提供了类似的功能?

第1339篇《单击锚点链接时平滑滚动》来自Winter(https://github.com/aiyld/aiyld.github.io)的站点

7个回答
卡卡西乐 2020.03.12

thanks for sharing, Joseph Silber. Here your 2018 solution as ES6 with a minor change to keep the standard behavior (scroll to top):

document.querySelectorAll("a[href^=\"#\"]").forEach((anchor) => {
  anchor.addEventListener("click", function (ev) {
    ev.preventDefault();

    const targetElement = document.querySelector(this.getAttribute("href"));
    targetElement.scrollIntoView({
      block: "start",
      alignToTop: true,
      behavior: "smooth"
    });
  });
});
神奇西里 2020.03.12

原生支持哈希ID滚动的平滑滚动。

html {
  scroll-behavior: smooth;
}

您可以看一下:https : //www.w3schools.com/howto/howto_css_smooth_scroll.asp#section2

SamTony 2020.03.12
$("a").on("click", function(event){
    //check the value of this.hash
    if(this.hash !== ""){
        event.preventDefault();

        $("html, body").animate({scrollTop:$(this.hash).offset().top}, 500);

        //add hash to the current scroll position
        window.location.hash = this.hash;

    }



});
JinJinPro 2020.03.12

使用滚动行为可以做到这一点。添加以下属性。

    scroll-behavior: smooth;

就是这样。不需要JS。

a {
  display: inline-block;
  width: 50px;
  text-decoration: none;
}
nav, scroll-container {
  display: block;
  margin: 0 auto;
  text-align: center;
}
nav {
  width: 339px;
  padding: 5px;
  border: 1px solid black;
}
scroll-container {
  display: block;
  width: 350px;
  height: 200px;
  overflow-y: scroll;
  scroll-behavior: smooth;
}
scroll-page {
  display: flex;
  align-items: center;
  justify-content: center;
  height: 100%;
  font-size: 5em;
}
<nav>
  <a href="#page-1">1</a>
  <a href="#page-2">2</a>
  <a href="#page-3">3</a>
</nav>
<scroll-container>
  <scroll-page id="page-1">1</scroll-page>
  <scroll-page id="page-2">2</scroll-page>
  <scroll-page id="page-3">3</scroll-page>
</scroll-container>

PS:请检查浏览器兼容性。

西里神乐 2020.03.12

如今,现代浏览器要快一些。setInterval可能有效。如今,该功能在Chrome和Firefox上运行良好。(Safari的浏览速度有些慢,IE对此并不打扰)

function smoothScroll(event) {
    if (event.target.hash !== '') { //Check if tag is an anchor
        event.preventDefault()
        const hash = event.target.hash.replace("#", "")
        const link = document.getElementsByName(hash) 
        //Find the where you want to scroll
        const position = link[0].getBoundingClientRect().y 
        let top = 0

        let smooth = setInterval(() => {
            let leftover = position - top
            if (top === position) {
                clearInterval(smooth)
            }

            else if(position > top && leftover < 10) {
                top += leftover
                window.scrollTo(0, top)
            }

            else if(position > (top - 10)) {
                top += 10
                window.scrollTo(0, top)
            }

        }, 6)//6 milliseconds is the faster chrome runs setInterval
    }
}
梅蛋蛋 2020.03.12

只有CSS

html {
    scroll-behavior: smooth !important;
}

您只需要添加此内容。现在,内部链接的滚动行为将像流一样平滑。

:所有最新的浏览器(OperaChromeFirefox等)支持此功能。

要了解详细信息,请阅读本文

Tom蛋蛋 2020.03.12

CSS3中的新热点。这比此页面上列出的每种方法都容易得多,并且不需要Javascript。只要在您的CSS中输入以下代码,所有指向您自己页面内位置的链接就会突然出现滚动动画。

html{scroll-behavior:smooth}

之后,指向div的所有链接都将平滑地转到这些部分。

<a href="#section">Section1</a>

顺便说一句,我花了几个小时试图使它工作。在一些晦涩的注释部分找到了解决方案。这是越野车,无法在某些标签中使用。在体内没有作用。当我将它放在CSS文件的html {}中时,它终于可以工作了。

问题类别

JavaScript Ckeditor Python Webpack TypeScript Vue.js React.js ExpressJS KoaJS CSS Node.js HTML Django 单元测试 PHP Asp.net jQuery Bootstrap IOS Android