1.スムーススクロール表示したいコンテンツのIDをリンクへ設定する。普通は、表示したいコンテンツにはIDを付与し(いわゆるアンカー)、そのアンカー名に”#”を付けてa要素のhref属性へリンクとして指定します。
しかし、この方法では当該コンテンツはページ遷移先で表示されますが、スムーススクロールはされません。JSで処理する前にブラウザが当該コンテンツを表示してしまうためです。※JSでリセットして無理やりスクロールさせる方法もあります。が、あまり意味がないので別の機会に紹介します。
というわけで、このアンカー名をJSが取得できるように他の方法で記述します。
ひとつの方法として、引数にキーと値のセットを設定します。
HTMLには、遷移先のHTML名と?の後に引数のセットを設定します。キー名を仮に”scrollto”とします。
HTMLは下記のようになります。
<a href="./?scrollto=cl2">別ページでもスムーススクロール</a>
2.当該コンテンツを含むページを表示する時、どのコンテンツをスムーススクロールさせるのかリクエストを取得する。今度は当該コンテンツを含むページの処理です。
大事なことは、スムースススロールさせたいコンテンツを含むページを起動させる時、他ページからのリクエストがあるのかないのかを必ずチェックする必要がるということです。
●getPrmモジュール
下記コードでURLに引数があるかないかを判定します。
const getPrm = (key, url = location.href) => {
try {
return new URL(url).searchParams.get(key);
} catch {
return null;
}
};
export {getPrm};
URLから必要なキーの値を取得する欲しい引数のパラメータscrolltoをgetPrmモジュールへ設定します。
するとscrolltoの値(この場合は"cl2")がリクエストとして取得されます。
const prm= getPrm('scrollto');//prm: cl2
3.取得したIDのコンテンツをスムーススクロールさせる。取得したリクエストのIDがページ内のコンテンツIDに該当するかを判定し、あればその要素のY座標を取得し、その座標までスクロールさせます。
//orderはリクエストされたID値
//Yはスクロールすべき値
//サンプルはターゲット要素の高さだけを計算してますが、状況に応じてヘッダの高さとか現在のYスクロール値とかも計算する必要があります。
const target= document.getElementById(order);
const Y = Math.round(target.getBoundingClientRect().top) ;
スクロールさせる上記で取得したY値を下記の式のHへ代入するとスムーススクロールします。
window.scroll( {top: H, behavior: 'smooth'});