1画面分ずつスクロールするコンテンツ
- 2019.04.06
- javascript+css つくったもの
- javascript, vanillaJS, 脱jQuery
1画面分ずつスクロールするコンテンツを作りました。
jQuery使用せず、javascriptとcssで作りました。
トラックパッドだと慣性スクロールが効いて変な動きになってしまうのですが、それにも対応しています。
ソースコードと解説
html
<div id="wrap"> <div class="page1">1</div> <div class="page2">2</div> <div class="page3">3</div> <div class="page4">4</div> <div class="page5">5</div> </div>
div#wrap の中の div をそれぞれ1画面ずつスクロールするようにしました。
この部分の指定を変える場合は、javascript の以下の部分を変更すればOKです。
elements = document.querySelectorAll('#wrap div'),
(‘#wrap div’) となっているところを変更ください。
css
body { margin: 0; padding: 0; overflow: hidden; } #wrap div { width: 100%; height: 100vh; line-height: 100vh; text-align: center; font-size: 30px; } .page1 { background-color: aqua; } .page2 { background-color: antiquewhite; } .page3 { background-color: tomato; } .page4 { background-color: palegreen; } .page5 { background-color: orange; }
body に overflow: hidden; を入れてスクロールバーは消しておきました。
#wrap div に width: 100%; height: 100vh; で画面いっぱいに。
javascript
(function () { 'use strict'; // 変数 var wrap = document.getElementById('wrap'), elements = document.querySelectorAll('#wrap div'), // 1画面分スクロールさせる要素 elRect = [], // 要素の位置情報を取得するための配列 elTop = [], // 要素の位置を入れるための配列 count = 0, // wheelFlag = false; // 各要素の位置を取得 function getElTop() { for (var i = 0; i < elements.length; i++) { // 要素の数ループ elRect.push(elements[i].getBoundingClientRect()); // 要素の位置情報を配列へ } for (var i = 0; i < elRect.length; i++) { // 要素の数ループ elTop.push(elRect[i].top + window.scrollY); // 要素の位置を配列へ } } getElTop(); // 画面リサイズのときの処理 window.addEventListener('resize', function () { elRect = []; // 位置情報の配列を一旦空に elTop = []; // 位置の配列を一旦空に getElTop(); // 位置を取得 window.scrollTo(0, elTop[count]); // 現在表示中の画面位置へ }); // マウスホイールのときの処理 wrap.addEventListener('wheel', function (e) { e.preventDefault(); // デフォルトのスクロール動作を削除 if (!wheelFlag) { // wheelFlagがfalseのときに発動 wheelFlag = true; // wheelFlagをtrueにして無駄に発動しないように if (e.deltaY > 0) { // ホイールが下方向だったら if (count >= elements.length - 1) { // 要素の数以上に増えないようにcountが要素の数を超えたら count = elements.length - 1; // countを要素の数とする } else { count++; // それまではcountをプラス } } else if (e.deltaY < 0) { // ホイールが上方向だったら if (count <= 0) { // 0より小さくならないようにcountが0以下なら count = 0; // countを0とする } else { count--; // それまではcountをマイナスしていく } } setTimeout(function () { //0.8秒後にwheelFlagをfalseにして次のページめくれるように wheelFlag = false; },800); setTimeout(function () { window.scrollTo({ // count番目の要素へスクロール top: elTop[count], behavior: 'smooth', }); },20); // スクロールまで時間差をつけて慣性スクロール対策 } }); }());
下方向へのホイールがあったら、countをプラス。
上方向ならマイナス。
要素の位置を配列に入れておいて、count番目の要素の位置へ画面をスクロールさせます。
トラックパッドでは慣性スクロールが効いて変な動きになってしまっていたので、少し時間をずらしてスクロールが発動するようにして対策しています。
setTimeout(function () {
window.scrollTo({ // count番目の要素へスクロール
top: elTop[count],
behavior: 'smooth',
});
},20); // スクロールまで時間差をつけて慣性スクロール対策
IEではスクロールの behavior: ‘smooth’, が効かないのでまた別で対応してあげないといけません。
-
前の記事
javascriptとcssでつくる複合検索 2019.03.31
-
次の記事
css圧縮時にエラーになる書き方 2019.04.06