web-dev-qa-db-ja.com

HTMLページを特定のアンカーにスクロールする方法

JavaScriptを使用して、ブラウザでページを特定のアンカーにスクロールするようにします。

HTMLコードにnameまたはid属性を指定しました。

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

または

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

http://server.com/path#anchorNameに移動しても、同じ効果が得られます。アンカーがページの表示部分の上部近くになるようにページをスクロールする必要があります。

224
Juha Syrjälä
function scrollTo(hash) {
    location.hash = "#" + hash;
}

JQueryはまったく必要ありません。

305
Dean Harding

より簡単な方法:

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

あなたはjQuerys 。animate()。offset() そしてscrollTop。好き

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

リンク例: http://jsbin.com/unasi3/edit

アニメートしたくない場合は、 。scrollTop() を使用します。

$(document.body).scrollTop($('#anchorName2').offset().top);

またはネイティブのlocation.hashのようなJavaScript

location.hash = '#' + anchorid;
122
jAndy

JAndyによる素晴らしい解決策ですが、スムーズなスクロールはFirefoxではうまく動かないようです。

このように書くことはFirefoxでも動きます。

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

JQueryを使わない純粋なJavaScriptソリューション。 Chrome&I.eでテスト済み、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/

24

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

方法の詳細を学びます。


要素が一番上にあることが必要な場合:

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

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

Codepenでのデモ例


サポート:

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

彼らはscrollscrollToと同じ方法であると書いていますが、サポートはscrollToでよりよく示されます。

メソッドの詳細

2018年では、このような単純なものにはjQueryは必要ありません。組み込みの[scrollIntoView()][1]メソッドは、ページ上の任意の要素にスムーズにスクロールするための "behavior"プロパティをサポートしています。ブラウザのURLをハッシュで更新してブックマーク可能にすることもできます。

HTMLブックマークのスクロールに関するこのチュートリアルの から、ページ上のすべてのアンカーリンクにスムーズなスクロールを自動的に追加するためのネイティブな方法があります。

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()
    })
}
12
coco puffs

ほとんどの答えは不必要に複雑です。

ターゲット要素にジャンプするだけの場合は、JavaScriptは必要ありません。

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

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

あなたがアニメーションでターゲットにスクロールしたい場合は、@ Shahilの回答を参照してください。

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

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;
    }
  }
 });
});
5
Bill Shihara

これは動作します:

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

  e.preventDefault();

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

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

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

  }, 2000);

});

https://jsfiddle.net/68pnkfgd/

アニメートしたいリンクにクラス「scroll」を追加するだけです。

2
Chuck Le Butt

2019スムーズに適切な位置にスクロール

correctY座標を取得し、window.scrollToを使用するだけです。

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

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

オフセットでスムーズにスクロール

scrollIntoViewも良いオプションですが、場合によっては完全に機能しない場合があります。たとえば、 追加のオフセットが必要 の場合。 scrollToを使用すると、次のようにそのオフセットをyCoordinateに追加するだけです。

const yOffset = -10; 

window.scrollTo({
    top: yCoordinate + yOffset,
    behavior: 'smooth'
});
2
Arseniy-II
jQuery("a[href^='#']").click(function(){
    jQuery('html, body').animate({
        scrollTop: jQuery( jQuery(this).attr('href') ).offset().top
    }, 1000);
    return false;
});
1
Adam Pery

これはページをアンカーまでスクロールする実用的なスクリプトです。設定するには、アンカーリンクにスクロールしたいアンカーのname属性と一致するidを与えるだけです。

<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>
1
Rudy Lister

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;
 }
1
Yordan Georgiev

これは非常に古い質問ですが、 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;
      }
    }
  });
});
1
Horacio