勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ。

アンカーリンクでURLに「#hoge」のようなパラメータを残さずスクロールさせる方法

  jQuery JavaScript

アンカータグをクリックしてもブラウザのURL欄に「#hoge」のようなハッシュを残さずに指定の要素までスクロールできるというコーディングデータがあった。しかも他ページからハッシュ付きのURLで遷移してきてもスクロール後にハッシュが消えるような挙動を取っており、どういう手段なのか気になったのでメモ。

 

サンプル

https://taitan916.info/sample/anchor_link/

 

ソースコード

<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>アンカータグでスクロールテスト</title>
</head>
<body>
    <a href="#test1">test1</a>
    <a href="#test2">test2</a>
    <a href="#test3">test3</a>
    <div style="background-color: #f00; height: 1000px;" id="test1"></div>
    <div style="background-color: #0f0; height: 1000px;" id="test2"></div>
    <div style="background-color: #00f; height: 1000px;" id="test3"></div>
    <script type="text/javascript" src="https://code.jquery.com/jquery-3.5.1.js"></script>
    <script type="text/javascript">
    $(function(){

        const hash = decodeURI(location.hash);
        if(hash){
            $("html, body").animate({scrollTop:$(hash).offset().top});
            window.history.replaceState(null, '', window.location.pathname + window.location.search);
        }

        $('a[href^="#"]').click(function(){
            const href= $(this).attr("href");
            const target = $(href == "#" || href == "" ? 'html' : href);
            $("html, body").animate({scrollTop:target.offset().top});
            window.history.replaceState(null, '', window.location.pathname + window.location.search);
            return false;
        });
    });
    </script>
</body>
</html>

他ページから遷移してきた際は「if(hash){」のところで、リンクをクリックした際は「$('a[href^="#"]').click(function(){」で検知しスクロールした後にpushStateでハッシュを削除している。尚、ハッシュは特に削除しなくてもいい場合は以下の形でOK。

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

 

所感

URLはできるだけシンプルな方が良い派なので今後も使っていきたいところ。

 - jQuery JavaScript

  関連記事

ラジオボタンのカスタムデータ属性を取得し、特定の値の場合はチェックさせない方法
ラジオボタンのカスタムデータ属性を取得し、特定の値の場合はチェックさせない方法

ASPを使用したサイトで特定のradioボタンは選択不可にしたいというケースがあ ...

adblock(広告削除)設定している場合はページを表示させない
adblock(広告削除)設定している場合はページを表示させない

iPhoneのSleipnirでネットをしていると「広告がブロックされたのでペー ...

要素の表示or非表示
要素の表示or非表示

今まで要素の表示or非表示をCSSで操作する際、 display:none; / ...

jQueryでshow/hideよりaddClass/removeClassの方が速い
jQueryでshow/hideよりaddClass/removeClassの方が速い

diaplay:none/blockする際に最近はshow()/hide()を ...

日付の範囲指定用プラグイン「DateRangePicker」の利用方法
日付の範囲指定用プラグイン「DateRangePicker」の利用方法

日付型のデータを検索する際に開始・終了日のテキストボックスを用意し、それぞれにタ ...