スクラブ機能
scrub
オプションを有効にすれば、トリガー要素がビューポートに入ってから出るまでの進行度が管理され、パララックスなどのスクラブアニメーションを作成することができます。
なお、特定のトリガー要素のみ scrub
オプションを有効にしたい場合は、トリガー要素に data-rola-scrub
属性を指定します。
これにより、トリガー要素がビューポートの下から入り、上に出るまでの進行度を --rola-progress
カスタムプロパティから取得できます。
アニメーション用のCSS
スクラブアニメーション用のCSSは、--rola-progress
カスタムプロパティを活用して自由に作成できます。
--rola-progress
カスタムプロパティは、トリガー要素のビューポート内のスクロール進行度に応じて 0
(ビューポートの下部) ~ 1
(スクラブアニメーションの終了)に変化します。
デフォルトでは、トリガー要素の上部がビューポートの下部に入った時に 0
となり、 トリガー要素の下部がビューポートの上部に辿り着いた時に 1
となります。
なお、rola.css には、あらかじめ フェード などのよく使うであろうアニメーションを用意しています。
--rola-progress
を活用し、進行度に応じて任意な値になるようなスタイルを作成します。
--rola-progress
は 0
〜 1
の数値が提供されるため、opcaity
や scale
のように数値を直接受け入れるプロパティにはそのまま使えます。
また、calc()
などと組み合わせることで自由な値や単位に変換できるため、アイデア次第で自由なスクラブアニメーションを作成できます。
例えば、以下のようなCSSを用意します。
これで、以下のようなHTMLを準備し、Rolaをインスタンス化するとスクラブアニメーションが可能です。
rola.css を読み込んでいる場合は、ターゲット要素に data-rola-effect
属性を付けるだけで手軽にスクラブアニメーションが利用できます。
利用できる属性値は以下のとおりで、進行度によるスタイルの状態は、ご自身のCSSで上書きも可能ですが、これらを変更できるカスタムプロパティも用意しています。
-
fade
カスタムプロパティ 役割 デフォルト値 型 --rola-effect-start
アニメーション開始時の不透明度 0
<opacity-value>
--rola-effect-end
アニメーション終了時の不透明度 1
<opacity-value>
-
scale
カスタムプロパティ 役割 デフォルト値 型 --rola-effect-start
アニメーション開始時のXとY軸のスケール 0
<number> | <percentage>
--rola-effect-end
アニメーション終了時のXとY軸のスケール 1
<number> | <percentage>
--rola-effect-x-start
アニメーション開始時のX軸のスケール – <number> | <percentage>
--rola-effect-x-end
アニメーション終了時のX軸のスケール – <number> | <percentage>
--rola-effect-y-start
アニメーション開始時のY軸のスケール – <number> | <percentage>
--rola-effect-y-end
アニメーション終了時のY軸のスケール – <number> | <percentage>
--rola-effect-z-start
アニメーション開始時のZ軸のスケール – <number> | <percentage>
--rola-effect-z-end
アニメーション終了時のZ軸のスケール – <number> | <percentage>
-
image-position
カスタムプロパティ 役割 デフォルト値 型 --rola-effect-x-start
アニメーション開始時の水平方向の object-position
center
<position>
--rola-effect-x-end
アニメーション終了時の水平方向の object-position
center
<position>
--rola-effect-y-start
アニメーション開始時の垂直方向の object-position
100%
<position>
--rola-effect-y-end
アニメーション終了時の垂直方向の object-position
0%
<position>
--rola-effect-scale
画像の拡大倍率 1.3
1.3
<number>
-
clip
カスタムプロパティ 役割 デフォルト値 型 --rola-effect-start
アニメーション開始時のクリップ率 30%
<length-percentage>
--rola-effect-end
アニメーション終了時のクリップ率 0%
<length-percentage>
-
text-clip
カスタムプロパティ 役割 デフォルト値 型 --rola-effect-start
アニメーション開始時の位置 100%
<length-percentage>
--rola-effect-end
アニメーション終了時の位置 0%
<length-percentage>
--rola-effect-angle
テキストカラーの角度 90deg
<angle>
--rola-effect-color-start
アニメーション開始時のテキストカラー color-mix(in srgb, var(--rola-effect-color-end, light-dark(#fff, #000))
<color>
--rola-effect-color-end
アニメーション終了時のテキストカラー canvastext
<color>
--rola-effect-opacity
--rola-effect-color-start
が指定されていない時のcolor-mix()
で使用する不透明度50%
<percentage>
--rola-effect-background-size
背景グラデーションのサイズ 200% 100%
<bg-size>
-
translate
カスタムプロパティ 役割 デフォルト値 型 --rola-effect-x-start
アニメーション開始時の水平方向の translate
– <length-percentage>
--rola-effect-x-end
アニメーション終了時の水平方向の translate
– <length-percentage>
--rola-effect-y-start
アニメーション開始時の垂直方向の translate
– <length-percentage>
--rola-effect-y-end
アニメーション終了時の垂直方向の translate
– <length-percentage>
--rola-effect-z-start
アニメーション開始時のZ軸方向の translate
– <length>
--rola-effect-z-end
アニメーション終了時のZ軸方向の translate
– <length>
進捗管理の開始と終了
Rolaのスクラブ機能のデフォルトは、トリガー要素の上部がビューポートの下部に入った時に 0
となり、 トリガー要素の下部がビューポートの上部に辿り着いた時に 1
となります。
進捗管理を開始するタイミングと終了するタイミングは、トリガー要素に data-rola-scrub-start
属性と、data-rola-scrub-end
属性を使うことで変更できます。
属性値は、要素の基準点 ビューポートの基準点
を、それぞれ パーセンテージ、または top
(0%
と同じ)、center
(50%
と同じ)、bottom
(100%
と同じ) で指定します。 値が1つの場合は、要素の基準点 として扱われ、ビューポートの基準点は、data-rola-scrub-start
属性の場合は、bottom
、data-rola-scrub-end
属性の場合は、top
が指定されます。
data-rola-scrub-start
属性に指定した 2 つの基準点が交差した位置から進捗管理が開始し、data-rola-scrub-end
属性に指定した 2 つの基準点が交差した位置で進捗管理が終了します。
例えば上記の例では、p
要素には data-rola-scrub-start
属性に bottom
が指定されています。
値がひとつのため、ビューポートの基準点は規定値の bottom
となります
この場合、トリガー要素の下の辺が、ビューポートの下の位置を交差した時に --rola-progress
が 0
となります。
そして、data-rola-scrub-end
属性に top center
が指定されているため、トリガー要素の上の辺がビューポートの垂直中央の位置を交差した時に --rola-progress
が 1
になります。
figure
要素は data-rola-scrub-start
属性に 0% 0%
が指定されています。
従って、トリガー要素の上の辺が、ビューポートの上の位置を交差した時に --rola-progress
が 0
となります。
data-rola-scrub-end
属性は、指定されていないため、規定値の bottom top
となり、トリガー要素の下の辺がビューポートの上の位置を交差した時に --rola-progress
が 1
になります。
ダイナミックイージング
velocityCustomProperty
オプションを有効にすると、ターゲット要素に、スクロールの速さを計算するのに便利な値(前回のスクロールと今回のスクロールの差の絶対値)を --rola-velocity
カスタムプロパティで提供します。
なお、特定のトリガー要素のみ velocityCustomProperty
オプションを有効にしたい場合は、トリガー要素に data-rola-velocity
属性を指定します。
このカスタムプロパティを活用して、スクロールの速さに応じたダイナミックなイージングを作ることが可能です。
例えば以下のようなCSSを用意するといいでしょう。
Rola CSSを使っている場合は、ターゲット要素に data-rola-dynamic-easing
属性をつけることでダイナミックイージングを設定できます。
なお、デュレーションは --rola-duration
で設定できます。
ビューポートのマージン
rootMargin
オプションを使えば、data-rola-inview
属性の値( true
/ false
)が切り替わるタイミングや、進行度を管理するタイミングをコントロールできます。初期値は 0px
となっており、ビューポート内に要素が少しでも入ったら data-rola-inview
属性が true
になります。
rootMargin
は IntersectionObserver
の rootMargin
オプションと同等で CSSの margin
プロパティのように設定します。
上記の例では、ビューポートの1番上から、下から 30% までのエリアにトリガー要素が入った時に data-rola-inview
属性が true
になります。
ターゲット要素の変更
デフォルトでは、トリガー要素に data-rola-inview
属性や、--rola-progress
カスタムプロパティが付与されますが、時にはトリガー要素ではない要素をアニメーションしたい場合などもあります。その場合は トリガー要素に data-rola-target
属性を使い、 data-rola-inview
属性や、--rola-progress
カスタムプロパティを付与させたい要素(ターゲット要素)を CSSセレクタで指定します。
これにより、トリガー要素がビューポートに入ったら、ターゲット要素のdata-rola-inview
属性が true
になり、--rola-progress
カスタムプロパティによる進行管理が始まります。
JavaScriptによる操作
Rola は、インスタンス作成時の第3引数にコールバック関数を持たせることができます。
scrub
オプションが有効時のコールバック関数はビューポート内でスクロール値が更新されるたびに実行されます。
なお、once
オプションが有効な場合には、最初にビューポートに入ったタイミングで1度だけ実行されます。
これにより、CSSだけでは表現できないようなこともJavaScriptを使って実現できるようになります。
例えば、スクロール値や進行度を画面に表示したり、GSPAのようなアニメーションライブラリを使ってアニメーションを作成したりすることができます。