web制作のしおり

日々の学習をアウトプットします。

27.jQuery実践課題② ~調べながら実装する~

昨日に引き続きjQueryの実践課題②と言うことで、

 

ページトップへ戻るボタンを付ける

 

をやっていきたいと思います。

 

実装の条件

  • トップから80pxスクロールしたら
  • 300ms(0.3秒)かけて
  • フェードイン・フェードアウトで表示
  • 表示してる間はボタンはページ右下に固定
  • ボタンを押したら500ms(0.5秒)かけてページトップへ戻る

 

細かい処理を除けば、

ページの頭から下にスクロールすると、

ボタンが現れて、ボタンをクリックするとページの頭に移動する。

そういうボタンを作っていきます。

 

ボタンをHTMLで作成する

ブロック要素のpタグを使って作成します。

    <p id="page-top">上へ戻る</p>

 

pタグにCSSを指定する為に、idを設定します。

今回のHTMLはこれだけです。

 

jQueryで動きをつける

まずはコードから

$(function(){
    const pagetop = $('#page-top');
    $(window).scroll(function () {
       if ($(this).scrollTop() > 80) {
            pagetop.fadeIn(300);
       } else {
            pagetop.fadeOut(300);
       }
    });
    pagetop.click(function () {
       $('body, html').animate({ scrollTop: 0 }, 500);
     return false;
    });
  });

 

この後、一つずつ確認していきましょう。

 

バラして内容を確認する

const pagetop =$('#page-top');

まずはidにpage-topが設定されている要素を取得してpagetop変数に代入します。

 

 

$(window).scroll(function(){}})

windowのスクロールを監視して、スクロールされたら

引数に設定されているメソッドが実行されます。

 

 

 if ($(this).scrollTop() > 80){
     pagetop.fadeIn(300);

}

else {

    pagetop.fadeOut(300);

}

scrollTop()メソッドはブラウザのスクロール量を取得します。

ここでのthisはscrollイベントが発生した要素のwindowを指しています。

なので、

もし、スクロール量が80を超えるなら、

pagetop.fadeIn();

そうでなければ

pagetop.fadeOut();

が実行されます。

 

 

pagetop.fadeIn(300);

pagetop.fadeOut(300);

fadeIn()メソッドとfadeOut()メソッドは、

CSSのdisplayプロパティの値に従って動作が変化します。

fadeInはdisplay:noneの時、引数(ミリ秒)に従って徐々に表示されます。

fadeOutはその逆でdisplayがnoneでない時に、引数(ミリ秒)に従って徐々に非表示になります。

 

ここまでで、実装条件の3つ

  • トップから80pxスクロールしたら
  • 300ms(0.3秒)かけて
  • フェードイン・フェードアウトで表示

を達成できました。

引き続き見ていきましょう。

 

ボタンがクリックされたら処理を実行する

pagetop.click(function () {    });

id属性にpage-topが設定されている要素のクリックを監視し、

クリックされたら引数内部の関数が実行されます。

 

 

$('body, html').animate({ scrollTop: 0 }, 500);
body,htmlの2つの要素に対して、スクロール量が0になるように500ミリ秒の時間を掛けて移動します。

 

return false;

これを書くと、これ以降のメソッド内の処理は行われません。

 

これで実装条件

  • ボタンを押したら500ms(0.5秒)かけてページトップへ戻る

が達成です。

jQueryで何をやっているか整理する

$(function(){
    const pagetop = $('#page-top');
    $(window).scroll(function () {
       if ($(this).scrollTop() > 80) {
            pagetop.fadeIn(300);
       } else {
            pagetop.fadeOut(300);
       }
    });
    pagetop.click(function () {
       $('body, html').animate({ scrollTop: 0 }, 500);
     return false;
    });
  });

 

jQueryコードで行っている事を整理すると、

windowがスクロールされる度に、スクロール量が80を超えるか判定し、

80を超える場合はid属性がpage-topの要素を0.3秒かけて表示させ、

80以下の場合はid属性がpagetopの要素を0.3秒かけて非表示にする。

 

また、表示されたid属性がpage-topの要素がクリックされたら、スクロール量が0になるように500ミリ秒をかけてスクロールします。

 

最後にボタンの位置を右下に固定する

残りはデザイン部分なので、CSSの記述ですね。

 

必要最低限の量を書くと下記のようになります。

 

#page-top{

   position : fixed:

   bottom : 30px;

   right : 30px;

   z-index : 99;

}

 

position : fixed;で常に位置を固定

画面の下から30px

画面の右から30px

そして、全ての要素の上になるようにz-index を99

にしています。

 

これで、実装条件

  • 表示してる間はボタンはページ右下に固定

が達成されました。

 

全ての実装条件を満たしたので、

後はデザインを調整して、体裁を整えれば完成ですね。

 

今日のまとめ

  • $('window').scroll()でスクロールイベントを監視できる
  • スクロール量を判定に使って、ボタンの表示・非表示を切り替えられる
  • 「スクロール量を0にする」という処理でページの先頭に移動できる
  • ボタンの固定はcssで行う(position:fixedとz-indexを使う)

 

本日はスクロールボタンの実装の課題に取り組みました。

この他にも色々な実装の仕方がありそうですね。

 

では、また。