初心者でも分かる!jQuery「TOPへ戻るボタン」の作り方
- 更新日: [更新履歴]
- 公開日:
スクロールすると右下にスーっと出てくるページトップへの移動ボタン。あれってとても便利ですよね。今回はこの「TOPへ戻るボタンの作成方法」を、JavaScript初心者でも理解できるように解説します。
制作方法
ここからは、「TOPに戻るボタン」の具体的な制作方法について、説明していきます。
ボタンを用意する
まず必要となるのが、右下に出現するページトップへ移動するためのボタンです。HTMLとスタイルシートで、簡単に作っておきましょう。下記はサンプルです。クリックしても何も起こりません。
div
タグ)にはpage-top
、矢印を囲むa
タグにはm
ove-page-top
というid
属性値を付けており、これらは後ほど、JavaScriptで要素を操作するためのIDとなります。それぞれのクラス属性値はデザイン上の役割を果たします。
HTML
<div id="page-top" class="page-top">
<p><a id="move-page-top" class="move-page-top">▲</a></p>
</div>
CSS
.page-top
{
margin: 0 ;
padding: 0 ;
}
.page-top p
{
margin: 0 ;
padding: 0 ;
position: fixed ;
right: 16px ;
bottom: 16px ;
}
.move-page-top
{
display: block ;
background: #D36015 ;
width: 50px ;
height: 50px ;
color: #fff ;
line-height: 50px ;
text-decoration: none ;
text-align: center ;
-webkit-transition:all 0.3s ;
-moz-transition:all 0.3s ;
transition:all 0.3s ;
}
.move-page-top:hover
{
opacity: 0.85 ;
}
じんわりと色を変える
transition
を利用しました。下記3行の、それぞれの0.3
の数値を変更することで、じんわり具合を調整できます。
CSS
.move-page-top
{
/* 〜省略〜 */
-webkit-transition:all 0.3s ;
-moz-transition:all 0.3s ;
transition:all 0.3s ;
}
右下への配置
position: fi
xed
を利用します。これは、﹁対象の要素を常に指定した場所に固定する﹂という命令です。固定というのは、画面をスクロールしても、ずっとその位置に止まり続けることを意味します。
right: 16px
は画面の右端から16px離れた位置、bot
tom: 16px
は画面の下から16px離れた位置、という指定をする命令です。仮に左上に設置したい場合は、left: 16px
; top: 16px ;
と命令してみましょう。
CSS
.page-top p
{
/* 〜省略〜 */
position: fixed ;
right: 16px ;
bottom: 16px ;
}
初期で非表示
display: none
を追加して下さい。
CSS
/* 〜追加分〜 */
.page-top
{
display: none ;
}
ボタンを出現させる
jQueryの基本型
jQuery
$( document ).ready( function()
{
// ここに命令を書く
} ) ;
id="asoko"
)の色を変えてくれ﹂という命令を書いても、命令をするコンピュータがその部分のHTMLを読み込む(認識する)前に命令を実行してしまったら﹁あそこ(id="asoko"
)なんて見つからないんだけど…﹂となってエラーが発生してしまいますよね。
そういったことを防ぐために、﹁HTMLを全部読み込んでから、この命令を実行してね﹂と指定するのが、先ほどの型なんです。ちなみにこの型は、次の省略形です。﹁document(ドキュメント)﹂が﹁ready(準備)﹂できたら、と考えるとイメージ湧きますよね。
なのでこの型を覚えておくと、jQueryのプログラムを動かしやすいと思います。ちなみに﹁読み込まれる﹂というのは、﹁HTMLの構造(タグ)が読み込まれる﹂ことを指すのであって、﹁画像や動画の読み込みが完了する﹂ということではないのでご注意下さい。紹介した記述は、下記の通り省略することが可能です。
jQuery
$( function()
{
// ここに命令を書く
} ) ;
ボタンを出現させる
display: none
)になっているボタンを表示状態にさせてみましょう。非表示にしているボタンにはpage-to
p
というid
が付いてましたね。それを利用して、次のように命令します。
jQuery
$( function()
{
$( '#page-top' ).fadeIn( 'slow' ) ;
} ) ;
s
low
からfast
に変更することで、フェードのスピードが上がります。
![fadeIn([speed], [callback])](/storage/javascript/jquery-to-top-button/static/dst/semooh.png)
fadeIn
の使い方について、日本語で分かりやすく解説されています。サンプル付きなので分かりやすいですよー。
fadeOut([speed], [callback])
![fadeOut([speed], [callback])](/storage/javascript/jquery-to-top-button/static/dst/semooh.png)
fadeOut
は、fadeIn
の逆の効果です。
スクロールイベントを加える
jQuery
$( window ).scroll(
function()
{
$( '#page-top' ).fadeIn( 'slow' ) ;
}
) ;
$(window)
)上で、スクロール(scroll
)をしたら、その()内の関数を実行するという指定です。先ほど紹介したJavaScriptを、これに書き換えて実行してみて下さい。スクロールをしたタイミングでボタンがフェードインするようになります。
![scroll(fn)](/storage/javascript/jquery-to-top-button/static/dst/semooh.png)
スクロール量を取得する
![$(window).scrollTop()で取得できる距離](/storage/javascript/jquery-to-top-button/static/dst/window-scroll-top-jquery_t.png)
$(window).scrollTop()
で、スクロール量をピクセル単位の数値で取得することができます。数値は、﹁現在見ている画面の一番上が、そのページの最上部から何ピクセル離れているか﹂を意味します。この数値を利用することで、どのタイミングでボタンが出現するかを調整することができます。
スクロールイベントが発生する位置を調整する
スクロールした瞬間にボタンが出現するだけじゃ意味がありませんね。﹁1,500pxの距離だけスクロールしたらボタンが出現する﹂﹁1,500px以下なら逆にボタンを消す﹂という条件、処理を加えてみます。スクロールイベントで行なう処理を次の通り、変更しましょう。jQuery
// 最上部から現在位置までの距離を取得して、変数[now]に格納
var now = $( window ).scrollTop() ;
// 最上部から現在位置までの距離(now)が1500px以上だったら
if( now > 1500 )
{
// [#page-top]をゆっくりフェードインする
$( '#page-top' ).fadeIn( "slow" ) ;
}
// 1500px以下だったら
else
{
// [#page-top]をゆっくりフェードアウトする
$( '#page-top' ).fadeOut( 'slow' ) ;
}
最下部まで来たらボタンを消す
![ページ全体の高さを取得する](/storage/javascript/jquery-to-top-button/static/dst/body-height-jquery_t.png)
$(
'body' ).height()
で取得します。
![スクロール量と画面の高さの和を引く](/storage/javascript/jquery-to-top-button/static/dst/scroll-and-height_t.png)
$(window).height()
で﹁画面の高さ﹂を取得することができます。﹁ページ全体の高さ﹂から﹁スクロール量と画面の高さの合計値﹂を引くことで、﹁最下部からの距離(px)﹂を取得することができますね。
﹁最下部からの距離が200px以下の場合はボタンを消す﹂という条件を加えると、コードが次のようになります。
jQuery
// 最上部から現在位置までの距離を取得して、変数[now]に格納
var now = $( window ).scrollTop() ;
// 最下部から現在位置までの距離を計算して、変数[under]に格納
var under = $( 'body' ).height() - ( now + $(window).height() ) ;
// 最上部から現在位置までの距離(now)が1500以上かつ
// 最下部から現在位置までの距離(under)が200px以上だったら
if( now > 1500 && 200 > under )
{
// [#page-top]をゆっくりフェードインする
$( '#page-top' ).fadeIn( 'slow' ) ;
}
// 1500px以下だったら
else
{
// [#page-top]をゆっくりフェードアウトする
$( '#page-top' ).fadeOut( 'slow' ) ;
}
トップに移動する
いよいよ仕上げです。最後に「ボタンをクリックしたらトップまで戻る」という機能を実装してみましょう。この章までの内容で、「TOPへ戻るボタン」が完成します。
クリックイベントを設定する
クリックイベントは下記の通り設定することができます。move-page-top
というIDを持つ要素をクリック(click
)すると、()内の関数が実行されます。
jQuery
$( '#move-page-top' ).click(
function()
{
// [id:move-page-top]をクリックしたら起こる処理
}
) ;
スムーズにスクロールする
瞬間的な移動ではなく、ゆっくりとスクロールするようにTOPに戻るには、下記の命令を加えます。scrollTop
はページの最上部を表し、「そこから0px
の位置まで、ゆっくり(slow
)と移動しろ」という命令です。
jQuery
$( 'html,body' ).animate( {scrollTop:0} , 'slow' ) ;
過剰な処理を防ごう
スクロールイベントは、とても多くの回数、処理を発生させます。スマホにおいては、スクロールが終わった時のタイミングで処理が1回実行されるのに対し、デスクトップの場合、少しでもスクロールする度に処理が実行されます。100px動かすだけでも、何十回の処理が発生してしまうというわけです。
この「TOPに戻るボタン」は、基本的に、ボタンを出現させるか、消すかの2種類の処理しかありません。何十回も同じ処理を発生させるのは無駄なので、工夫して防いでみましょう。
表示状態と非表示状態を判定する
fadeIn()
)を実行していましたね。逆に、スクロール量が足りない場合は、とにかくボタンを非表示にさせる処理(fadeOut()
)をしていました。言わば、何十回、何百回もの﹁重ねがけ﹂をしていることになります。これを、﹁まだ非表示だった場合に限り出現させる﹂﹁表示状態だった場合に限り消す﹂という条件を付けて、﹁重ねがけ﹂を防いでみましょう。
is(:hidden)
それには、is(:hidden)
というメソッドが便利です。対象となる要素に対し実行することで、その要素が現在、非表示状態(dis
play: none
)か、そうでないかを判定することができます。非表示状態だった場合にはtrue
、そうでなかった場合にはfals
e
の返り値を得られます。
jQuery
// [#page-top]が非表示状態かを調べる
var result = $( '#page-top' ).is(:hidden) ;
is(:hidden)
を利用して、次のように条件分岐することで、重ねがけを防ぐことができますよね!
jQuery
// [#page-top]が非表示状態かを調べる
var result = $( '#page-top' ).is(:hidden) ;
// 非表示だった場合
if( result == true )
{
// 処理 (出現させる)
}
// 非表示じゃなかった場合
else
{
// 処理 (非表示にする)
}
1秒間は次の処理を発生させない
setTimeout()
が便利です。次のような仕組みで実現できます。
(一)timeOut
という任意の名前の変数を用意する。初期値はnul
l
にしておく。
(二)setTimeout()
で﹁1秒後に処理を実行する﹂とセットする。
(三)それと同時に、timeOut
に適当な値を代入する。
(四)…1秒間は何も起きない。
(五)1秒後の処理で、timeOut
にnull
を代入する。
ちょっとややこしいですが、何回か読み直して整理して下さい。さてさて、上記のような仕組みを作った時、﹁timeOut
の値がnull
じゃない時間﹂が1秒間だけ発生するのは理解できますよね?これがミソです。﹁timeOut
の値がnull
じゃない時は処理をしない﹂という条件分岐を作れば、いいというわけです。具体的には、次のようになります。
jQuery
// グローバル変数
var timeOut = null ;
// [timeOut]が[null]の場合だけ処理をする
// ([timeOut]が[null]じゃない場合は処理をしない)
if( timeOut == null )
{
// 1秒後に、処理を実行するようセットする
timeOut = setTimeout( // [timeOut]にsetTimeout()のID値を代入する (=とにかく[timeOut]の値が[null]じゃなくなる)
function()
{
// 処理内容
// ...
// [timeOut]の値を[null]に戻す
timeOut = null ;
}
, 1000 // 1000ミリ秒 = 1秒
) ;
}
サンプルプログラム
jQuery
// グローバル変数
var syncerTimeout = null ;
// 一連の処理
$( function()
{
// スクロールイベントの設定
$( window ).scroll( function()
{
// 1秒ごとに処理
if( syncerTimeout == null )
{
// セットタイムアウトを設定
syncerTimeout = setTimeout( function(){
// 対象のエレメント
var element = $( '#page-top' ) ;
// 現在、表示されているか?
var visible = element.is( ':visible' ) ;
// 最上部から現在位置までの距離を取得して、変数[now]に格納
var now = $( window ).scrollTop() ;
// 最下部から現在位置までの距離を計算して、変数[under]に格納
var under = $( 'body' ).height() - ( now + $(window).height() ) ;
// 最上部から現在位置までの距離(now)が1500以上かつ
// 最下部から現在位置までの距離(under)が200px以上かつ…
if( now > 1500 && 200 < under )
{
// 非表示状態だったら
if( !visible )
{
// [#page-top]をゆっくりフェードインする
element.fadeIn( 'slow' ) ;
}
}
// 1500px以下かつ
// 表示状態だったら
else if( visible )
{
// [#page-top]をゆっくりフェードアウトする
element.fadeOut( 'slow' ) ;
}
// フラグを削除
syncerTimeout = null ;
} , 1000 ) ;
}
} ) ;
// クリックイベントを設定する
$( '#move-page-top' ).click(
function()
{
// スムーズにスクロールする
$( 'html,body' ).animate( {scrollTop:0} , 'slow' ) ;
}
) ;
} ) ;
ダウンロード
- SYNCER00062
- to-top.html Download
- to-top.js Download
- to-top.css Download
ファイル一覧
ファイル名をクリックすると内容を確認できます。「Download Zip」をクリックするとファイル一式をダウンロードできます。
更新履歴
2015年10月7日(水) [.page-top]とすべきところを[.page-top p]、[display: none]とすべきところを、[display: hidden]と表記していたため、訂正いたしました。 2015年9月2日(水) プログラムを1から書き直しました。スクロールイベントの過剰な連続処理、重ねがけを防ぐ方法を追記しました。なお、2015年9月以前にダウンロードしたものでも、動作に問題はありません。 2015年9月1日(火) 記事をリライトしました。デザインとUIを、さらにスマホ向けにリニューアルしました。SSL通信に対応しました。 2015年2月1日(日) 記事のデザインとUIをスマホ向けに大幅に改良しました。 2014年11月2日(日) 記事をスマホに最適化しました。 2014年6月21日(土) コンテンツを公開しました。![LINEに送る](https://syncer.jp/files/images/extra/line.png)