LoginSignup
5
3

More than 5 years have passed since last update.

jQuery ページ内リンクと先頭に戻るスムーズスクロール

Last updated at Posted at 2016-07-02

仕様

  • ページ内リンク(ハッシュ#)はその位置までスクロール
  • Page Topボタンを押すと先頭までスクロール
  • Page Topボタンはある程度スクロールしたらふわっと出るようにしたい。

デモ

ソース

CSSとHTMLのマークアップはおこのみで。
jQuery 1.12〜3.x.x でも動くよ。

page-top.html
<div id="page-top"><a href="#_top">Page Top</a></div>

<a href="#"> としていないのは、他のJavaScriptでそのような指定があるときバッティングしないようにするため。

page-scroll.js
(function($){

    /*
     * jQuery page scroll
     */

    var topBtn  = $('#page-top'); // 先頭に戻るボタンの入るDOM
    var topHash = '#_top'; // 先頭に戻るボタンのhrefの中身
    var viewPos = 100; // 先頭に戻るボタンが表示され始める位置

    // jQuery 1.9 以降用のブラウザ判定
    var isHtmlScroll = (function() {
        var html = $('html'),
        top = html.scrollTop();
        var el = $('<div/>').height(10000).prependTo('body');
        html.scrollTop(10000);
        var rs = !!html.scrollTop();
        html.scrollTop(top);
        el.remove();
        return rs;
    })();

    // 先頭に戻るボタンの表示
    $(window).scroll(function () {
        if ($(this).scrollTop() > viewPos ) {
            topBtn.fadeIn();
        } else {
            topBtn.fadeOut();
        }
    });

    $('a[href*=\\#]:not([href=\\#])').click( function() { // スムーズスクロール
        var href = this.hash;
        var $target = $(href == topHash || href == "" ? 'body' : href);
        if ( $target.length > 0 ) {
            var top = $target.offset().top;
            $(isHtmlScroll ? 'html' : 'body').animate({
                scrollTop: top
            }, 'slow', 'swing');
        }
        return false;
    });
})(jQuery);
5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3