概要と目標 スクロールに関するメソッドで、
よく見る機能を作ろう。
jQueryのスクロールに関するメソッドを知り、スムーズスクローラーを作りましょう。
jQueryのスクロールに関するメソッドを知り、スムーズスクローラーを作りましょう。
scroll() メソッドを使えば、
スクロールするごとにイベントを発生させる事ができる。
scroll () ・・・ スクロールイベント$(セレクタ).scroll(function() {
// スクロールするたびに実行する処理
});
詳細はjQuery API Documentationを参照
$(function () {
// scroll() ・・・ スクロールイベント
$(window).scroll(function () {
// スクロールするたびに実行する処理
console.log('スクロールしたよ!');
});
});
現在のスクロール量を取得したり、変更したりするには、scrollTop() メソッドを利用する。
scrollTop () ・・・ スクロール量を変更したり取得したりする$(セレクタ).scrollTop(スクロール量);
省略可
【スクロール量】を省略すると現在のスクロール量を取得できる
詳細はjQuery API Documentationを参照
scrollTop()メソッドを使ってみよう。$(function () {
// scroll() ・・・ スクロールイベント
$(window).scroll(function () {
// スクロールするたびに実行する処理
console.log('スクロールしたよ!');
// scrollTop ・・・ スクロール量を変更したり取得したり
var scroll = $(window).scrollTop(); // 取得
$('.fixed-panel').text(scroll + 'px');
});
});
近年スクロールに応じて、CSSを変更するデザインが流行っている。
基本的には、このスクロール量によって処理を分岐している。
$(function () {
// scroll() ・・・ スクロールイベント
$(window).scroll(function () {
// スクロールするたびに実行する処理
console.log('スクロールしたよ!');
// scrollTop ・・・ スクロール量を変更したり取得したり
var scroll = $(window).scrollTop(); // 取得
$('.fixed-panel').text(scroll + 'px');
// 1000px以上スクロールしたら、bodyにclassを追加
if (scroll > 1000) {
$('body').addClass('is-over');
}
});
});
body {
transition: all .3s ease-in-out;
}
.is-over {
background-color: #333;
color: #ccc;
}
.fixed-panel {
position: fixed;
right: 0;
bottom: 1em;
padding: 1.5em;
background-color: #212121;
box-shadow: 0 0 4px rgba(0, 0, 0, .3);
color: #ccc;
text-align: right;
font-weight: bold;
}
scrollTop()の値は、前回紹介したanimate()メソッドで指定することもできる。
ただし、animate()メソッドに、scrollTopを指定する際は、ブラウザによって対応するセレクタが異なる。
| ブラウザ | html |
body |
|---|---|---|
| IE 8~11 | ○ | - |
| Edge | - | ○ |
| Chrome 61 | ○ | - |
| Firefox 48 | ○ | - |
| Opera 48 | ○ | - |
| Safari 9 | - | ○ |
※.バージョンによっても異なる
$(function () {
$('.js-button').click(function () {
$('html, body').animate({
scrollTop: 0
}, 500);
return false;
});
});
先程の「このページの先頭へボタン」は、ページの先頭にしかシュルシュルしない。
先程のコードを変更し、どのページ内リンクでもシュルシュルするようにする。
ページ内の目的地の位置を取得するには、offset()メソッドで取得する。
offset () ・・・ 要素の表示位置を変更したり取得したりする$(セレクタ).offset({top: topの座標位置, left: leftの座標位置});
省略可
パラメータを省略すると現在の表示位置を取得できる
詳細はjQuery API Documentationを参照
<body id="top">
<h1>シュルシュル動くボタン</h1>
<nav>
<ul>
<li><a href="#sec1">第1章</a></li>
<li><a href="#sec2">第2章</a></li>
<li><a href="#sec3">第3章</a></li>
<li><a href="#sec4">第4章</a></li>
<li><a href="#sec5">第5章</a></li>
</ul>
</nav>
$(function () {
// $('.js-button').click(function () {
// $('html, body').animate({
// scrollTop: 0
// }, 500);
// return false;
// });
$('a[href^="#"]').click(function () {
// 「a要素のhref属性が # から始まる要素」をクリックした時
// 目的地の取得(自身のhref属性を取得)
var id = $(this).attr('href');
// 目的地の位置を取得
var target = $(id).offset();
// console.log(id);
// html要素とbody要素にアニメーション
$('html, body').animate({
scrollTop: target.top // 目的地の上からの位置
}, 500);
return false;
});
});
「chapter04」 › 「training」フォルダ内の「index.html」を開き、
下記の問題を解いて下さい。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>練習問題4</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<header>
<div class="container">
<h1>練習問題4</h1>
</div>
<!-- /.container -->
<nav class="js-fixedNav global-nav">
<div class="container">
<ul>
<li><a href="#">Home</a></li>
<li><a href="#">About Us</a></li>
<li><a href="#">Service</a></li>
<li><a href="#">Contact</a></li>
</ul>
</div>
<!-- /.container -->
</nav>
</header>
<main>
<div class="container">
<p>
これは、高さを稼ぐだけのテキスト。<br>
なぜなら、高さが無いとスクロールが出来ないから。
</p>
<hr>
<p>
これは、高さを稼ぐだけのテキスト。<br>
なぜなら、高さが無いとスクロールが出来ないから。
</p>
<hr>
<p>
これは、高さを稼ぐだけのテキスト。<br>
なぜなら、高さが無いとスクロールが出来ないから。
</p>
<hr>
<p>
これは、高さを稼ぐだけのテキスト。<br>
なぜなら、高さが無いとスクロールが出来ないから。
</p>
<hr>
<p>
これは、高さを稼ぐだけのテキスト。<br>
なぜなら、高さが無いとスクロールが出来ないから。
</p>
<hr>
<p>
これは、高さを稼ぐだけのテキスト。<br>
なぜなら、高さが無いとスクロールが出来ないから。
</p>
<hr>
<p>
これは、高さを稼ぐだけのテキスト。<br>
なぜなら、高さが無いとスクロールが出来ないから。
</p>
<hr>
<p>
これは、高さを稼ぐだけのテキスト。<br>
なぜなら、高さが無いとスクロールが出来ないから。
</p>
<hr>
<p>
これは、高さを稼ぐだけのテキスト。<br>
なぜなら、高さが無いとスクロールが出来ないから。
</p>
<hr>
<p>
これは、高さを稼ぐだけのテキスト。<br>
なぜなら、高さが無いとスクロールが出来ないから。
</p>
<hr>
<p>
これは、高さを稼ぐだけのテキスト。<br>
なぜなら、高さが無いとスクロールが出来ないから。
</p>
<hr>
<p>
これは、高さを稼ぐだけのテキスト。<br>
なぜなら、高さが無いとスクロールが出来ないから。
</p>
<hr>
<p>
これは、高さを稼ぐだけのテキスト。<br>
なぜなら、高さが無いとスクロールが出来ないから。
</p>
<hr>
<p>
これは、高さを稼ぐだけのテキスト。<br>
なぜなら、高さが無いとスクロールが出来ないから。
</p>
<hr>
<p>
これは、高さを稼ぐだけのテキスト。<br>
なぜなら、高さが無いとスクロールが出来ないから。
</p>
</div>
<!-- /.container -->
</main>
<script src="https://code.jquery.com/jquery-1.12.4.min.js" integrity="sha256-ZosEbRLbNQzLpnKIkEdrPv7lOy9C27hHQ+Xp8a4MxAQ=" crossorigin="anonymous"></script>
<script src="app.js"></script>
</body>
</html>
body {
margin: 0;
background-color: #eee;
}
.container {
margin: 0 auto;
width: 960px;
}
header {
background-color: #fff;
}
header h1 {
margin: 0;
padding: .75em 0;
font-size: 1.5em;
}
.global-nav {
background-color: #333;
}
.global-nav ul {
overflow: hidden;
margin: 0;
padding: 0;
list-style-type: none;
}
.global-nav li {
float: left;
width: 25%;
}
.global-nav a {
display: block;
padding: 1em;
color: #fff;
text-align: center;
text-decoration: none;
}
.is-fixed {
padding-top: 3.5em;
}
.is-fixed .global-nav {
position: fixed;
top: 0;
right: 0;
left: 0;
}
main {
padding: 4em 0;
}
$(function () {
// ナビゲーションの位置を取得
var nav = $('.js-fixedNav').offset();
// console.log('ナビの位置は' + nav.top);
// スクロールイベント
$(window).scroll(function () {
// スクロールする度に実行される
// console.log($(window).scrollTop());
if ($(window).scrollTop() >= nav.top) {
$('body').addClass('is-fixed');
} else {
$('body').removeClass('is-fixed');
}
});
});
解答例は全問題のチェックボックスが on になるとご覧いただけます。
スクロールイベントを使って、スクロール量を取得するような処理は、
非常によく使うので抑えておきましょう。
scroll()メソッドでスクロールイベントを指定できるscrollTop()メソッドでスクロール量を取得できるoffset()メソッドで要素の表示位置を取得できる