首页 文章

单击锚链接时平滑滚动

提问于
浏览
390

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

使用Anchor链接,我可以使页面滚动到锚点并引导用户 .

有没有办法让滚动顺畅?

但请注意他正在使用自定义JavaScript库 . 也许jQuery提供像这样的东西?

25 回答

  • 2

    这里已经有很多好的答案 - 但是他们都错过了 empty anchors have to be excluded 的事实 . 否则,只要单击空锚,这些脚本就会生成JavaScript错误 .

    在我看来,正确答案是这样的:

    $('a[href*=\\#]:not([href$=\\#])').click(function() {
        event.preventDefault();
    
        $('html, body').animate({
            scrollTop: $($.attr(this, 'href')).offset().top
        }, 500);
    });
    
  • 2

    CSS3的新热点 . 这比本页面上列出的每种方法都容易得多,不需要Javascript . 只需在css中输入以下代码,突然链接指向您自己页面内的位置就会有一个平滑的滚动动画 .

    html{scroll-behavior:smooth}
    

    之后,任何指向div的链接都会顺利地滑向这些部分 .

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

    顺便说一句,我花了好几个小时试图让它发挥作用 . 在一些不起眼的评论部分找到了解决方案 . 这是错误的,并不会在某些标签中工作 . 没有在体内工作 . 当我把它放在CSS文件中的html {}时,它终于奏效了 .

  • 1

    永远不要忘记offset()函数赋予元素文档的位置 . 因此,当您需要相对于其父元素滚动元素时,您应该使用此元素;

    $('.a-parent-div').find('a').click(function(event){
            event.preventDefault();
            $('.scroll-div').animate({
         scrollTop: $( $.attr(this, 'href') ).position().top + $('.scroll-div').scrollTop()
         }, 500);       
      });
    

    关键点是获取scroll-div的scrollTop并将其添加到scrollTop . 如果你不做那个position()函数总是给你不同的位置值 .

  • 21

    您可以将 window.scroll()behavior: smoothtop 设置为锚标记的偏移顶部,以确保锚标记位于视口的顶部 .

    document.querySelectorAll('a[href^="#"]').forEach(a => {
        a.addEventListener('click', function (e) {
            e.preventDefault();
            var href = this.getAttribute("href");
            var elem = document.querySelector(href)||document.querySelector("a[name="+href.substring(1, href.length)+"]");
            //gets Element with an id of the link's href 
            //or an anchor tag with a name attribute of the href of the link without the #
            window.scroll({
                top: elem.offsetTop, 
                left: 0, 
                behavior: 'smooth' 
            });
            //if you want to add the hash to window.location.hash
            //you will need to use setTimeout to prevent losing the smooth scrolling behavior
           //the following code will work for that purpose
           /*setTimeout(function(){
                window.location.hash = this.hash;
            }, 2000); */
        });
    });
    

    演示:

    a, a:visited{
      color: blue;
    }
    
    section{
      margin: 500px 0px; 
      text-align: center;
    }
    
    <a href="#section1">Section 1</a>
    
    <a href="#section2">Section 2</a>
    <a href="#section3">Section 3</a>
    <a href="#section4">Section 4</a> <section id="section1"> <b style="font-size: 2em;">Section 1</b> <p>Lorem ipsum dolor sit amet, et vis laudem utroque, iusto forensibus neglegentur eu duo. Eu pro fuisset salutandi philosophia, discere persecuti qui te. Eos ad quodsi dissentias, ei odio viris signiferumque mei. Putent iuvaret perpetua nec eu. Has no ornatus vivendum. Adhuc nonumes ex vim, in suas rebum graecis mei, usu ad causae recusabo. Idque vituperata vel ea. Veri verterem pro ex. Ad error omnes est, id sit lorem legendos. Eos vidit ullum ne, tale tantas omittam est ut. Nobis maiorum efficiendi eu mei. Eos et debet placerat signiferumque. Per eu propriae electram. Impetus percipit menandri te ius, mea ne stet posse fabellas. Aliquid corrumpit vel no, mei in diam praesent contentiones. Qui veniam suscipit probatus ex. No autem homero perfecto quo, eos choro facilis ut. Te quo cibo interesset. Vel verear praesent in, menandri deserunt ad his. Labore admodum consetetur has et. Possit facilisi eu sed, lorem iriure eum id, pri ei consul necessitatibus. Est te iusto epicuri. Vis no graece putent mentitum, rebum facete offendit nec in. In duis vivendo sed, vel id enim voluptatibus. Velit sanctus ne mel, quem sumo suavitate mel cu, mea ea nullam feugiat. Tincidunt suscipiantur no pro. Vel ut novum mucius molestie, ut tale ipsum intellegebat mei, mazim accumsan voluptaria ea nam. Posidonium theophrastus ut sea, stet viris hendrerit pro ex, sonet mentitum ne quo. Vim duis feugiat ex, nec eu probo doming persecuti. Velit zril nam in, est commodo splendide id. Et aperiri fuisset iracundia usu. Eu nec iusto audire repudiare.<p/> <section> <section id="section2"> <b style="font-size: 2em;">Section 2</b> <p>Lorem ipsum dolor sit amet, et vis laudem utroque, iusto forensibus neglegentur eu duo. Eu pro fuisset salutandi philosophia, discere persecuti qui te. Eos ad quodsi dissentias, ei odio viris signiferumque mei. Putent iuvaret perpetua nec eu. Has no ornatus vivendum. Adhuc nonumes ex vim, in suas rebum graecis mei, usu ad causae recusabo. Idque vituperata vel ea. Veri verterem pro ex. Ad error omnes est, id sit lorem legendos. Eos vidit ullum ne, tale tantas omittam est ut. Nobis maiorum efficiendi eu mei. Eos et debet placerat signiferumque. Per eu propriae electram. Impetus percipit menandri te ius, mea ne stet posse fabellas. Aliquid corrumpit vel no, mei in diam praesent contentiones. Qui veniam suscipit probatus ex. No autem homero perfecto quo, eos choro facilis ut. Te quo cibo interesset. Vel verear praesent in, menandri deserunt ad his. Labore admodum consetetur has et. Possit facilisi eu sed, lorem iriure eum id, pri ei consul necessitatibus. Est te iusto epicuri. Vis no graece putent mentitum, rebum facete offendit nec in. In duis vivendo sed, vel id enim voluptatibus. Velit sanctus ne mel, quem sumo suavitate mel cu, mea ea nullam feugiat. Tincidunt suscipiantur no pro. Vel ut novum mucius molestie, ut tale ipsum intellegebat mei, mazim accumsan voluptaria ea nam. Posidonium theophrastus ut sea, stet viris hendrerit pro ex, sonet mentitum ne quo. Vim duis feugiat ex, nec eu probo doming persecuti. Velit zril nam in, est commodo splendide id. Et aperiri fuisset iracundia usu. Eu nec iusto audire repudiare.</p> <section> <section id="section3"> <b style="font-size: 2em;">Section 3</b> <p> Lorem ipsum dolor sit amet, et vis laudem utroque, iusto forensibus neglegentur eu duo. Eu pro fuisset salutandi philosophia, discere persecuti qui te. Eos ad quodsi dissentias, ei odio viris signiferumque mei. Putent iuvaret perpetua nec eu. Has no ornatus vivendum. Adhuc nonumes ex vim, in suas rebum graecis mei, usu ad causae recusabo. Idque vituperata vel ea. Veri verterem pro ex. Ad error omnes est, id sit lorem legendos. Eos vidit ullum ne, tale tantas omittam est ut. Nobis maiorum efficiendi eu mei. Eos et debet placerat signiferumque. Per eu propriae electram. Impetus percipit menandri te ius, mea ne stet posse fabellas. Aliquid corrumpit vel no, mei in diam praesent contentiones. Qui veniam suscipit probatus ex. No autem homero perfecto quo, eos choro facilis ut. Te quo cibo interesset. Vel verear praesent in, menandri deserunt ad his. Labore admodum consetetur has et. Possit facilisi eu sed, lorem iriure eum id, pri ei consul necessitatibus. Est te iusto epicuri. Vis no graece putent mentitum, rebum facete offendit nec in. In duis vivendo sed, vel id enim voluptatibus. Velit sanctus ne mel, quem sumo suavitate mel cu, mea ea nullam feugiat. Tincidunt suscipiantur no pro. Vel ut novum mucius molestie, ut tale ipsum intellegebat mei, mazim accumsan voluptaria ea nam. Posidonium theophrastus ut sea, stet viris hendrerit pro ex, sonet mentitum ne quo. Vim duis feugiat ex, nec eu probo doming persecuti. Velit zril nam in, est commodo splendide id. Et aperiri fuisset iracundia usu. Eu nec iusto audire repudiare.</p> <section> <a style="margin: 500px 0px; color: initial;" name="section4"> <b style="font-size: 2em;">Section 4 <i>(this is an anchor tag, not a section)</i></b> </a> <p> Lorem ipsum dolor sit amet, et vis laudem utroque, iusto forensibus neglegentur eu duo. Eu pro fuisset salutandi philosophia, discere persecuti qui te. Eos ad quodsi dissentias, ei odio viris signiferumque mei. Putent iuvaret perpetua nec eu. Has no ornatus vivendum. Adhuc nonumes ex vim, in suas rebum graecis mei, usu ad causae recusabo. Idque vituperata vel ea. Veri verterem pro ex. Ad error omnes est, id sit lorem legendos. Eos vidit ullum ne, tale tantas omittam est ut. Nobis maiorum efficiendi eu mei. Eos et debet placerat signiferumque. Per eu propriae electram. Impetus percipit menandri te ius, mea ne stet posse fabellas. Aliquid corrumpit vel no, mei in diam praesent contentiones. Qui veniam suscipit probatus ex. No autem homero perfecto quo, eos choro facilis ut. Te quo cibo interesset. Vel verear praesent in, menandri deserunt ad his. Labore admodum consetetur has et. Possit facilisi eu sed, lorem iriure eum id, pri ei consul necessitatibus. Est te iusto epicuri. Vis no graece putent mentitum, rebum facete offendit nec in. In duis vivendo sed, vel id enim voluptatibus. Velit sanctus ne mel, quem sumo suavitate mel cu, mea ea nullam feugiat. Tincidunt suscipiantur no pro. Vel ut novum mucius molestie, ut tale ipsum intellegebat mei, mazim accumsan voluptaria ea nam. Posidonium theophrastus ut sea, stet viris hendrerit pro ex, sonet mentitum ne quo. Vim duis feugiat ex, nec eu probo doming persecuti. Velit zril nam in, est commodo splendide id. Et aperiri fuisset iracundia usu. Eu nec iusto audire repudiare.</p> <script> document.querySelectorAll('a[href^="#"]').forEach(a => { a.addEventListener('click', function (e) { e.preventDefault(); var href = this.getAttribute("href"); var elem = document.querySelector(href)||document.querySelector("a[name="+href.substring(1, href.length)+"]"); window.scroll({ top: elem.offsetTop, left: 0, behavior: 'smooth' }); }); }); </script>

    您可以将CSS属性 scroll-behavior 设置为 smooth (大多数现代浏览器都支持),这样就无需使用Javascript .

    html, body{
      scroll-behavior: smooth;
    }
    a, a:visited{
      color: blue;
    }
    
    section{
      margin: 500px 0px; 
      text-align: center;
    }
    
    <a href="#section1">Section 1</a>
    
    <a href="#section2">Section 2</a>
    <a href="#section3">Section 3</a>
    <a href="#section4">Section 4</a> <section id="section1"> <b style="font-size: 2em;">Section 1</b> <p>Lorem ipsum dolor sit amet, et vis laudem utroque, iusto forensibus neglegentur eu duo. Eu pro fuisset salutandi philosophia, discere persecuti qui te. Eos ad quodsi dissentias, ei odio viris signiferumque mei. Putent iuvaret perpetua nec eu. Has no ornatus vivendum. Adhuc nonumes ex vim, in suas rebum graecis mei, usu ad causae recusabo. Idque vituperata vel ea. Veri verterem pro ex. Ad error omnes est, id sit lorem legendos. Eos vidit ullum ne, tale tantas omittam est ut. Nobis maiorum efficiendi eu mei. Eos et debet placerat signiferumque. Per eu propriae electram. Impetus percipit menandri te ius, mea ne stet posse fabellas. Aliquid corrumpit vel no, mei in diam praesent contentiones. Qui veniam suscipit probatus ex. No autem homero perfecto quo, eos choro facilis ut. Te quo cibo interesset. Vel verear praesent in, menandri deserunt ad his. Labore admodum consetetur has et. Possit facilisi eu sed, lorem iriure eum id, pri ei consul necessitatibus. Est te iusto epicuri. Vis no graece putent mentitum, rebum facete offendit nec in. In duis vivendo sed, vel id enim voluptatibus. Velit sanctus ne mel, quem sumo suavitate mel cu, mea ea nullam feugiat. Tincidunt suscipiantur no pro. Vel ut novum mucius molestie, ut tale ipsum intellegebat mei, mazim accumsan voluptaria ea nam. Posidonium theophrastus ut sea, stet viris hendrerit pro ex, sonet mentitum ne quo. Vim duis feugiat ex, nec eu probo doming persecuti. Velit zril nam in, est commodo splendide id. Et aperiri fuisset iracundia usu. Eu nec iusto audire repudiare.<p/> <section> <section id="section2"> <b style="font-size: 2em;">Section 2</b> <p>Lorem ipsum dolor sit amet, et vis laudem utroque, iusto forensibus neglegentur eu duo. Eu pro fuisset salutandi philosophia, discere persecuti qui te. Eos ad quodsi dissentias, ei odio viris signiferumque mei. Putent iuvaret perpetua nec eu. Has no ornatus vivendum. Adhuc nonumes ex vim, in suas rebum graecis mei, usu ad causae recusabo. Idque vituperata vel ea. Veri verterem pro ex. Ad error omnes est, id sit lorem legendos. Eos vidit ullum ne, tale tantas omittam est ut. Nobis maiorum efficiendi eu mei. Eos et debet placerat signiferumque. Per eu propriae electram. Impetus percipit menandri te ius, mea ne stet posse fabellas. Aliquid corrumpit vel no, mei in diam praesent contentiones. Qui veniam suscipit probatus ex. No autem homero perfecto quo, eos choro facilis ut. Te quo cibo interesset. Vel verear praesent in, menandri deserunt ad his. Labore admodum consetetur has et. Possit facilisi eu sed, lorem iriure eum id, pri ei consul necessitatibus. Est te iusto epicuri. Vis no graece putent mentitum, rebum facete offendit nec in. In duis vivendo sed, vel id enim voluptatibus. Velit sanctus ne mel, quem sumo suavitate mel cu, mea ea nullam feugiat. Tincidunt suscipiantur no pro. Vel ut novum mucius molestie, ut tale ipsum intellegebat mei, mazim accumsan voluptaria ea nam. Posidonium theophrastus ut sea, stet viris hendrerit pro ex, sonet mentitum ne quo. Vim duis feugiat ex, nec eu probo doming persecuti. Velit zril nam in, est commodo splendide id. Et aperiri fuisset iracundia usu. Eu nec iusto audire repudiare.</p> <section> <section id="section3"> <b style="font-size: 2em;">Section 3</b> <p> Lorem ipsum dolor sit amet, et vis laudem utroque, iusto forensibus neglegentur eu duo. Eu pro fuisset salutandi philosophia, discere persecuti qui te. Eos ad quodsi dissentias, ei odio viris signiferumque mei. Putent iuvaret perpetua nec eu. Has no ornatus vivendum. Adhuc nonumes ex vim, in suas rebum graecis mei, usu ad causae recusabo. Idque vituperata vel ea. Veri verterem pro ex. Ad error omnes est, id sit lorem legendos. Eos vidit ullum ne, tale tantas omittam est ut. Nobis maiorum efficiendi eu mei. Eos et debet placerat signiferumque. Per eu propriae electram. Impetus percipit menandri te ius, mea ne stet posse fabellas. Aliquid corrumpit vel no, mei in diam praesent contentiones. Qui veniam suscipit probatus ex. No autem homero perfecto quo, eos choro facilis ut. Te quo cibo interesset. Vel verear praesent in, menandri deserunt ad his. Labore admodum consetetur has et. Possit facilisi eu sed, lorem iriure eum id, pri ei consul necessitatibus. Est te iusto epicuri. Vis no graece putent mentitum, rebum facete offendit nec in. In duis vivendo sed, vel id enim voluptatibus. Velit sanctus ne mel, quem sumo suavitate mel cu, mea ea nullam feugiat. Tincidunt suscipiantur no pro. Vel ut novum mucius molestie, ut tale ipsum intellegebat mei, mazim accumsan voluptaria ea nam. Posidonium theophrastus ut sea, stet viris hendrerit pro ex, sonet mentitum ne quo. Vim duis feugiat ex, nec eu probo doming persecuti. Velit zril nam in, est commodo splendide id. Et aperiri fuisset iracundia usu. Eu nec iusto audire repudiare.</p> <section> <a style="margin: 500px 0px; color: initial;" name="section4"> <b style="font-size: 2em;">Section 4 <i>(this is an anchor tag, not a section)</i></b> </a> <p> Lorem ipsum dolor sit amet, et vis laudem utroque, iusto forensibus neglegentur eu duo. Eu pro fuisset salutandi philosophia, discere persecuti qui te. Eos ad quodsi dissentias, ei odio viris signiferumque mei. Putent iuvaret perpetua nec eu. Has no ornatus vivendum. Adhuc nonumes ex vim, in suas rebum graecis mei, usu ad causae recusabo. Idque vituperata vel ea. Veri verterem pro ex. Ad error omnes est, id sit lorem legendos. Eos vidit ullum ne, tale tantas omittam est ut. Nobis maiorum efficiendi eu mei. Eos et debet placerat signiferumque. Per eu propriae electram. Impetus percipit menandri te ius, mea ne stet posse fabellas. Aliquid corrumpit vel no, mei in diam praesent contentiones. Qui veniam suscipit probatus ex. No autem homero perfecto quo, eos choro facilis ut. Te quo cibo interesset. Vel verear praesent in, menandri deserunt ad his. Labore admodum consetetur has et. Possit facilisi eu sed, lorem iriure eum id, pri ei consul necessitatibus. Est te iusto epicuri. Vis no graece putent mentitum, rebum facete offendit nec in. In duis vivendo sed, vel id enim voluptatibus. Velit sanctus ne mel, quem sumo suavitate mel cu, mea ea nullam feugiat. Tincidunt suscipiantur no pro. Vel ut novum mucius molestie, ut tale ipsum intellegebat mei, mazim accumsan voluptaria ea nam. Posidonium theophrastus ut sea, stet viris hendrerit pro ex, sonet mentitum ne quo. Vim duis feugiat ex, nec eu probo doming persecuti. Velit zril nam in, est commodo splendide id. Et aperiri fuisset iracundia usu. Eu nec iusto audire repudiare.</p>
  • 14

    HTML

    <a href="#target" class="smooth-scroll">
        Link
    </a>
    <div id="target"></div>
    

    或使用绝对完整URL

    <a href="https://somewebsite.com/#target" class="smooth-scroll">
        Link
    </a>
    <div id="target"></div>
    

    jQuery的

    $j(function() {
        $j('a.smooth-scroll').click(function() {
            if (
                    window.location.pathname.replace(/^\//, '') == this.pathname.replace(/^\//, '')
                &&  window.location.hostname == this.hostname
            ) {
                var target = $j(this.hash);
                target = target.length ? target : $j('[name=' + this.hash.slice(1) + ']');
                if (target.length) {
                    $j('html,body').animate({
                        scrollTop: target.offset().top - 70
                    }, 1000);
                    return false;
                }
            }
        });
    });
    
  • 2

    如果您在页面上有一个简单的按钮向下滚动到div并希望 back button 通过跳转到顶部来工作,只需添加以下代码:

    $(window).on('hashchange', function(event) {
        if (event.target.location.hash=="") {
            window.scrollTo(0,0);
        }
    });
    

    这可以扩展为通过读取哈希值跳转到不同的div,并像Joseph Silbers回答一样滚动 .

  • 150

    此解决方案也适用于以下URL,而不会破坏到不同页面的锚链接 .

    http://www.example.com/dir/index.html
    http://www.example.com/dir/index.html#anchor
    
    ./index.html
    ./index.html#anchor
    

    等等

    var $root = $('html, body');
    $('a').on('click', function(event){
        var hash = this.hash;
        // Is the anchor on the same page?
        if (hash && this.href.slice(0, -hash.length-1) == location.href.slice(0, -location.hash.length-1)) {
            $root.animate({
                scrollTop: $(hash).offset().top
            }, 'normal', function() {
                location.hash = hash;
            });
            return false;
        }
    });
    

    我还没有在所有浏览器中测试过这个 .

  • 1

    感谢分享,Joseph Silber . 这里您的2018解决方案为ES6,稍作修改以保持标准行为(滚动到顶部):

    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"
        });
      });
    });
    
  • 1
    $('a[href*=#]').click(function(event){
        $('html, body').animate({
            scrollTop: $( $.attr(this, 'href') ).offset().top
        }, 500);
        event.preventDefault();
    });
    

    这对我来说很完美

  • 2

    有一种使用滚动行为的css方法 . 添加以下属性 .

    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:请检查浏览器兼容性 .

  • 6

    我很惊讶没有人发布了一个原生解决方案,它也负责更新浏览器位置哈希以匹配 . 这里是:

    let anchorlinks = document.querySelectorAll('a[href^="#"]')
     
    for (let item of anchorlinks) { // relitere 
        item.addEventListener('click', (e)=> {
            let hashval = item.getAttribute('href')
            let target = document.querySelector(hashval)
            target.scrollIntoView({
                behavior: 'smooth',
                block: 'start'
            })
            history.pushState(null, null, hashval)
            e.preventDefault()
        })
    }
    

    请参阅教程:http://www.javascriptkit.com/javatutors/scrolling-html-bookmark-javascript.shtml

  • 1

    添加这个:

    function () {
        window.location.hash = href;
    }
    

    以某种方式使垂直偏移无效

    top - 72
    

    在Firefox和IE中,不在Chrome中 . 基本上,页面基于偏移平滑地滚动到它应该停止的点,但是然后跳到页面将没有偏移的位置 .

    它确实将哈希添加到网址的末尾,但是向后按不会将您带回到顶部,它只是从网址中删除哈希并将查看窗口留在它所在的位置 .

    这是我正在使用的完整js:

    var $root = $('html, body');
    $('a').click(function() {
        var href = $.attr(this, 'href');
        $root.animate({
            scrollTop: $(href).offset().top - 120
        }, 500, function () {
            window.location.hash = href;
        });
        return false;
    });
    
  • 1

    这将使jQuery能够轻松识别您的目标哈希,并知道何时何地停止 .

    $('a[href*="#"]').click(function(e) {
        e.preventDefault();
        var target = this.hash;
        $target = $(target);
    
        $('html, body').stop().animate({
            'scrollTop': $target.offset().top
        }, 900, 'swing', function () {
            window.location.hash = target;
        });
    });
    
  • 0

    给出的答案有效但禁用外发链接 . 在一个带有额外奖励的版本下方(摆动)并尊重外向链接 .

    $(document).ready(function () {
        $('a[href^="#"]').on('click', function (e) {
            e.preventDefault();
    
            var target = this.hash;
            var $target = $(target);
    
            $('html, body').stop().animate({
                'scrollTop': $target.offset().top
            }, 900, 'swing', function () {
                window.location.hash = target;
            });
        });
    });
    
  • 12
    $(function() {
      $('a[href*=#]:not([href=#])').click(function() {
        if (location.pathname.replace(/^\//,'') == this.pathname.replace(/^\//,'') && location.hostname == this.hostname) {
          var target = $(this.hash);
          target = target.length ? target : $('[name=' + this.hash.slice(1) +']');
          if (target.length) {
            $('html,body').animate({
              scrollTop: target.offset().top
            }, 1000);
            return false;
          }
        }
      });
    });
    

    官方:http://css-tricks.com/snippets/jquery/smooth-scrolling/

  • 4

    这是我为多个链接和锚点实现的解决方案,用于平滑滚动:

    http://www.adriantomic.se/development/jquery-localscroll-tutorial/如果您在导航div中设置了导航链接并使用此结构声明:

    <a href = "#destinationA">
    

    和您对应的锚标记目的地如下:

    <a id = "destinationA">
    

    然后将其加载到文档的头部:

    <!-- Load jQuery -->
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js"></script>
    
    <!-- Load ScrollTo -->
    <script src="http://flesler-plugins.googlecode.com/files/jquery.scrollTo-1.4.2-min.js"></script>
    
    <!-- Load LocalScroll -->
    <script src="http://flesler-plugins.googlecode.com/files/jquery.localscroll-1.2.7-min.js"></script>
    
    <script type = "text/javascript">
     $(document).ready(function()
        {
            // Scroll the whole document
            $('#menuBox').localScroll({
               target:'#content'
            });
        });
    </script>
    

    感谢@Adriantomic

  • 1
    $("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;
    
        }
    
    
    
    });
    
  • 8

    正确的语法是:

    //Smooth scrolling with links
    $('a[href*=\\#]').on('click', function(event){     
        event.preventDefault();
        $('html,body').animate({scrollTop:$(this.hash).offset().top}, 500);
    });
    
    // Smooth scrolling when the document is loaded and ready
    $(document).ready(function(){
      $('html,body').animate({scrollTop:$(location.hash).offset().‌​top}, 500);
    });
    

    Simplifying :干

    function smoothScrollingTo(target){
      $('html,body').animate({scrollTop:$(target).offset().‌​top}, 500);
    }
    $('a[href*=\\#]').on('click', function(event){     
        event.preventDefault();
        smoothScrollingTo(this.hash);
    });
    $(document).ready(function(){
      smoothScrollingTo(location.hash);
    });
    

    href*=\\# 的说明:

    • * 表示它与包含 # char的内容匹配 . 因此只匹配锚点 . 有关此含义的更多信息,请参阅here

    • \\ 是因为 # 是css选择器中的特殊字符,所以我们必须将其转义 .

  • 1

    我为“/ xxxxx#asdf”和“#asdf”href锚点做了这个

    $("a[href*=#]").on('click', function(event){
        var href = $(this).attr("href");
        if ( /(#.*)/.test(href) ){
          var hash = href.match(/(#.*)/)[0];
          var path = href.match(/([^#]*)/)[0];
    
          if (window.location.pathname == path || path.length == 0){
            event.preventDefault();
            $('html,body').animate({scrollTop:$(this.hash).offset().top}, 1000);
            window.location.hash = hash;
          }
        }
    });
    
  • 0

    经过测试和验证的代码

    <script>
    jQuery(document).ready(function(){
    // Add smooth scrolling to all links
    jQuery("a").on('click', function(event) {
    
    // Make sure this.hash has a value before overriding default behavior
    if (this.hash !== "") {
      // Prevent default anchor click behavior
      event.preventDefault();
    
      // Store hash
      var hash = this.hash;
    
      // Using jQuery's animate() method to add smooth page scroll
      // The optional number (800) specifies the number of milliseconds it takes to scroll to the specified area
      jQuery('html, body').animate({
        scrollTop: jQuery(hash).offset().top
      }, 800, function(){
    
        // Add hash (#) to URL when done scrolling (default click behavior)
        window.location.hash = hash;
      });
    } // End if
    });
    });
    </script>
    
  • 2

    使用JQuery:

    $('a[href*=#]').click(function(){
      $('html, body').animate({
        scrollTop: $( $.attr(this, 'href') ).offset().top
      }, 500);
      return false;
    });
    
  • 2

    对于新的浏览器,纯CSS解决方案:

    body {
        scroll-behavior: smooth;
    }
    

    还有一个基于coco puffs答案的JS解决方案(我不能发布一个评论由于排名) . (请注意,我更改了用于通过其name属性查找锚点的查询选择器,我想知道它对于coco puffs是如何工作的) .

    let anchorlinks = document.querySelectorAll('a[href^="#"]');
    
    for (let item of anchorlinks) {
        item.addEventListener('click', (e)=> {
            let hashval = item.getAttribute('href');
            let target = document.querySelector('[name="'+hashval.substr(1)+'"]');
            target.scrollIntoView({
                behavior: 'smooth',
                block: 'start'
            });
            history.pushState(null, null, hashval);
            e.preventDefault();
        })
    }
    
  • 974

    我建议你制作这个通用代码:

    $('a[href^="#"]').click(function(){
    
    var the_id = $(this).attr("href");
    
        $('html, body').animate({
            scrollTop:$(the_id).offset().top
        }, 'slow');
    
    return false;});
    

    你可以在这里看到一篇非常好的文章:jquery-effet-smooth-scroll-defilement-fluide

  • 0

    Update April 2018: 现在a native way to do this

    document.querySelectorAll('a[href^="#"]').forEach(anchor => {
        anchor.addEventListener('click', function (e) {
            e.preventDefault();
    
            document.querySelector(this.getAttribute('href')).scrollIntoView({
                behavior: 'smooth'
            });
        });
    });
    

    目前仅在最前沿的浏览器中支持此功能 .


    对于较旧的浏览器支持,您可以使用此jQuery技术:

    $(document).on('click', 'a[href^="#"]', function (event) {
        event.preventDefault();
    
        $('html, body').animate({
            scrollTop: $($.attr(this, 'href')).offset().top
        }, 500);
    });
    

    这是小提琴:http://jsfiddle.net/9SDLw/


    如果您的目标元素没有ID,并且您通过 name 链接到它,请使用以下命令:

    $('a[href^="#"]').click(function () {
        $('html, body').animate({
            scrollTop: $('[name="' + $.attr(this, 'href').substr(1) + '"]').offset().top
        }, 500);
    
        return false;
    });
    

    为了提高性能,您应该缓存 $('html, body') 选择器,以便每次单击锚点时都不会运行它:

    var $root = $('html, body');
    
    $('a[href^="#"]').click(function () {
        $root.animate({
            scrollTop: $( $.attr(this, 'href') ).offset().top
        }, 500);
    
        return false;
    });
    

    如果要更新URL,请在 animate 回调中执行此操作:

    var $root = $('html, body');
    
    $('a[href^="#"]').click(function() {
        var href = $.attr(this, 'href');
    
        $root.animate({
            scrollTop: $(href).offset().top
        }, 500, function () {
            window.location.hash = href;
        });
    
        return false;
    });
    
  • 1

    如今,现代浏览器的速度要快一些 . 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
        }
    }
    

相关问题