JavaScriptで学ぶ! スムーズスクロールの基礎知識と実装方法
スムーズスクロールで特定のdiv要素に移動する (JavaScript、jQuery)
Webページにおいて、ユーザーが長いページを閲覧する際、特定のセクションにスムーズに移動できる機能は、ユーザーエクスペリエンスを向上させる上で重要です。
方法
従来、JavaScriptを用いてスクロール制御を行う場合、window.scrollTo()
やelement.scrollIntoView()
などのメソッドを使用していました。しかし、これらのメソッドは、突然ページが移動してしまうため、ユーザーにとって違和感を与えてしまう可能性がありました。
そこで、近年では、ユーザー体験を向上させるために、スムーススクロールと呼ばれる手法が広く採用されています。スムーススクロールは、アニメーションを用いて、ページを滑らかに移動させる手法です。
jQueryによるスムーススクロールの実装
jQueryライブラリを使用すると、スムーススクロールを簡単に実装できます。以下は、jQueryを用いて特定のdiv要素にスムーススクロールする例です。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>スムーススクロール</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<header>
<h1>見出し</h1>
</header>
<section id="section1">
<h2>セクション1</h2>
<p>コンテンツ1</p>
</section>
<section id="section2">
<h2>セクション2</h2>
<p>コンテンツ2</p>
</section>
<section id="section3">
<h2>セクション3</h2>
<p>コンテンツ3</p>
</section>
<footer>
<p>© 2024</p>
</footer>
<script src="script.js"></script>
</body>
</html>
$(document).ready(function() {
$('a[href^="#"]').on('click', function(event) {
event.preventDefault();
var target = $(this).attr('href');
$('html, body').animate({
scrollTop: $(target).offset().top
}, 1000);
});
});
解説
上記のコードでは、以下のような処理が行われています。
$(document).ready(function() {
で、DOMが読み込まれた後に処理を実行する関数を定義します。$('a[href^="#"]').on('click', function(event) {
で、ハッシュ記号(#)で始まるURLを持つすべてのa要素(アンカー要素)に対して、クリックイベントを設定します。event.preventDefault();
で、デフォルトのリンク動作(ページ遷移)を抑制します。var target = $(this).attr('href');
で、クリックされたa要素のhref属性値を取得し、target
変数に格納します。$('html, body').animate({ scrollTop: $(target).offset().top }, 1000);
で、jQueryのanimateメソッドを用いて、html
要素とbody
要素のscrollTopプロパティを、target
要素のオフセットトップ値までアニメーションで移動させます。
補足
- スムーススクロールの速度は、
1000
を任意の値に変更することで調整できます。 - スムーススクロールのアニメーション効果は、
swing
以外にもeaseInOutCubic
など様々な種類を設定できます。 - スムーススクロールを実装する際は、ページの高さがコンテンツよりも低い場合に、意図しない挙動が発生しないよう注意する必要があります。
スムーズスクロール実装のためのサンプルコード
HTML
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>スムーススクロール</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<header>
<h1>見出し</h1>
</header>
<section id="section1">
<h2>セクション1</h2>
<p>コンテンツ1</p>
<a href="#section2">セクション2へ移動</a>
</section>
<section id="section2">
<h2>セクション2</h2>
<p>コンテンツ2</p>
<a href="#section3">セクション3へ移動</a>
</section>
<section id="section3">
<h2>セクション3</h2>
<p>コンテンツ3</p>
<a href="#section1">セクション1へ戻る</a>
</section>
<footer>
<p>© 2024</p>
</footer>
<script src="script.js"></script>
</body>
</html>
JavaScript
$(document).ready(function() {
$('a[href^="#"]').on('click', function(event) {
event.preventDefault();
var target = $(this).attr('href');
$('html, body').animate({
scrollTop: $(target).offset().top
}, 1000);
});
});
CSS
/* style.css */
body {
font-family: sans-serif;
}
header {
background-color: #f0f0f0;
padding: 20px;
}
section {
padding: 20px;
border-bottom: 1px solid #ccc;
}
a {
text-decoration: none;
color: #007bff;
}
説明
- 各セクションには
id
属性が設定されています。 - セクション内には、次のセクションへ移動するためのリンクが用意されています。
- リンクの
href
属性には、移動先のセクションのid
を指定しています。
- スタイルは任意に設定できます。
このサンプルコードをどのように使用できますか?
- 上記のコードを HTML、JavaScript、CSS ファイルに保存します。
- HTML ファイルを Web ブラウザで開きます。
- 各セクション内のリンクをクリックすると、そのセクションへスムーススクロールします。
スムーススクロールを実装するその他の方法
jQuery を使用せずに、JavaScript のみでスムーススクロールを実装することも可能です。以下のコードは、その例です。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>スムーススクロール</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<header>
<h1>見出し</h1>
</header>
<section id="section1">
<h2>セクション1</h2>
<p>コンテンツ1</p>
<a href="#section2">セクション2へ移動</a>
</section>
<section id="section2">
<h2>セクション2</h2>
<p>コンテンツ2</p>
<a href="#section3">セクション3へ移動</a>
</section>
<section id="section3">
<h2>セクション3</h2>
<p>コンテンツ3</p>
<a href="#section1">セクション1へ戻る</a>
</section>
<footer>
<p>© 2024</p>
</footer>
<script src="script.js"></script>
</body>
</html>
document.addEventListener('DOMContentLoaded', function() {
const links = document.querySelectorAll('a[href^="#"]');
for (const link of links) {
link.addEventListener('click', function(event) {
event.preventDefault();
const target = document.querySelector(this.getAttribute('href'));
const targetPosition = target.offsetTop;
const scrollAnimation = new Animation({
duration: 1000,
timingFunction: 'easeInOutCubic',
update: function(progress) {
window.scrollTo(0, targetPosition * progress);
}
});
scrollAnimation.play();
});
}
});
document.addEventListener('DOMContentLoaded', function() {
で、DOM が読み込まれた後に処理を実行する関数を定義します。const links = document.querySelectorAll('a[href^="#"]');
で、ハッシュ記号(#) で始まる URL を持つすべての a 要素を取得します。for (const link of links) {
で、取得した a 要素に対してループ処理を行います。link.addEventListener('click', function(event) {
で、各 a 要素に対してクリックイベントを設定します。const targetPosition = target.offsetTop;
で、target
要素のオフセットトップ値を取得し、targetPosition
変数に格納します。const scrollAnimation = new Animation({
で、Animation オブジェクトを生成します。duration: 1000
で、アニメーションの再生時間を 1 秒に設定します。timingFunction: 'easeInOutCubic'
で、アニメーションのタイミング関数をeaseInOutCubic
に設定します。update: function(progress) {
で、アニメーションの更新時に実行される関数を定義します。window.scrollTo(0, targetPosition * progress);
で、ウィンドウをtarget
要素のオフセットトップ値までスムーススクロールします。}}
);` で、Animation オブジェクトの定義を終了します。scrollAnimation.play();
で、アニメーションを再生します。
この方法の利点
- jQuery を必要としないため、軽量なコードで実装できます。
- jQuery を使用する場合と比べて、コードが複雑になる可能性があります。
- 古いブラウザでは、スムーススクロールが正しく動作しない場合があります。
- ページ内スムーススクロール以外にも、ページトップへスムーススクロールや、特定の要素までスムーススクロールするなど、様々な方法でスムーススクロールを実装できます。
- スムーススクロールを実装する際は、ユーザー体験
javascript jquery scroll