ページの右下に固定で要素を配置
まずは、HTMLを以下のように準備。このサイトの右下に出てくるボタンの要素で、WordPressで作っているので、footer.phpファイル内に記述してます。
<div id="move-to-the-top" class="move-to-the-top"> <span class="dashicons dashicons-arrow-up-alt2"></span> </div>
配置はCSSで対象になる要素をページの右下固定で設定します。このあたりはお好みで。
.move-to-the-top { background: #444444; border-radius: 25px; bottom: 20px; color: #ffffff; cursor: pointer; height: 50px; position: fixed; right: 20px; width: 50px; z-index: 9999; } .move-to-the-top span { align-items: center; display: flex; height: 50px; justify-content: center; width: 50px; }
id属性の設定はJavaScriptのイベントトリガーとして使用します。
タッチイベントによるイベントトリガーの分岐
ボタンのイベントトリガーはクリックになりますが、スマートフォンなどのように画面をタッチするデバイスにはTouch event(タッチイベント)を持っています。クリックより先に動作が始まるので、クリックイベントでも動かなくはないですが一瞬遅延します。ですので、タッチイベントに対応しているデバイス(ブラウザ)であればタッチイベントをイベントトリガーにし、そうでなければクリックイベントで実装します。
;(function($) { "use strict"; $(function() { var event = "ontouchend" in window ? "touchend" : "click", elmMove = $("#move-to-the-top"); }); })(jQuery);
id属性を指定したターゲット要素を変数に保持しておきます。
ページのトップまでスクロール移動させる
要素がクリック(タップ)されたらjQueryのanimateを使用して、ページのトップまでスクロールを移動させます。以下の通り(8〜11行目)イベントを追加しました。
;(function($) { "use strict"; $(function() { var event = "ontouchend" in window ? "touchend" : "click", elmMove = $("#move-to-the-top"); elmMove.on(event, function(e) { e.preventDefault(); $('html, body').animate({scrollTop: 0}, 500); }); }); })(jQuery);
9行目:クリック(タッチ)イベントに対して、preventDefaultを実行しています。もし対象がa要素やbutton要素だったりした場合、イベントが発火してしまうのでイベントをキャンセルさせます。(特にa要素はhref属性の指定先に遷移してしまいます)
10行目:ページのスクロール値(この場合、縦スクロール値)を持っているhtml要素とbody要素のスクロールの値を0(トップ)に500ミリ秒で戻す処理を書いています。これでクリック(タップ)すれば、500ミリ秒でページのトップまで移動してくれます。
プラグイン化してスクロールのスピードを自由に
jQueryプラグインの作り方をベースにこの処理をプラグイン化。
;(function($){ $.fn.topMove = function(options){ var defaults = { "speed": 500 }; var settings = $.extend( {}, defaults, options ), event = "ontouchend" in window ? "touchend" : "click"; return this.each(function(){ $(this).on(event, function(e) { e.preventDefault(); $('html, body').animate({scrollTop: 0}, settings.speed); }); }); }; }(jQuery));
デフォルト値としてspeedパラメータを500(ミリ秒)に設定しておきます。これをHTMLファイル側で引数を渡してコールします。
$(function(){ $("#move-to-the-top").topMove({speed: 1000}); });
できた!\(^o^)/完成〜!
アレンジ:スクロールが一定の位置まで移動したら表示
とりあえず完成したのですが、少々アレンジを。右下固定で表示しているのですが、ずっと出たままになっているのでスクロールの位置がある程度下がったら表示するようにしてみます。
;(function($){ $.fn.topMove = function(options){ var defaults = { "speed" : 500, "scroll" : 300 }; var settings = $.extend( {}, defaults, options ), event = "ontouchend" in window ? "touchend" : "click"; return this.each(function(){ var self = $(this); self.hide(); self.on(event, function(e) { e.preventDefault(); $('html, body').animate({scrollTop: 0}, settings.speed); }); $(window).on('scroll', function () { if ($(this).scrollTop() > settings.scroll) { self.not(":animated").fadeIn(); } else { self.not(":animated").fadeOut(); } }); }); }; }(jQuery));
- 5行目 – scrollがどこまで下がったら表示するかの初期値(300px)
- 13行目 – 要素を最初は非表示にしておく
- 20〜26行目 – windowのscrollイベントトリガーで、スクロール位置がパラメータの値を越えたらfadeInするように設定
アレンジ完成!\(^o^)/
パラメータを増やしてフェードのスピードだったり、アニメーションの種類だったり、色々増やしてみても良いかも。
- jQuery-Plugin
- Author : Kazuya Takami
- Repository URL : https://github.com/miiitaka/jQuery-Plugin
参考サイト
- HTML5ROCKS: マルチタッチ ウェブ開発
- https://www.html5rocks.com/ja/mobile/touch/