【jQuery】「ページトップへ戻る」ボタンを作りながら、jQueryの基礎を学ぶ
公開日 : 最終更新日 :
- コーディング
今回は、Webページによくある、一定以上スクロールするとボタンがふわっと表示され、そのボタンをクリックするとページ上部にスムーズに戻るといった処理を使って、jQueryを詳しく紐解いていきます。
今回ご紹介しているコードは、コピペで動きます。
ただ、「なぜ動いているのか」「どういう処理が行われているのか」をいまいち理解できていない方もいると思います。今回はそんな方への参考になれば幸いです。
早速見ていきましょう!
目次
今回のコード
まず、今回のご紹介&解説するコード全体がこちら。
※jQuery自体の読み込みなどは省いています。
<body> <div id="js-pagetop"> <span>Top of Page</span> </div> </body>
body{ height: 3000px; } #js-pagetop { position: fixed; width: 100px; height: 100px; border-radius: 8px; background: #f99900; color: #fff; bottom: 50px; right: 50px; cursor: pointer; } #js-pagetop span { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); display: block; width: 100%; text-align: center; font-size: 14px; }
$(function () { var pagetop = $('#js-pagetop'); pagetop.hide(); $(window).scroll(function () { if ($(this).scrollTop() > 500) { pagetop.fadeIn(); } else { pagetop.fadeOut(); } }); pagetop.click(function () { $('body, html').animate({ scrollTop: 0 }, 500); return false; }); });
Coedpenも用意しておきました。
See the Pen
by yuya tanaka (@y_tanaka)
on CodePen.
前半 要素の表示・非表示処理
まずは、コードの前半を詳しく見ていきます。
最初に、全てを囲っている記述。
$(function () { //ここにjqueryの処理を記述 });
この書き方、実は省略型です。
一般的には省略して書きますが、何も省略しない場合は、下記の記述になります。
jQuery(document).ready(function(){ //ここにjqueryの処理を記述 });
中身を詳しく見てみます。
- jQuery = 省略記号。($はダラーと呼びます)
- document = HTMLの読み込み
- ready = 準備
ようは、HTMLの読み込みがすべて終えたら、{ }内の処理を開始するという意味。
注意点として、サイトファイルの読み込みはの順番は、HTML→CSS→JSが基本ですが、この書き方の場合、まだ読み込まれていないHTML要素をjQueryで指定しても動きません。
(Top of Page要素
よりも前にjQueryの処理記述をしているとか。)
注意しましょう。
変数
var pagetop = $('#js-pagetop');
var 変数名 = $('要素');
これは、「pagetop」という名前のついた箱に、id要素を入れるという意味です。(class要素も入れることができます。)
ちなみに、今回の場合の要素は下記です。
<div id="js-pagetop"><span>Top of Page</span></div>
まず、最初にある「var」。
こちらは「変数」と呼ばれ、「私は、pagetopという名前の箱を作ります!」という宣言です。
また、jQueryの「=」はイコール(等しい)ではなく、「代入」という意味になります。
そのため、全体の意味としては、「私は、pagetopという名前の箱を作って、そこにjs-pagetop要素を入れます!」という宣言です。
ちなみに、なぜわざわざ箱に入れているのかというと、見やすさ、処理の早さ、変更のしやすさなど、いろいろな理由があります。
例えば、もし宣言を使わない場合、下記になります。
$(function () { $('#js-pagetop').hide(); $(window).scroll(function () { if ($(this).scrollTop() > 500) { $('#js-pagetop').fadeIn(); } else { $('#js-pagetop').fadeOut(); } }); $('#js-pagetop').click(function () { $('body, html').animate({ scrollTop: 0 }, 500); return false; }); });
HTMLから4回もjs-pagetop要素を呼び出すしていますね。
また、id名を「#js-pagetop」から「#js-top」へ変更したいとなった場合、4箇所の修正が必要になります。
そのため、一つの処理の中に何回も出てくるid属性やclass属性がある場合は、宣言しちゃいましょう。
hideメソッド
pagetop.hide();
これは、pagetop箱を隠すという意味。
ここで出てきている「hide()」は、hideメソットと呼ばれ、cssで言う「display none」と同じ意味です。
これにより、HTMLを読み込んだらjs-pagetop要素を隠します。その後、以下の処理によって、表示・非表示を繰り返します。
画面をscrollした際の処理
$(window).scroll(function () { // 処理 });
こちらはそのまま、window(画面)をスクロールした時に{ }内の処理が実行されるという記述です。
if else文
if ($(this).scrollTop() > 500) { pagetop.fadeIn(); } else { pagetop.fadeOut(); }
こちらは、if else構文です。
もし◯◯なら、そうでなければ〇〇という意味。
今回の場合、もし、スクロールの値が500以上だったらjs-pagetop要素をフェードインで表示。それ以外(スクロールの値が500以下)だったら、js-pagetop要素をフェードアウトで非表示にという意味です。
1行目にある「this」については、window要素を指しています。
「scrollTop()」は、スクロールした時のスクロール数値(px)を自動で取得してくれます。また「Top」とあるように、ページ最上部を起点にスクロール量を測ります。
つまり、「ページ最上部から見て、何pxスクロールされたか」というのがわかります。
ここまでのおさらい
ここまでをおさらいしておきます。
pagetop.hide(); $(window).scroll(function () { if ($(this).scrollTop() > 500) { pagetop.fadeIn(); } else { pagetop.fadeOut(); } });
- js-pagetop要素を隠しておく。
- windowがスクロールされはじめたら、どのくらいスクロールされているかを測る。
- スクロールの値が500以上だったら、js-pagetop要素をフェードインで表示する。
- スクロールの値が500以下だったら、js-pagetop要素をフェードアウトで非表示にする。
後半のクリック処理
後半戦です。
後半では、page topボタンが表示された後、ボタンを「クリック」したらどういう処理をするのかを解説していきます。
この処理のコード全体像は下記。
pagetop.click(function () { $('body, html').animate({ scrollTop: 0 }, 500); return false; });
詳しく見ていきましょう。
clickイベント
pagetop.click(function () { //ここに処理を記述 });
こちらは、「js-pagetop要素がクリックされたら〇〇する」という意味の記述です。
clickイベント処理の中身を見ていきましょう。
$('body, html').animate({ scrollTop: 0 }, 500); return false;
こちらの大まかな意味としては、0pxの位置(ページの最上部)まで、0.5秒かけて移動するという処理内容です。
animateメソッド
まず、1行目のanimate()については、アニメーション(動き)を実現してくれるメソッドです。
$('要素名').animate({ 動かすプロパティ : 目的地点の数値 }, どれくらいで動かすか);
今回の動かすプロパティはscrollTopですが、CSSを制御するほうがわかりやすいかもしれません。
例えばこういうの。
<div id="wrap"> <div id="box"></div> </div>
#wrap { position: relative; } #box { position: absolute; top: 0; left: 0; }
$('#box').animate({ 'left': '300px', }, 500);
上記だと、boxが左上にある状態から、0.5秒かけて右に300px動かすという内容です。
animateメソッドについて詳しくは、下記おすすめの記事です。
jQueryのanimateで自由にアニメーションできるようになろう
また、2行目にあるscrollTopは、ページの最上部(=上から0px部分)を表すプロパティです。
return false
4行目の「return false;」ですが、今回のjs-pagetop要素のクリックイベントを、親要素に伝搬させない(何も返さない)という記述になります。
JavaScriptやjQueryには、要素で発火した(行われた)処理内容は、その全ての親要素に伝播していく性質があります。これをバブリングと呼びます。
今回の場合、body
直下にjs-pagetop要素をおいているため、body要素に伝搬することになります。特に影響はないのですが、これらを制御する必要がでてくる場合もあるため、基本的には記述をしておきます。
バブリングについて詳しく知りたい方は下記おすすめです。
【JavaScript】return falseの意味について総まとめ。コード付で解説
おさらい
おさらいすると
pagetop.click(function () { $('body, html').animate({ scrollTop: 0 }, 500); return false; });
js-pagetop要素がクリックされたら、0.5秒かけてページの一番上に戻る、という処理が行われています。
まとめ
以上、スクロールするとページトップへ戻るボタンを用いたjQuery講座でした。
普段、コピぺマンになっている方がいたら、これを機会に研究してみてはいかがでしょうか?