parallax/CParallax
コンテナとコンテンツにクラスを付与するだけで縦方向のパララックスを実現する、依存ゼロの素のJS。コンテンツを動きの幅(addPixelRange・既定40px)だけコンテナより高くするスタイルを自動付与し、コンテナが画面を通過する間にその余白分を translate3d で動かすため、どのスクロール位置でも隙間が出ない。動きの幅と中心点のずらし(offsetY)はPC/SPで別の値を指定でき、値はpxのほか rem / em / vh / vw の単位付きでも書ける。要素ごとの修飾クラスで有効デバイス(js-plx--pc / js-plx--sp)・方向の反転(js-plx--reverse)・overflow: hidden の無効化(js-plx--visible)を制御でき、戻り値の関数を呼ぶと監視を解除して付与したスタイルも元に戻る。
Demos
ページをスクロールすると、各ボックス内の画像がスクロールよりゆっくり動く(横線の位置で動きが確認できる)。動きの幅・方向・中心点・有効デバイスはすべてHTML側のクラス・data属性で制御している。デモ3・4はウィンドウ幅を768pxの前後で変えると有効/無効が、デモ6は動き幅が切り替わる。デモ1〜7は素のマークアップ、デモ8はAstroコンポーネント版。
1. 基本(全デバイスで有効)
コンテナに js-plx、コンテンツに js-plx__in を付与して parallax() を呼ぶだけ。スクロールに合わせて画像が既定の40px分ゆっくり動く。必要なスタイル(overflow: hidden や高さの上乗せ)はJSが自動付与する。
コードを見る
import { parallax } from 'form-snippets';
<div class="js-plx">
<img class="js-plx__in" src="..." alt="">
</div>
parallax(); 2. 動きの幅を要素ごとに変更
コンテナに data-plx-range を付与すると、その要素だけ動きの幅(px)を上書きできる。この例は 120px。JSを呼び直す必要はない。
コードを見る
import { parallax } from 'form-snippets';
<div class="js-plx" data-plx-range="120">
<img class="js-plx__in" src="..." alt="">
</div>
parallax(); 3. PCのみ有効
コンテナに js-plx--pc を追加すると、その要素は768px以上でのみパララックスが動く。SP幅では付与スタイルごとリセットされ、素の表示に戻る。ウィンドウ幅を変えて確認できる。
コードを見る
import { parallax } from 'form-snippets';
<div class="js-plx js-plx--pc">
<img class="js-plx__in" src="..." alt="">
</div>
parallax(); 4. SPのみ有効
コンテナに js-plx--sp を追加すると、その要素は768px未満でのみパララックスが動く。PC幅では静止画として表示される。
コードを見る
import { parallax } from 'form-snippets';
<div class="js-plx js-plx--sp">
<img class="js-plx__in" src="..." alt="">
</div>
parallax(); 5. 方向を反転
コンテナに js-plx--reverse を追加すると動きの方向が反転し、スクロールより速く動いて見える。上のデモ(通常方向)と見比べると視差の対比がわかる。クラス名は options の reverseClass で変更できる。
コードを見る
import { parallax } from 'form-snippets';
<div class="js-plx js-plx--reverse">
<img class="js-plx__in" src="..." alt="">
</div>
parallax(); 6. PC/SPで動きの幅を変える・単位付き指定
data-plx-range-pc / data-plx-range-sp でPCとSPの動き幅を別々に指定できる(data-plx-range より優先。optionsなら addPixelRange: { pc, sp })。値は px のほか rem / em / vh / vw の単位付きでも書ける。この例はPCで8rem、SPで30px。ウィンドウ幅を768pxの前後で変えると動き幅が切り替わる。
コードを見る
import { parallax } from 'form-snippets';
<div class="js-plx" data-plx-range-pc="8rem" data-plx-range-sp="30">
<img class="js-plx__in" src="..." alt="">
</div>
parallax(); 7. 移動の中心点をずらす
data-plx-offset(optionsなら offsetY)で移動の中心点を縦にずらせる。+で下寄り / −で上寄りに表示され、ずらした分の高さはJSが自動で上乗せするため、どのスクロール位置でも隙間は出ない。この例は-60px(上寄り)。PC/SP別に指定する場合は data-plx-offset-pc / -sp を使う。
コードを見る
import { parallax } from 'form-snippets';
<div class="js-plx" data-plx-offset="-60">
<img class="js-plx__in" src="..." alt="">
</div>
parallax(); 8. Astroコンポーネントとして使う
コードを見る
import CParallax from 'form-snippets/CParallax.astro';
<CParallax
src="..."
alt=""
range={{ pc: 80, sp: 30 }}
offset="-1rem"
/>