JQueriy スムーススクロールと Bootstrap との共存

JQueriy スムーススクロールと Bootstrap との共存

JQuery でページ内リンクなどの場面でスムーススクロールを実現しようとする場合は、一般的には以下のようなコードを書きます。

$(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^=”#”] のクリックイベントが、Bootstrap での一部書式とバッティングしてしまい、Bootstrap 側の機能が動作しないことがあります。

ー例として、Collaspe や Modal、Tab なんかが動かなくなります。

<a class="btn btn-primary" data-toggle="collapse" href="#collapseExample" role="button" aria-expanded="false" aria-controls="collapseExample">Link with href</a>

<div class="collapse" id="collapseExample">
  <div class="card card-body">
    Anim pariatur cliche reprehenderit,
    enim eiusmod high life accusamus terry richardson ad squid.
  </div>
</div>

上記が Collaspe の際のサンプルコードですが、href 箇所の “#collapseExample” が先ほどの JQuery 側のa[href^=”#”] と競合してしまうのです。

これを回避するには、スムーススクロール設定側のコードで、Bootstrap の特定の書式を例外指定してあげれば共存可能になります。

$(function(){
   $('a[href^="#"]').not(".dropdown-toggle,[data-toggle='modal'],[data-toggle='collapse'],[data-toggle='tab']").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;
   });
 });

以上の .not(“.dropdown-toggle,[data-toggle=’modal’],[data-toggle=’collapse’],[data-toggle=’tab’]”) という箇所が例外を定義している箇所です。

A タグの中に、[data-toggle=’modal’] という文字や [data-toggle=’collapse’] などの文字がある場合は、not、処理しないよ、という命令を追加しています。

これで bootstrap とスムーススクロールが共存できるようになります。