クリックで特定のdivにスムーズにスクロール


91

私がやろうとしているのは、ボタンをクリックすると、ページ上の特定のdivまで(スムーズに)スクロールするようにすることです。

ボタンをクリックすると、div 'second'までスムーズにスクロールします。

.first {
    width: 100%;
    height: 1000px;
    background: #ccc;
}

.second {
    width: 100%;
    height: 1000px;
    background: #999;
}
<div class="first"><button type="button">Click Me!</button></div>
<div class="second">Hi</div>


あなたはこのプラグインを試すことができますが、これははるかにユーザーフレンドリーです。ほとんどの場合、ヘッダーのJSファイルをリンクし、機能するようにマークアップを適切に変更する必要があります。
joshrathke 2013

1
これはあなたが::役立つはずstackoverflow.com/questions/3432656/...
のSudhir Bastakoti

回答:


177

行う:

$("button").click(function() {
    $('html,body').animate({
        scrollTop: $(".second").offset().top},
        'slow');
});

更新されたJsfiddle


ここでjavaScriptまたはjQueryを使用していますか?

1
@FahadUddinそのjQuery。
Sudhir Bastakoti 2017年

@SudhirBastakoti:JsFiddleがそのページにjqueryライブラリを含まないのはなぜですか?

@Sudhir Bastakotiですが、多くのユーザーがスムーズなスクロールではないと不満を述べています。
Maulik 2017年

39

jQuery、Mootools、PrototypeなどのJSライブラリを使用したスムーズスクロールの多くの例があります。

次の例は、純粋なJavaScriptでの例です。ページにjQuery / Mootools / Prototypeがない場合、または重いJSライブラリでページをオーバーロードしたくない場合は、この例が役に立ちます。

http://jsfiddle.net/rjSfP/

HTMLパーツ:

<div class="first"><button type="button" onclick="smoothScroll(document.getElementById('second'))">Click Me!</button></div>
<div class="second" id="second">Hi</div>

CSSパーツ:

.first {
    width: 100%;
    height: 1000px;
    background: #ccc;
}

.second {
    width: 100%;
    height: 1000px;
    background: #999;
}

JSパート:

window.smoothScroll = function(target) {
    var scrollContainer = target;
    do { //find scroll container
        scrollContainer = scrollContainer.parentNode;
        if (!scrollContainer) return;
        scrollContainer.scrollTop += 1;
    } while (scrollContainer.scrollTop == 0);

    var targetY = 0;
    do { //find the top of target relatively to the container
        if (target == scrollContainer) break;
        targetY += target.offsetTop;
    } while (target = target.offsetParent);

    scroll = function(c, a, b, i) {
        i++; if (i > 30) return;
        c.scrollTop = a + (b - a) / 30 * i;
        setTimeout(function(){ scroll(c, a, b, i); }, 20);
    }
    // start scrolling
    scroll(scrollContainer, scrollContainer.scrollTop, targetY, 0);
}

私はこれを使用していて、うまくいきます。どうすればスクロールを遅くできますか?
jamescampbell

このコードで固定ナビゲーションバーのオフセットを追加する方法はありますか?これが私がバイオリン
Plavookac

3
まだ5年後参考になっ
Owaiz Yusufi

9

ニコの答えを少しいじってみたらびくびくした。少し調べてみましwindow.requestAnimationFrameたが、これは各再描画サイクルで呼び出される関数です。これにより、よりきれいに見えるアニメーションが可能になります。まだステップサイズの適切なデフォルト値に焦点を合わせようとしていますが、私の例では、この実装を使用するとかなり良く見えます。

var smoothScroll = function(elementId) {
    var MIN_PIXELS_PER_STEP = 16;
    var MAX_SCROLL_STEPS = 30;
    var target = document.getElementById(elementId);
    var scrollContainer = target;
    do {
        scrollContainer = scrollContainer.parentNode;
        if (!scrollContainer) return;
        scrollContainer.scrollTop += 1;
    } while (scrollContainer.scrollTop == 0);

    var targetY = 0;
    do {
        if (target == scrollContainer) break;
        targetY += target.offsetTop;
    } while (target = target.offsetParent);

    var pixelsPerStep = Math.max(MIN_PIXELS_PER_STEP,
                                 (targetY - scrollContainer.scrollTop) / MAX_SCROLL_STEPS);

    var stepFunc = function() {
        scrollContainer.scrollTop =
            Math.min(targetY, pixelsPerStep + scrollContainer.scrollTop);

        if (scrollContainer.scrollTop >= targetY) {
            return;
        }

        window.requestAnimationFrame(stepFunc);
    };

    window.requestAnimationFrame(stepFunc);
}

1
@Alfonso上記を参照してください。これは、前の回答のnicoのコードの最適化バージョンです。
Ned Rockson、2016年

@NedRockson機能しないのでコンソールメッセージ「Uncaught TypeError:cannot read property 'parentNode' of null」が表示されますが、nicoのコードは機能しています。クリーンなアニメーションを適用するにはどうすればよいですか?
Kartik Watwani 2017

@KartikWatwaniつまり、行の読み取りscrollContainer = scrollContainer.parentNodeでscrollContainerがnullであることを意味します。これはおそらく、elementIdこの関数を呼び出すときに正しいものを渡していないことを意味します。elementIdが存在しないページでこのスクリプトを実行している可能性もあります。
Ned Rockson、2017

@NedRockson elementId間違っていたとしたら、@ nicoの例の場合と同じエラーが発生しますが、その場合、スクロールは機能しますがスムーズに動作しません。
Kartik Watwani 2017

requestAnimationFrame代わりにを使用setTimeoutする方法です。setTimeoutアニメーションには使用しないでください。
tsnkff 2017


2

私が取ったネッドRocksonのバージョンをし、同様に上向きにスクロールを可能にし、それを調整しました。

var smoothScroll = function(elementId) {
  var MIN_PIXELS_PER_STEP = 16;
  var MAX_SCROLL_STEPS = 30;
  var target = document.getElementById(elementId);
  var scrollContainer = target;
  do {
    scrollContainer = scrollContainer.parentNode;
    if (!scrollContainer) return;
    scrollContainer.scrollTop += 1;
  } while (scrollContainer.scrollTop === 0);

  var targetY = 0;
  do {
    if (target === scrollContainer) break;
    targetY += target.offsetTop;
  } while (target = target.offsetParent);

  var pixelsPerStep = Math.max(MIN_PIXELS_PER_STEP,
    Math.abs(targetY - scrollContainer.scrollTop) / MAX_SCROLL_STEPS);

  var isUp = targetY < scrollContainer.scrollTop;

  var stepFunc = function() {
    if (isUp) {
      scrollContainer.scrollTop = Math.max(targetY, scrollContainer.scrollTop - pixelsPerStep);
      if (scrollContainer.scrollTop <= targetY) {
        return;
      }
    } else {
        scrollContainer.scrollTop = Math.min(targetY, scrollContainer.scrollTop + pixelsPerStep);

      if (scrollContainer.scrollTop >= targetY) {
        return;
      }
    }

    window.requestAnimationFrame(stepFunc);
  };

  window.requestAnimationFrame(stepFunc);
};

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