こんにちは。すずきです。
- webサイトにスムーススクロールを実装したい
- ヘッダーの高さ分、スムーススクロールの位置をずらしたい
- 他のページに移動する時もスムーススクロールで遷移したい
このような悩みに答えます。
スムーススクロールとは、ページ内の移動を滑らかにする動作のことです。
通常、ページ内でリンク移動があると即座にその位置へジャンプしますが、それではなんだか味気ないですよね。
またLPなど長いページの場合、即座に移動してしまうとどこに移動したのかわからなくなります。
この記事では、スムーススクロールの基本的な実装方法から、カスタマイズ方法まで解説します。
この記事を読むことで、簡単にスムーススクロールを実装することができ、ヘッダーの高さ分ずらす等カスタマイズ方法を理解することができます。
それでは早速解説していきます。
スムーススクロールの基本的な実装方法
スムーススクロールの実装は、jQueryを使用するのが一般的です。
jQueryを使用することで、簡潔なコードでスムーススクロールを実現することができます。
まずはjQueryを読み込みます。
下記のCDNを<body>
タグの直前に記述します。
<script src="https://code.jquery.com/jquery-3.7.0.min.js" integrity="sha256-2Pmvv0kuTBOenSvLm6bvfBSSHrUJ+3A7x6P5Ebd07/g=" crossorigin="anonymous"></script>
次にスムーススクロールの実装を行います。
スムーススクロールの実装は下記のコードで実装できます。
// ドキュメントが読み込まれた後に実行する関数を定義
$(document).ready(function(){
// ページ内リンク(href属性が"#"で始まるaタグ)がクリックされたときの動作を定義
$('a[href^="#"]').click(function(){
// スクロールの速度を400ミリ秒に設定
var speed = 400;
// クリックされたaタグのhref属性の値を取得
var href= $(this).attr("href");
// hrefの値が"#"または空文字の場合は'html'を、それ以外はhrefの値をターゲットとして設定
var target = $(href == "#" || href == "" ? 'html' : href);
// ターゲットの位置(上からの距離)を取得
var position = target.offset().top;
// スクロールアニメーションを実行。スクロール先の位置と速度、動きの種類('swing')を指定
$('body,html').animate({scrollTop:position}, speed, 'swing');
// aタグのデフォルトの動作(ページ遷移など)をキャンセル
return false;
});
});
上記のスクリプトでは、a[href^="#"]
というセレクタを使用して、ページ内リンク(アンカーリンク)をクリックした際の動作を定義しています。href
属性の値を取得し、そのIDを持つ要素(ターゲット)の位置までスクロールします。
その他細かい動作はコメントアウトで記述してあります。
スムーススクロールのカスタマイズ方法
スムーススクロールをさらに使いこなすためのカスタマイズ方法を紹介します。
追従ヘッダーの高さ分、スクロール位置を調整
追従ヘッダーがある場合、スクロール位置をヘッダーの高さ分だけずらした方が親切です。
遷移後のコンテンツでヘッダーが邪魔で見えない場合があるからです。
ヘッダーの高さ分スクロール位置をずらす場合、以下のコードで実装できます。
$(document).ready(function(){
$('a[href^="#"]').click(function(){
var speed = 400; // スクロールの速度(ミリ秒)
var href= $(this).attr("href");
var target = $(href == "#" || href == "" ? 'html' : href);
// ヘッダーの高さを取得
var headerHeight = $('.header').outerHeight();
// スクロール先の位置からヘッダーの高さ分だけずらす
var position = target.offset().top - headerHeight;
$('body,html').animate({scrollTop:position}, speed, 'swing');
return false;
});
});
<header>
にはclass=”header”を付与してください。
必要に応じてclass名は適宜変更してください。
コメントアウトでも解説していますが、ヘッダーの高さを取得し、その分スクロール位置をずらしています。
他ページからの遷移時のスムーススクロールの実装
他のページから特定のセクションにリンクして遷移した際にもスムーススクロールを適用するには、ページが読み込まれた際にURLにハッシュ(#
)が含まれているかを確認し、含まれている場合にスムーススクロールを実行します。
具体的なコードは以下になります。
$(document).ready(function(){
$('a[href^="#"]').click(function(){
var speed = 400;
var href= $(this).attr("href");
var target = $(href == "#" || href == "" ? 'html' : href);
var headerHeight = $('header').outerHeight();
var position = target.offset().top - headerHeight;
$('body,html').animate({scrollTop:position}, speed, 'swing');
return false;
});
// 他ページからの遷移時のスムーススクロール
// URLにハッシュ(#)が含まれているかを確認
if (location.hash) {
// 微小な遅延(1ミリ秒)を持たせて、以下の関数を実行
setTimeout(function(){
// URLのハッシュを元にターゲットの要素を取得
var target = $(location.hash);
// ターゲットが存在する場合のみ以下の処理を実行
if (target.length) {
// ヘッダーの高さを取得
var headerHeight = $('header').outerHeight();
// ターゲットの位置(上からの距離)からヘッダーの高さを引いた位置を取得
var position = target.offset().top - headerHeight;
// スクロールアニメーションを実行。スクロール先の位置と速度、動きの種類('swing')を指定
$('body,html').animate({scrollTop:position}, speed, 'swing');
}
}, 1);
}
});
これで、URLにハッシュ(#
)が含まれている場合は条件分岐し、スムーススクロールで移動するようになります。
スムーススクロールのメリット
スムーススクロールを実装することで、下記のメリットがあります。
- ユーザーエクスペリエンスの向上
スムーススクロールは、ユーザーにとって非常に直感的な動きです。滑らかなスクロールは、ユーザーがページ内での移動を自然に感じることを助け、情報の探索をより快適にします。また、瞬時のジャンプ移動よりも、どの部分を通過しているのかが視覚的にわかりやすくなります。 - ページの見た目と動きの洗練
デザインの観点からも、スムーススクロールはページ全体の印象を洗練されたものにします。アニメーション効果は、サイトのプロフェッショナルさやモダンさを強調する要素として機能します。 - ナビゲーションの効率化
長いページや多くのコンテンツが含まれるページでは、ユーザーが求める情報を迅速に探し出すことが重要です。スムーススクロールを組み合わせたナビゲーションは、ユーザーが目的のセクションへ迅速かつ効率的に移動する手助けをします。
おわりに
スムーススクロールの基本的な実装方法と、カスタマイズ方法について解説しました。
スムーススクロールは、ウェブサイトの操作性やデザイン性を向上させるための非常に効果的な手段です。ユーザーがサイト内での移動をスムーズに感じることで、サイト全体のユーザビリティが向上します。
コーディングの学び初めの方も、今回の解説を参考にしてスムーススクロールの実装に挑戦してみてください。初めての挑戦は難しく感じるかもしれませんが、一歩一歩進めていくことで、より魅力的なウェブサイトを作成することができるようになります。コーディングの世界は広く、無限の可能性が広がっています。今後も新しい技術や方法に挑戦し、自分のスキルを磨いていきましょう!