どうもですよはやちですよ٩( ᐛ )و
今回は、CHARTIST.JSで作ったグラフをScrollMagicと一緒に使用してアニメーション実装をしました。実装方法をご紹介します٩( ᐛ )و
実装方法
まずはじめに、CHARTIST.JSでグラフのアニメーションを作ります。
グラフの設定
seriesでグラフの数値を設定をしてデータを定義します。
//大きいフラグ
let chartBig = new Chartist.Pie('.chart', {
series: [91, 3, 6]
}, {
donut: true,
donutWidth: 52,
showLabel: false
});
//小さいグラフ
let chartSmall = new Chartist.Pie('.chart2', {
series: [80, 11]
}, {
donut: true,
donutWidth: 52,
showLabel: false
});
アニメーションの設定
設定されたグラフを動かすための関数を用意します。
//アニメーションの関数
function charts(elm) {
//グラフの描画するアクション…1
elm.on('draw',(data)=>{
//グラフに割り当てられたDataを取り出す…2
if(data.type === 'slice'){
//dasharrayの長さを設定します。
let pathLength = data.element._node.getTotalLength();
//pathにstroke-dasharrayの数値を代入する。
data.element.attr({
'stroke-dasharray': pathLength + 'px ' + pathLength + 'px'
});
//アニメーションの設定…3
let animationDefinition = {
'stroke-dashoffset': {
id: 'anim' + data.index,
dur: 1000,
from: -pathLength + 'px',
to: '0px',
easing: Chartist.Svg.Easing.easeOutQuint,
//fillの初期値を設定、これがないと最初のアニメーションがみれなくなってしまう。
fill: 'freeze'
}
};
//最初のdataでない場合、アニメーションの時間を計測して前のアニメーションの終了イベントを発生させる…4
if(data.index !== 0){
animationDefinition['stroke-dashoffset'].begin = 'anim' + (data.index - 1) + '.end';
}
//pathにstroke-dasharrayの初期値を代入する
data.element.attr({
'stroke-dashoffset': -pathLength + 'px'
});
//アニメーションの開始
data.element.animate(animationDefinition, false);
}
});
}
//デカいグラフのアニメーション
charts(chartBig)…5;
//小さいグラフのアニメーション
charts(chartSmall)…5;
-
- drawは描画するための処理
- seriesで設定した数分dasharrayを計測して、pathにstroke-dasharrayを代入する処理
- stroke-dashoffsetを動かす設定、easing、delayの設定などアニメーションの設定
- pathのアニメーションが終わって次のpathのアニメーションを発生させるための処理
- 設定したグラフを設定
の順に設定してます。
ひとまずできたものがこちら( ˘ω˘)☞三☞シュッシュッ
スクロールの設定
先ほどの関数をそのままに、グラフの設定と関数の発火タイミングをスクロールマジックの中に書き換えました。
行って戻ってくるとなんども関数が発火されてしまうため、classでアニメーションが一度だけ発火するようにしています。
//Scrollmagic発火
let controller = new ScrollMagic.Controller();
new ScrollMagic.Scene({
triggerElement: '#js-magic'
}).on('start', function () {
//グラフの設定
let chartBig = new Chartist.Pie('.chart', {
series: [91, 3, 6]
}, {
donut: true,
donutWidth: 52,
showLabel: false
});
let chartSmall = new Chartist.Pie('.chart2', {
series: [80, 11]
}, {
donut: true,
donutWidth: 52,
showLabel: false
});
//js−magicにclassがついてなかったらアニメーションを発火させる
if(!$('#js-magic').hasClass('is-animate')){
//デカいグラフのアニメーション
charts(chartBig);
//小さいグラフのアニメーション
charts(chartSmall);
$('#js-magic').addClass('is-animate');
}
}).addTo(controller);
できあがったものがこちらになります( ˘ω˘)☞三☞シュッシュッ
わかりやすく発火タイミングのlineを敷いてあります。
LIGはWebサイト制作を支援しています。ご興味のある方は事業ぺージをぜひご覧ください。