[作って学ぶ!jQuery] 第4回 ページスクロールを作って学ぶ

No Photo

イメージ

ページ内リンクを選択したときにアニメーションしながらスクロールする機能をスムーズスクロールというみたいです。スムーズスクロールの例がjQuery でページスクロール - daily dayflowerで紹介されていましたので、そちらを参考にして、ページ内リンクに対応したものを紹介いたします。

デモ

ページの最後に、TOPと中間地点へのページ内リンクを設置しました。

ソースコード

$(document).ready(function(){
    $('a[href^=#]').click(function(){
        var target;
        target = $( $(this).attr('href') );
        if (target.length == 0) {
            return;
        }
        $('html, body').animate({scrollTop: target.offset().top});
        return false;
    });
});

ブラウザのデフォルトの動作であれば、ページ内リンクを選択するとすぐ切り替わりますが、このスクリプトを実行すれば、スルスルとスクロールしながら、リンク先を表示するようになります。

それぞれの行に解説を加えます。

$(document).ready(function(){
    // href属性が # で始まるa要素だけ、振る舞いを変える
    $('a[href^=#]').click(function(){
        var target;
        // href 属性が、そのままセレクタで使える
        target = $( $(this).attr('href') );
        // ターゲットがない場合はなにもしない
        if (target.length == 0) {
            return;
        }
        // リンク先の画面上の位置を取得して、そこまでスクロール
        $('html, body').animate({scrollTop: target.offset().top});
        // ブラウザのデフォルトの振る舞いを回避
        return false;
    });
});

実装について

書いたあとでこのコードを見ると、いくつか問題点があることがわかります。

  • ページ内リンクが # で始まるとは限らない。その場合、href属性がそのままセレクタで使えない
  • アンカーの終点がidではなくname属性で定義されてたときに対応していない

記事冒頭でご紹介したブログからさらに紹介されているAnimated Scrolling with jQuery 1.2 » Learning jQuery - Tips, Techniques, Tutorialsでは、その問題が解決されているようです。実際にスムーズスクロールを実装してみてからコードを読むと、理解しやすいと思います。

まとめ

  • ページ内リンクをスムーズスクロールさせる処理をjQueryで記述する例を紹介しました。
  • 今回のようなスムーズスクロールに限らず、scrollTopという疑似プロパティ(ってあってます?)を使うと、スクロール位置を変えることができます。
  • このエントリーをはてなブックマークに追加

この記事を読んだ人にオススメ