如何将HTML页面滚动到给定的锚点?

时间:2010-07-02 06:18:50

标签: javascript jquery html scroll anchor

我想让浏览器将页面滚动到给定的锚点,只需使用JavaScript。

我在HTML代码中指定了nameid属性:

 <a name="anchorName">..</a>

 <h1 id="anchorName2">..</h1>

我希望通过导航到http://server.com/path#anchorName获得与获得相同的效果。应该滚动页面,使锚点靠近页面可见部分的顶部。

17 个答案:

答案 0 :(得分:304)

function scrollTo(hash) {
    location.hash = "#" + hash;
}

根本不需要jQuery!

答案 1 :(得分:204)

方式更简单:

var element_to_scroll_to = document.getElementById('anchorName2');
// Or:
var element_to_scroll_to = document.querySelectorAll('.my-element-class')[0];
// Or:
var element_to_scroll_to = $('.my-element-class')[0];
// Basically `element_to_scroll_to` just have to be a reference
// to any DOM element present on the page
// Then:
element_to_scroll_to.scrollIntoView();

答案 2 :(得分:122)

您可以使用jQuerys .animate().offset()scrollTop。像

$(document.body).animate({
    'scrollTop':   $('#anchorName2').offset().top
}, 2000);

示例链接:http://jsbin.com/unasi3/edit

如果您不想像

那样使用.scrollTop()动画
$(document.body).scrollTop($('#anchorName2').offset().top);

或javascripts native location.hash like

location.hash = '#' + anchorid;

答案 3 :(得分:31)

jAndy提供了很好的解决方案,但平滑滚动似乎在firefox中有问题。

这样写它也适用于Firefox。

(function($) {
    $(document).ready(function() {
         $('html, body').animate({
           'scrollTop':   $('#anchorName2').offset().top
         }, 2000);
    });
})(jQuery);

答案 4 :(得分:24)

没有JQuery的纯JavaScript解决方案。在Chrome&amp;即,未在IOS上测试

function ScrollTo(name) {
  ScrollToResolver(document.getElementById(name));
}

function ScrollToResolver(elem) {
  var jump = parseInt(elem.getBoundingClientRect().top * .2);
  document.body.scrollTop += jump;
  document.documentElement.scrollTop += jump;
  if (!elem.lastjump || elem.lastjump > Math.abs(jump)) {
    elem.lastjump = Math.abs(jump);
    setTimeout(function() { ScrollToResolver(elem);}, "100");
  } else {
    elem.lastjump = null;
  }
}

演示:https://jsfiddle.net/jd7q25hg/12/

答案 5 :(得分:15)

2018年纯js:

有一种非常方便的滚动到元素的方法:

el.scrollIntoView({
  behavior: 'smooth', // smooth scroll
  block: 'start' // the upper border of the element will be aligned at the top of the visible part of the window of the scrollable area.
})

但是据我了解,他没有以下选项的良好支持。

enter image description here

Learn more about the method.


如果有必要将元素放在顶部:

const element = document.querySelector('#element')
const top = element.getBoundingClientRect().top

window.scrollTo({
  top, // scroll so that the element is at the top of the view
  behavior: 'smooth' // smooth scroll
})

Demonstration example on Codepen


如果您希望元素位于中心:

const element = document.querySelector('#element')
const rect = element.getBoundingClientRect() // get rects(width, height, top, etc)
const viewHeight = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);

window.scroll({
  top: rect.top + rect.height / 2 - viewHeight / 2,
  behavior: 'smooth' // smooth scroll
});

Demonstration example on Codepen


支持:

введите сюда описание изображения

他们写道scrollscrollTo是相同的方法,但在scrollTo中显示更好的支持。

More about the method

答案 6 :(得分:12)

在2018年,你不需要像这样简单的jQuery。内置的[scrollIntoView()][1]方法支持“behavior”属性,可以平滑地滚动到页面上的任何元素。您甚至可以使用哈希更新浏览器URL,使其成为可收藏的。

this tutorial on scrolling HTML Bookmarks开始,这是一种自然地向页面上的所有锚链接添加平滑滚动的本地方式:

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()
    })
}

答案 7 :(得分:6)

大多数答案都不必要地复杂化。

如果您只想跳转到目标元素,那么您就不需要JavaScript了:

# the link:
<a href="#target">Click here to jump.</a>

# target element:
<div id="target">Any kind of element.</div>

如果你想动画滚动到目标,请参阅@ Shahil的答案。

答案 8 :(得分:6)

$(document).ready ->
  $("a[href^='#']").click ->
    $(document.body).animate
      scrollTop: $($(this).attr("href")).offset().top, 1000

答案 9 :(得分:5)

CSS-Tricks的解决方案不再适用于jQuery 2.2.0。它会抛出一个选择器错误:

  

JavaScript运行时错误:语法错误,无法识别的表达式:a [href * =#]:not([href =#])

我通过更改选择器来修复它。完整的片段是这样的:

$(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;
    }
  }
 });
});

答案 10 :(得分:5)

使浏览器将页面滚动到给定锚点的最简单方法是键入您的样式。css* {scroll-behavior:smooth;} 并在您的html导航中使用#NameOfTheSection

*{scroll-behavior: smooth;}
<a href="#scroll-to">Home<a/>

<p>other sections</p>
<p>other sections</p>
<p>other sections</p>
<p>other sections</p>
<p>other sections</p>
<p>other sections</p>
<p>other sections</p>
<p>other sections</p>
<p>other sections</p>
<p>other sections</p>
<p>other sections</p>
<p>other sections</p>
<p>other sections</p>

<section id="scroll-to">
<p>it will scroll down to this section</p>
</section>

答案 11 :(得分:1)

我知道这个问题很老,但我在css-tricks找到了一个简单易用的jQuery解决方案。这就是我现在使用的那个。

$(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;
      }
    }
  });
});

答案 12 :(得分:1)

这是一个将页面滚动到锚点的工作脚本。 要设置,只需为锚链接指定一个id,该ID与要滚动到的锚点的name属性相匹配。

<script>
jQuery(document).ready(function ($){ 
 $('a').click(function (){ 
  var id = $(this).attr('id');
  console.log(id);
  if ( id == 'cet' || id == 'protein' ) {
   $('html, body').animate({ scrollTop: $('[name="' + id + '"]').offset().top}, 'slow'); 
  }
 }); 
});
</script>

答案 13 :(得分:1)

这有效:

$('.scroll').on("click", function(e) {

  e.preventDefault();

  var dest = $(this).attr("href");

  $("html, body").animate({

    'scrollTop':   $(dest).offset().top

  }, 2000);

});

https://jsfiddle.net/68pnkfgd/

只需将“滚动”类添加到您要设置动画的任何链接

答案 14 :(得分:1)

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

答案 15 :(得分:1)

vue2解决方案...添加简单数据属性以简单地强制更新

  const app = new Vue({ 
  ... 

  , updated: function() {
           this.$nextTick(function() {
           var uri = window.location.href
           var anchor = ( uri.indexOf('#') === -1 ) ? '' : uri.split('#')[1]
           if ( String(anchor).length > 0 && this.updater === 'page_load' ) {
              this.updater = "" // only on page-load !
              location.href = "#"+String(anchor)
           }
         })
        }
     });
     app.updater = "page_load"

 /* smooth scrolling in css - works in html5 only */
 html, body {
     scroll-behavior: smooth;
 }

答案 16 :(得分:0)

2019平滑滚动到正确的位置

只需得到正确 Y坐标并使用window.scrollTo

const yourElement = document.getElementById('anchorName2');
const yCoordinate = yourElement.getBoundingClientRect().top + window.pageYOffset;

window.scrollTo({
    top: yCoordinate,
    behavior: 'smooth'
});

scrollIntoView也是一个不错的选择,但在某些情况下可能无法完美运行。例如,当you need additional offset时。使用scrollTo,您只需要像这样将偏移量添加到yCoordinate

const yOffset = -10; 

window.scrollTo({
    top: yCoordinate + yOffset,
    behavior: 'smooth'
});