スムーススクロールがうまく動かない場合の解決方法

Tips

比較的簡単に実装できることもあって、
昨今リッチなWEBサイトにはまず必ずといっていいほど使われているスムーススクロールですが、
場合によってよく使われる書き方のままではうまく動いてくれない場合があります。
例えばワードプレスなどを使用している時にナビゲーションを共通で読み込んでいる場合で、
ナビゲーション部分に絶対パスの後にハッシュ(#)を記述している場合などです。
例) http://hogehoge.com#foo

解決方法

解決方法は2つ

  1. phpなどで条件分岐を使い、対象ページの場合はハッシュ以前を出力しないようにする
  2. スムーススクロールのコードを修正する

「1」の場合の解決方法が多くの場合は適当かと思いますが、
リンク先が多い場合などは修正箇所が多くなるので、避けたいこともあるかと思います。
そこで以下では「2」の場合の解決方法をご紹介したいと思います。

スムーススクロールのコードの修正方法について

下記はTECH ACADEMYさんで紹介されているスムーススクロールのコードです。
参照元

$(function(){
$('a[href^="#"]').click(function(){
var speed = 500;
var href= $(this).attr("href");
var target = $(href == "#" || href == "" ? 'html' : href);
var position = target.offset().top;
$("html, body").animate({scrollTop:position}, speed, "swing");
return false;
});
});

フルパスを含むページ内リンクの場合は何処が問題になるかというと、

$('a[href^="#"]').click(function(){

前半の方のここの部分で、ページ内リンクの対象となる
ハッシュを先頭に持つurlのリンクをクリックしたときに処理を行なうよ、
という感じの動きをするのですが、
今回のケースではリンク先のurlの先頭にハッシュが来ていないので、
上記の処理では対象にならないというのが原因です。
そのため、現在表示中のページをリンク先に持つアンカータグを
処理の対象に含めてあげるための記述をしてあげる必要があります。

修正したJSコード

修正のポイントは大まかに2点です。

  1. 全てのアンカータグを対象にすること
  2. 現在表示中のurlを取得して、リンクを整形すること

上記を踏まえて、修正したコードが下記になります。

$(function(){
// 全てのアンカータグを対象にする
$('a').click(function(e){
var anchor = $(this),
href = anchor.attr('href'),
pagename = window.location.href;
// 現在のurlのハッシュ以降を削除
pagename = pagename.replace(/#.*/,'');
// リンク先のurlから現在の表示中のurlを削除
href = href.replace( pagename , '' );
if( href.search(/^#/) >= 0 ){
// 整形したリンクがページ内リンクの場合はページ無いスクロールの対象とする
// 通常の遷移処理をキャンセル
e.preventDefault();
var speed = 500;
// 前段階で整形したhrefを使用する
// var href= $(this).attr("href");
var target = $(href == "#" || href == "" ? 'html' : href);
var position = target.offset().top;
$("html, body").animate({scrollTop:position}, speed, "swing");
// ロケーションバーの内容を書き換え
location.hash = href ;
return false;
}
});
});

また、上記のコードではおまけに
ロケーションバーをハッシュ付きに書き換える処理も行っています。
なお、このコードはリンクが絶対パスになっている場合には有効ですが、
相対リンクなどの場合には機能しないのでご注意くださいね!

お問い合わせ

    個人情報利用目的への同意

    ※このサイトはreCAPTCHAとGoogleによって保護されています。プライバシーポリシー利用規約が適用されます。
    ※お客様が入力した個人情報はSSL暗号化信号によって保護されています。

    個人情報の利用目的
    このお問い合わせフォームでご提供いただく個人情報は、お問合せ等に対する回答や資料送付、その他ご連絡のために利用します。
    当個人情報を第三者に提供することはありません。
    当個人情報の取扱いを委託することはありません。
    必要事項を全てご入力下さい。入力内容に不備がある場合は、ご返信しかねる場合がございます。
    内容により、お時間をいただく場合がございます。
    当個人情報の利用目的の通知、開示、内容の訂正・追加または削除、利用の停止・消去および第三者への提供の停止(「開示等」といいます。)を受け付けております。
    開示等の求めは、info@commono.co.jpで受け付けます。
    統計ツールやクッキー、ウェブビーコン等を用いてご利用状況を調査していますが、これによる個人情報の取得、利用は行っておりません。
    当社の個人情報保護に対する取り組みは「Privacy Policy」を必ずご確認ください。

    COMMONO株式会社
    E-mail:info@commono.co.jp
    個人情報保護方針、個人情報の取扱いについて
    PRIVACY POLICY

    現在準備中です

    お気に入り

    お気に入りから削除

    選択したアイテムをお気に入りから削除しますか?