iPhoneで2回目以降のアンカーリンクが動作しない問題を解決する方法

iPhoneで2回目以降のアンカーリンクが動作しない問題を解決する方法
JavaScript学習におすすめの書籍

Amazonの読み放題サービスKindle Unlimited無料体験キャンペーン実施中!

Amazon Kindle Unlimited 公式

ウェブサイトを作成していると、特にiPhoneでページ内のアンカーリンクが2回目以降正しく動作しないという問題に直面することがあります。この問題は、ページがキャッシュから読み込まれる場合や、JavaScriptによるスクロール動作が原因で発生することが多いです。この記事では、その解決方法をjQueryを使って解説します。

問題の概要

iPhoneでは、アンカーリンクを1度クリックすると正しく機能しますが、2回目以降に同じリンクをクリックしても、スクロールが正しく行われないことがあります。これにより、ユーザーがページ内の特定のセクションに飛べなくなってしまいます。

解決方法

この問題を解決するためには、ページが読み込まれた直後にスクロール位置をリセットし、JavaScriptでスクロール動作を制御する必要があります。特に、固定ヘッダーがある場合、その高さを考慮してスクロール位置を調整することが重要です。

コードの説明

以下は、jQueryを使った解決方法です。#header要素を固定ヘッダーに指定し、.main-visualクラスをヒーローセクションに使用しています。

JavaScript
$(document).ready(function() {
    var headerHeight = $('#header').outerHeight();
    var urlHash = location.hash;
    if(urlHash) {
        $('body,html').stop().scrollTop(0);
        setTimeout(function(){
            var target = $(urlHash);
            var position = target.offset().top - headerHeight;
            $('body,html').stop().animate({scrollTop:position}, 500);
        }, 100);
    }
    $('a[href^="#"]').click(function() {
        var href= $(this).attr("href");
        var target = $(href);
        var position = target.offset().top - headerHeight;
        $('body,html').stop().animate({scrollTop:position}, 500);
    });

    var _window = $(window),
        _header = $('#header'),
        mainVisualBottom,
        startPos,
        winScrollTop;

    _window.on('scroll', function() {
        winScrollTop = $(this).scrollTop();
        mainVisualBottom = $('.main-visual').height();
        if (winScrollTop >= startPos) {
            if(winScrollTop >= mainVisualBottom){
                _header.addClass('hide');
            }
        } else {
            _header.removeClass('hide');
        }
        startPos = winScrollTop;
    });

    _window.trigger('scroll');
});

コードのポイント

  1. ヘッダーの高さを考慮
    固定ヘッダーがある場合、その高さを考慮して、アンカーリンクの位置を調整しています。このコードでは、#header要素の高さを取得し、スクロール位置を計算しています。
  2. ページ読み込み後のスクロール処理
    ページ読み込み時に、URLにハッシュが含まれている場合(例: https://example.com/#section)、一旦スクロール位置を0にリセットし、数ミリ秒後に対象のセクションへスムーズにスクロールさせます。
  3. クリックイベントでのスクロール
    ページ内リンクをクリックした際、ターゲット要素まで滑らかにスクロールします。このときもヘッダーの高さを考慮してスクロール位置を調整します。
  4. スクロールイベントによるヘッダーの表示制御
    スクロール位置に応じて、ヘッダーの表示/非表示を切り替える機能を追加しています。これにより、より洗練されたユーザーインターフェースが実現します。

まとめ

この方法を使うことで、iPhoneでの2回目以降のアンカーリンクがうまく動作しない問題を解決できます。特に、固定ヘッダーがある場合にスクロール位置を調整することが重要です。このスクリプトを実装して、ユーザーに快適なナビゲーションを提供しましょう。

制作のご相談・ご依頼はこちらから!

Author

WARACRO(ワラクロ)

2018年に起業し、Webデザイナー・WebディレクターとしてWordPress案件を中心にWeb制作のお仕事をしています。
このブログでは、Webサイト制作に関する情報をお届けしています。

Webデザイン学習におすすめの講座
To Top