指定範囲内でパララックスさせることがたまにあるので、実装方法をメモしておきます。
サンプルコード
スクロールの範囲と移動する範囲を指定して、パララックス要素の現在の値を返す関数を作ってみます。
.sample01、.sample02、.sample03をそれぞれ動かします。
HTML
<div class="sample sample01"></div> <div class="sample sample02"></div> <div class="sample sample03"></div>
CSSは必要な部分のみ抜粋しています。
CSS
.sample { position: absolute; } .sample01 { top: 1000px; left: 0; } .sample02 { top: 2000px; right: 300px; } .sample03 { top: 3000px; left: -20px; }
JavaScript
$(window).on('load scroll', function() { $('.sample01').css({ left: parallaxFunc(0, 400, 1000, 1500) }); $('.sample02').css({ right: parallaxFunc(300, -20, 2000, 2500) }); $('.sample03').css({ top: parallaxFunc(3000, 3700, 3100, 3900), left: parallaxFunc(-20, 500, 3100, 3900) }); }); /** * パララックス要素の現在の値を返す * @param num moveStart (required) パララックスで動かす要素の開始地点での値 * @param num moveEnd (required) パララックスで動かす要素の終了地点での値 * @param num scrollStart (required) パララックスで動かすスクロール範囲の開始地点 * @param num scrollEnd (required) パララックスで動かすスクロール範囲の終了地点 * @return num */ function parallaxFunc(moveStart, moveEnd, scrollStart, scrollEnd) { var winScroll = $(window).scrollTop(); var winHeight = $(window).height(); // スクロール判定の基準位置 var scrollPos = winScroll + winHeight; // 現在の値の取得 var currentVal; // スクロール範囲に到達していない場合 if(scrollPos < scrollStart) { currentVal = moveStart; // スクロール範囲を過ぎている場合 } else if(scrollPos > scrollEnd) { currentVal = moveEnd; // スクロール範囲内の場合 } else { // スクロール範囲 var scrollRange = scrollEnd - scrollStart; // 移動範囲 var moveRange = Math.abs(moveEnd - moveStart); // 進行方向 var direction = moveStart < moveEnd ? 1 : -1; // 進捗率1%あたり進む距離 var moveRate = moveRange / 100 * direction; // 現在の進捗率 var progressRate = (scrollPos - scrollStart) / scrollRange * 100; currentVal = moveStart + progressRate * moveRate; } return currentVal; }
parallaxFunc()の関数で現在のスクロール位置で各要素のCSSの値を返すようにしています。
パララックスのデモページ
コメントが承認されるまで時間がかかります。