jQueryを使用して特定のアイテムにスクロールする方法は?


252

垂直スクロールバーのある大きなテーブルがあります。jQuery / Javascriptを使用して、このテーブルの特定の行にスクロールしたいと思います。

これを行う組み込みの方法はありますか?

ここでは、遊ぶための小さな例を示します。

div {
    width: 100px;
    height: 70px;
    border: 1px solid blue;
    overflow: auto;
}
<div>
    <table id="my_table">
        <tr id='row_1'><td>1</td></tr>
        <tr id='row_2'><td>2</td></tr>
        <tr id='row_3'><td>3</td></tr>
        <tr id='row_4'><td>4</td></tr>
        <tr id='row_5'><td>5</td></tr>
        <tr id='row_6'><td>6</td></tr>
        <tr id='row_7'><td>7</td></tr>
        <tr id='row_8'><td>8</td></tr>
        <tr id='row_9'><td>9</td></tr>
    </table>
</div>

回答:


562

とてもシンプルです。プラグインは必要ありません

var $container = $('div'),
    $scrollTo = $('#row_8');

$container.scrollTop(
    $scrollTo.offset().top - $container.offset().top + $container.scrollTop()
);

// Or you can animate the scrolling:
$container.animate({
    scrollTop: $scrollTo.offset().top - $container.offset().top + $container.scrollTop()
});​

これが実際の例です。

のドキュメントscrollTop


4
コンテナにスクロールバーがある場合は、scrollTopを考慮する必要があります:scrollTo.offset()。top-container.offset()。top + container.scrollTop()
claviska

1
$(document).scrollTop(value)を使用してウィンドウ全体をスクロールできます。基盤となるjqueryコードはブラウザの問題を解決します。
Chris Moschini、2012年

7
scrollTo上部ではなく中央に配置する場合:scrollTo.offset().top - container.offset().top + container.scrollTop() - (container.height()/2)
Mahn

7
element.scrollIntoView()-それが必要なすべてです。アニメーションは標準化されています。developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView
WickyNilliams

7
コードブロックの最後に「見えない」文字があることに注意してください。文字はEdge、Chromeでは無効と見なされます。-コピー/貼り付け
攻撃

114

これはコンテナでのスクロールに応答しないことを理解していますが、人々はそれを便利だと感じています:

$('html,body').animate({scrollTop: some_element.offset().top});

htmlとbodyの両方を選択します。これは、ドキュメントスクローラーがどちらかにある可能性があり、どちらを選択するのが難しいためです。最新のブラウザでは、を使用して回避できます$(document.body)

または、ページの上部に移動するには:

$('html,body').animate({scrollTop: 0});

またはアニメーションなし:

$(window).scrollTop(some_element.offset().top);

または...

window.scrollTo(0, some_element.offset().top); // native equivalent (x, y)

こんにちは@infensus鉱山が機能していないこの原因の実例を教えてもらえますか?私はvar section2 = $( '#section-2');を使用しました $( 'html、body')。animate({scrollTop:section2.offset()。top});
dll_onFire 2013年

それは問題ないようです-セクション2は存在しますか?console.log(section2.length); 0でないことを確認します。少し例を挙げます。
ドミニク2013年

なんで$('html,body')?彼は特定のコンテナでのみ必要です。受け入れられた答えは私にとってより良いです。質問と同様のケースがありますが、あなたの答えはうまくいきませんでした。
ペトロフ2015

2
@Petroffが不思議なことにこれを書いたとき、要素がスクロールコンテナにあることに気づきませんでした。質問のタイトルが原因でGoogleの検索から本文をスクロールするために人々がここに来たので、私の答えはそのままにしておきます
Dominic

30

私はケビンと他の人に同意します、これのためのプラグインを使用することは無意味です。

window.scrollTo(0, $("#element").offset().top);

非常にシンプルなもののために、私は他のソリューションをオンラインで何年も費やしてきましたが、このシンプルな1つのライナーがまさに私が必要としていることを行います。
ローレンスコープ2013

3
この方法はウィンドウ全体で機能することに注意してください。overflow:scrollのあるコンテンツをスクロールする場合、これは機能しません。
ジェレミー

12

なんとか自分でやった。プラグインは必要ありません。私の要点を確認してください:

// Replace #fromA with your button/control and #toB with the target to which     
// You wanna scroll to. 
//
$("#fromA").click(function() {
    $("html, body").animate({ scrollTop: $("#toB").offset().top }, 1500);
});

アニメーションを完備したあなたの1行の要点は、まさに私が必要としていたものです。ありがとう!
Scott Smith

No need for any plugins?? しかし、jQueryを使用します!プラグインでもなく、巨大なライブラリがおかしくなっています。
グリーン

1
jqueryライブラリ参照に加えて参照を追加する必要がないことを知っています。さらに、jqueryは一種の業界標準です。なぜそれを使わないのですか?それはおそらくjqueryなしでかなり実行可能ですが、それでも誰かが解析部分のためだけに多くのコードを書く必要があります。それは逆効果を感じます。そして、汚いdivにスクロールするためだけに完全なプラグインを書くのは逆効果だと感じました。
lorddarq 2016年

4

scrollIntoView()JavaScriptでメソッドを使用できます。ただ与えるid.scrollIntoView();

例えば

row_5.scrollIntoView();

それをアニメーション化するには?
グリーン

アニメートする必要はありません。scrollIntoView()を使用すると、コントロールが自動的にスクロールされ、ビューに表示されます。
タミララシ


2

要素をコンテナの中央にスクロールします

要素をコンテナの中央に移動します。

CODEPENのデモ

JS

function scrollToCenter() {
  var container = $('.container'),
    scrollTo = $('.5');

  container.animate({
    //scrolls to center
    scrollTop: scrollTo.offset().top - container.offset().top + scrollTo.scrollTop() - container.height() / 2
  });
}

HTML

<div class="container">
   <div class="1">
    1
  </div>
  <div class="2">
    2
  </div>
  <div class="3">
    3
  </div>
  <div class="4">
    4
  </div>
  <div class="5">
    5
  </div>
  <div class="6">
    6
  </div>
  <div class="7">
    7
  </div>
  <div class="8">
    8
  </div>
  <div class="9">
    9
  </div>
  <div class="10">
    10
  </div>


</div>
<br>
<br>
<button id="scroll" onclick="scrollToCenter()">
  Scroll
</button>

CSS

.container {
  height: 60px;
  overflow-y: scroll;
  width 60px;
  background-color: white;
}

これは中心に正確ではありませんが、大きな要素では認識できません。


2

jQueryJavaScriptでスクロールできます 。2つの要素jQueryと次のJavaScriptコードが必要です。

$(function() {
  // Generic selector to be used anywhere
  $(".js-scroll-to-id").click(function(e) {

    // Get the href dynamically
    var destination = $(this).attr('href');

    // Prevent href=“#” link from changing the URL hash (optional)
    e.preventDefault();

    // Animate scroll to destination
    $('html, body').animate({
      scrollTop: $(destination).offset().top
    }, 1500);
  });
});


1

他の人が投稿したものを組み合わせました。シンプルでスムーズ

 $('#myButton').click(function(){
        $('html, body').animate({
            scrollTop: $('#scroll-to-this-element').position().top },
            1000
        );
    });

@AnriëtteMyburghは、position()がすべてのブラウザーで機能するかどうか不明です。それが機能するかどうかを確認するために他の人でそれを試しましたか?または、使用しているコードを確認して、他に問題がないかどうかを確認できますか?
Nlinscott 14

1

組み込みのJavaScript scrollTo関数があるため、なぜ誰も明白なことを言わないのかわかりません:

scrollTo( $('#element').position().top );

リファレンス


6
scrollToには2つの引数が必要ですが、1つしか記述していません。
NuclearPeon 2014

2
...そして、それはウィンドウオブジェクトで呼び出されます。
hashchange、2015

1

ここではほとんどの人が示唆されていることに反して、私はあなたがお勧めしますあなたは動きをアニメーション化する場合は、プラグインを使用します。scrollTopをアニメーション化するだけでは、スムーズなユーザーエクスペリエンスには不十分です。理由については、ここ私の答えを参照しください。

私は何年にもわたっていくつかのプラグインを試しましたが、最終的に自分でプラグインを作成しました。あなたはそれにスピンを与えたいと思うかもしれません:jQuery.scrollableを。それを使用して、スクロールアクションは

$container.scrollTo( targetPosition );

しかし、それだけではありません。目標位置も固定する必要があります。あなたが他の答えで見る計算、

$target.offset().top - $container.offset().top + $container.scrollTop()

ほとんど動作しますが、完全に正しくはありません。スクロールコンテナーの境界線を適切に処理しません。境界線のサイズによって、ターゲット要素が上にスクロールされすぎています。こちらがデモです。

したがって、目標位置を計算するより良い方法は

var target = $target[0], 
    container = $container[0];

targetPosition = $container.scrollTop() + target.getBoundingClientRect().top - container.getBoundingClientRect().top - container.clientTop;

繰り返しになりますが、デモを見て実際の動作を確認してください。

ターゲット位置を返し、ウィンドウスクロールコンテナと非ウィンドウスクロールコンテナの両方で機能する関数の場合は、この要旨を自由に使用してください。そこにあるコメントは、ポジションの計算方法を説明しています。

最初に、アニメーションスクロールにはプラグインを使用するのが最善だと述べました。ただし、遷移なしでターゲットにジャンプする場合は、プラグインは必要ありません。@James回答を参照してください。ただし、コンテナの周囲に境界がある場合は、ターゲットの位置を正しく計算してください。


0

価値があることについては、これは私がスクロールして(コンテナーを知らなくても)DIV内にある可能性がある一般的な要素に対してそのような動作を達成する方法です

ターゲット要素の高さの偽の入力を作成し、それにフォーカスを置きます。スクロール可能な階層内の深さに関係なく、ブラウザーが残りの部分を処理します。魅力のように機能します。

var $scrollTo = $('#someId'),
inputElem = $('<input type="text"></input>');

$scrollTo.prepend(inputElem);
inputElem.css({
  position: 'absolute',
  width: '1px',
  height: $scrollTo.height()
});
inputElem.focus();
inputElem.remove();

0

私はこの組み合わせをしました。私にとってはその仕事。ただし、divのサイズが大きすぎると、scenarioがこの特定のdivまでスクロールしないため、クリック移動が1つの問題に直面します。

 var scrollDownTo =$("#show_question_" + nQueId).position().top;
        console.log(scrollDownTo);
        $('#slider_light_box_container').animate({
            scrollTop: scrollDownTo
            }, 1000, function(){
        });

        }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.