初心者でも分かる!jQuery「TOPへ戻るボタン」の作り方

初心者でも分かる!jQuery「TOPへ戻るボタン」の作り方

スクロールすると右下にスーっと出てくるページトップへの移動ボタン。あれってとても便利ですよね。今回はこの「TOPへ戻るボタンの作成方法」を、JavaScript初心者でも理解できるように解説します。

サンプルデモ

TOPに戻るボタンのデモ
TOPに戻るボタンのデモ

指定した位置までスクロールするとボタンが出現し、クリックするとページの最上部までスムーズにスクロールします。フッターなどのコンテンツがボタンに隠れないよう、最下部に来た時にはボタンが消えるようにしましょう。

サンプルデモを見る

制作方法

ここからは、「TOPに戻るボタン」の具体的な制作方法について、説明していきます。

ボタンを用意する

まず必要となるのが、右下に出現するページトップへ移動するためのボタンです。HTMLとスタイルシートで、簡単に作っておきましょう。下記はサンプルです。クリックしても何も起こりません。


HTML(div)page-topamove-page-topidJavaScriptID

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 ;
}

じんわりと色を変える


transition30.3調

CSS

.move-page-top
{
	/* 〜省略〜 */
	-webkit-transition:all 0.3s ;
	-moz-transition:all 0.3s ;
	transition:all 0.3s ;
}

右下への配置


position: fixed

right: 16px16pxbottom: 16px16pxleft: 16px ; top: 16px ;

CSS

.page-top p
{
	/* 〜省略〜 */
	position: fixed ;
	right: 16px ;
	bottom: 16px ;
}

初期で非表示


display: none

CSS

/* 〜追加分〜 */
.page-top
{
	display: none ;
}

ボタンを出現させる


JavaScriptJavaScriptjQuery

jQueryの基本型


HTML

jQuery

$( document ).ready( function()
{
	// ここに命令を書く
} ) ;

HTML(id="asoko")HTML()(id="asoko")

HTMLdocument()ready()

jQueryHTML()

jQuery

$( function()
{
	// ここに命令を書く
} ) ;

ボタンを出現させる


JavaScript(jQuery)使(display: none)page-topid

jQuery

$( function()
{
	$( '#page-top' ).fadeIn( 'slow' ) ;
} ) ;

fadeIn()fadeOutslowfast

fadeIn([speed], [callback])
fadeIn([speed], [callback]) fadeIn使

fadeOut([speed], [callback])
fadeOut([speed], [callback]) fadeOutfadeIn

スクロールイベントを加える



jQuery

$( window ).scroll(
	function()
	{
		$( '#page-top' ).fadeIn( 'slow' ) ;
	}
) ;

($(window))(scroll)()JavaScript

scroll(fn)
scroll(fn) scroll

スクロール量を取得する

$(window).scrollTop()で取得できる距離
$(window).scrollTop()で取得できる距離

$(window).scrollTop()調

調


1,500px1,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' ) ;
}

最下部まで来たらボタンを消す



ページ全体の高さを取得する

$( 'body' ).height()
スクロール量と画面の高さの和を引く

$(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種類の処理しかありません。何十回も同じ処理を発生させるのは無駄なので、工夫して防いでみましょう。

表示状態と非表示状態を判定する


1,500px(fadeIn())(fadeOut())

is(:hidden)


is(:hidden)便(display: none)truefalse

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秒間は次の処理を発生させない


11setTimeout()便

(一)timeOutnull
(二)setTimeout()1
(三)timeOut
(四)1
(五)1timeOutnull

timeOutnull1timeOutnull

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' ) ;
		}
	) ;
} ) ;

ダウンロード


to-top.html

ファイル一覧

SYNCER00062
to-top.html Download
to-top.js Download
to-top.css Download

ファイル名をクリックすると内容を確認できます。「Download Zip」をクリックするとファイル一式をダウンロードできます。

Download Zip




2015107()
[.page-top][.page-top p][display: none][display: hidden]
201592()
120159
201591()
UISSL
201521()
UI
2014112()

2014621()


  • LINEに送る