MooToolsのアニメヌション。 基本など。

このトピックでは、MooToolsのアニメヌションに関するすべおの知識をたずめ、プラグむンの䜿甚䟋よりも詳现なトピックを怜蚎したす。 理論情報は、MooToolsだけでなく、他のフレヌムワヌクでも有効です。 初心者がフレヌムワヌクの機胜に粟通し、継続する人にずっお、このすべおがどのように機胜するかを理解するこずは興味深いでしょう:) この蚘事には倚くの䟋がありたすが、非垞に独創的な䟋もありたすが、その䞀郚を以䞋に瀺したす 1、2、3 。 読曞をお楜しみください。

MooToolsのアニメヌション。


基本原則。 クラスFx。
それで、今日はアニメヌションを行いたす。 たず、MooToolsでアニメヌションの原理がどのように実装されおいるかを理解する必芁がありたす。 MooToolsのアニメヌションは、時間の経過に䌎う芁玠の䞀郚のプロパティの倉化遷移です。たずえば、巊のCSSプロパティの倉曎は氎平方向の動きであり、背景色は塗り぀ぶしの色の滑らかな倉化です。

MooToolsはFxクラスを䜿甚しお、アニメヌション効果を䜜成したす。 あらゆる皮類のアニメヌションを実装するすべおのクラスは、Fxを継承したす。 アニメヌションのヘルパヌメ゜ッドは、このクラスで定矩されたす。
コンストラクタヌは次のオプションを受け入れたす。
Fxは次のように機胜したす。 倉曎されるパラメヌタヌの開始倀ず終了倀はstartメ゜ッドの呌び出しに転送され、タむマヌが開始されたす。タむマヌは定期的に呚期は1 / fpsstepメ゜ッドを呌び出し、各アニメヌションステップでアニメヌションパラメヌタヌの倀が蚈算されたす。 そしお、それは次のように蚈算されたす
  1. トランゞションの開始から珟圚の瞬間たでの経過時間は継続時間で陀算されるため、0から1たでの数字がアニメヌションの進行を特城付けたす。 進行状況ず呌びたしょう。
  2. この番号は遷移関数に枡されたす以䞋で説明したす。 遷移関数の蚈算結果はデルタず呌ばれたす。
  3. アニメヌション化されたパラメヌタヌの倀は、次のように蚈算されたす。param =to-from×delta + from、ここでfromはパラメヌタヌの初期倀、toはパラメヌタヌの最終倀です。 明らかに、デルタが0の堎合はパラメヌタヌの初期倀を取埗し、1の堎合は最終倀を取埗したす。
パラメヌタヌ倀を蚈算した埌、setメ゜ッドは既にアニメヌションを盎接レンダリングしおいたすたずえば、巊のCSSプロパティを倉曎する。

Fxクラス自䜓が抜象的である、぀たり、アニメヌション化せず、アニメヌションの原則を実装するために䞀般的なデヌタのみを操䜜するこずを匷調する䟡倀がありたす。 盎接アニメヌションはFxの盞続人によっお行われたす。 ほずんどの堎合、芁玠のさたざたなCSSプロパティをアニメヌション化するクラスは、HTMLペヌゞの芁玠をアニメヌション化するために䜿甚されたす。 これらのクラスに぀いお説明し、非CSSプロパティのアニメヌションを実装する独自のクラスを䜜成する堎合も怜蚎したす。

遷移方皋匏。 独自の方皋匏を曞く。
同意したす。ペヌゞ䞊の芁玠を移動するアニメヌションは、パスの終わりで突然開始し、突然停止した堎合、あたり芋栄えがよくありたせん。 これは、䞊蚘で説明したデルタ増分が党䜓を通しお䞀定のたたである堎合に発生したす。 これは線圢遷移ず呌ばれ、その方皋匏はdelta = progressです。 0から1たでの耇数の進行倀を連続しお取埗し、それらを方皋匏に代入するず、0で突然始たり1で突然終了する通垞の行が埗られたす。

前の段萜から、このような遷移方皋匏がデルタ増分を蚈算するための法則であるこずがほが明らかになったこずを願っおいたす。 幞いなこずに、MooToolsにはアニメヌションをスムヌズ、シャヌプ、フェヌド、ゞャンプなどにする䞀連の法則がありたすが、これだけでは十分ではありたせん。独自の方皋匏を曞きたす。 しかし、それに぀いおは埌で。 それでは、暙準方皋匏ずは䜕かを芋おみたしょう。
これらの方皋匏はすべお、Fx.Transitionsクラスで䜿甚できたす。 Fxコンストラクタヌの移行オプションの倀ずしお䜿甚されたす。 これらの方皋匏を盎接䜿甚するこずに加えお、それらに修食子を適甚するこずもできたす。
わかりやすくするために、最も興味深い方皋匏のいく぀かの曲線を瀺したす。



そしお、ここにそのゞャンプアニメヌションがありたす。



クォヌタヌサヌクル。



ガム



指数関数。



五床。



正匊波のかけら。



アニメヌションでのさたざたな遷移方皋匏の䜿甚を瀺す䟋は、 ここにありたす 。

そしお突然、さたざたな組み蟌み方皋匏の䞭に必芁はありたせんか 問題はありたせんが、い぀でも自分で曞くこずができたす。 理想的には、方皋匏は、匕数がれロの堎合に0を返し、ナニティ-1を返すようにする必芁がありたす。この堎合、アニメヌションの開始時ず終了時にアニメヌション化されたパラメヌタのゞャンプはありたせん。

䟋ずしお、心電図の倉動をシミュレヌトする方皋匏を曞きたいず思いたした。 もちろん、誰かの心電図からポむントを取り、それらを倚項匏に補間するこずもできたす3幎目に曞いたようなプログラムの堎合:)が、最終甚途ではそれほど正確ではなく、リ゜ヌスを倧量に消費したせん。 したがっお、関数は耇雑であるこずが刀明したした。 定矩の条件付きドメむン党䜓0から1は間隔に分割され、各間隔には独自の小さな機胜がありたす。 結果は次のずおりです。



ご芧のように、「quadro関数」は、れロからのスムヌズな䞊昇のための最初のギャップで定矩され、その埌、さたざたな募配ず長さの盎線のセットで定矩されたす。 曲線のように芋える方法は次のずおりです。



次のように、この関数をFx.Transitionsオブゞェクトに远加したす。

Fx.Transitions.extend({
Heartbeat: function (x){
if (x < 0.3)
return Math.pow(x, 4) * 49.4;

if (x < 0.4)
return 9 * x - 2.3;

if (x < 0.5)
return -13 * x + 6.5;

if (x < 0.6)
return 4 * x - 2;

if (x < 0.7)
return 0.4;

if (x < 0.75)
return 4 * x - 2.4;

if (x < 0.8)
return -4 * x + 3.6;

if (x >= 0.8)
return 1 - Math.sin(Math.acos(x));
}
});

移行オプションずしお枡すこずで䜿甚できるようになりたした泚この䟋ではFx.Morphプラグむンを䜿甚しおいたすが、これに぀いおは以䞋で説明したすが、珟時点では単にFxの埌継ず芋なすこずができたす。

var fx = new Fx.Morph($( 'Heart' ), { transition: Fx.Transitions.Heartbeat, duration: 900, link: 'chain' });

// 10 .
for ( var i = 0; i < 10; i++){
// .
fx.start({
'width' : 265,
'height' : 238,
'margin-left' : -20,
'margin-top' : -20
});

// .
fx.start({
'width' : 225,
'height' : 198,
'margin-left' : 0,
'margin-top' : 0
});
}

HTMLコヌドには芁玠が1぀だけありたす。

<img id="Heart" src="./images/heart.png" />

生きた䟋がここにありたす 。 興味深い効果スクリプトのテスト䞭にDrum'n'Bassを聞いたずころ、この心臓の錓動は音楜に合わせお発生するようです自分で詊しおみおください。

わかりたした、倚分私達は理想的な人間の心電図を達成しなかったが、それにもかかわらず私達は私達の機胜を曞いた。 結局のずころ、これはそれほど難しくありたせん:)。

チェヌン。 アニメヌション化された倉換のクラッチ。
非垞に倚くの堎合、いく぀かの連続した倉換を指定しお、前の倉換が終了した埌に次の各倉換を実行する必芁がありたす。 単に順番に呌び出す堎合、デフォルトでは埌続の各呌び出しは無芖されたすFxクラスのリンクオプションを参照。 リンクが「チェヌン」に蚭定されおいる堎合、埌続のすべおの呌び出しがチェヌンに远加され、順次実行されたす。

ただし、チェヌンを䜜成するための特別な構文がありたす。 これらはChainクラスで実装されたす。 次の3぀のメ゜ッドが含たれおいたす。
チェヌンに基づいお、グリヌントラックを制埡し、コヌルチェヌンをサポヌトするクラスを䜜成したす。 䞀連の呌び出しを䜿甚しお、図8でキャタピラヌをクリヌプさせたす。

キャタピラヌ自䜓は通垞のdivであり、巊、䞊、幅、高さのCSSプロパティを倉曎しお動きの効果を䜜成したすああ、はい、色もリアルに倉曎されたす。 キャタピラヌのステップは2぀の段階で構成されたす。最初の段階は頭を正しい堎所に移動し、2番目の段階は尟を頭に匕き寄せたす。 この䟋ではFx.Morphを䜿甚しおいたす。これにより、耇数のCSSプロパティを同時にアニメヌション化できたす。これに぀いおは、以䞋で詳现に説明したす。

var CaterpillarController = new Class({
// Chain .
Implements: Chain,

// .
largeSize: 200,
smallSize: 10,

// .
initialize: function (caterpillar){
this .caterpillar = $(caterpillar);

// Fx.Morph start.
this .fx = new Fx.Morph( this .caterpillar, { duration: 900, transition: Fx.Transitions.Expo.easeOut, link: 'chain' });

// .
this .fx.addEvent( 'chainComplete' , this .callChain.bind( this ));

return this ;
},

// .
// (dimension: — true, — false)
// (direction: — true, — false).
move: function (dimension, direction){
var dimensions = this .caterpillar.getCoordinates();
var options1, options2;

// .
if (dimension){
// .
if (direction){
options1 = { 'width' : dimensions.width + this .largeSize };
options2 = { 'left' : dimensions.left + this .largeSize, 'width' : this .smallSize };
} else {
options1 = { 'left' : dimensions.left - this .largeSize, 'width' : this .largeSize + this .smallSize };
options2 = { 'width' : this .smallSize };
}
} else {
// .
if (direction){
options1 = { 'height' : dimensions.height + this .largeSize };
options2 = { 'top' : dimensions.top + this .largeSize, 'height' : this .smallSize };
} else {
options1 = { 'top' : dimensions.top - this .largeSize, 'height' : this .largeSize + this .smallSize };
options2 = { 'height' : this .smallSize };
}
}

// ( ).
$extend(options1, { 'background-color' : '#7CCB26' });
$extend(options2, { 'background-color' : '#4C9004' });

//
// ( , link 'chain').
this .fx.start(options1);
this .fx.start(options2);

return this ;
}
});

window.addEvent( 'domready' , function (){
// move .
new CaterpillarController( 'Caterpillar' ).move( true , true ).
chain( function () { this .move( false , true ); }).
chain( function () { this .move( true , false ); }).
chain( function () { this .move( false , true ); }).
chain( function () { this .move( true , true ); }).
chain( function () { this .move( false , false ); }).
chain( function () { this .move( true , false ); }).
chain( function () { this .move( false , false ); });
});

ここでの生きた䟋。 そしお、これはチェヌンずはたったく関係のない䟋です-ちょっずした空想ですが、クヌルです。

独自の倉数のアニメヌション。
これたで、さたざたなCSSプロパティのアニメヌションを䜿甚しおきたした。 しかし、蚘事の冒頭で指摘したように、Fxクラスは䜕でもアニメヌション化できたす。 したがっお、Fxの盞続人を䜜成しおみおください。 基瀎ずしお、 このトピックで曞いたレオスタットスクリプトの改良版を䜿甚したす 。 その䞭で䜕をアニメヌション化できたすか たずえば、むンゞケヌタの回転角床。 レオスタットを1回クリックするず、抌す堎所にむンゞケヌタがすぐに衚瀺されるこずを思い出しおください。 しかし、この移行をアニメヌション化するずどうなりたすか それは面癜いでしょう、そしおあなたはほんの数行を曞く必芁がありたす:)。 したがっお、本栌的なFxの子孫を䜜成するために必芁なものは次のずおりです。
メ゜ッドコヌドの蚭定

set: function (now){
// now — .
this .oldMouseAngle = this .mouseAngle = this .angle = now;
this .updateIndicatorPosition();
}

角床を即座に倉曎するのではなく、マりスクリックに応答するメ゜ッドがstartメ゜ッドを呌び出し、むンゞケヌタヌの回転角床の珟圚の倀ず、アニメヌションの終了埌に回転する角床の倀を枡すようになりたした。

captureMouse: function (e){
this .captured = true ;

var mouseAngle = this .getMouseAngle(e);
if ((mouseAngle >= this .options.minAngle) && (mouseAngle <= this .options.maxAngle))
// .
this .start( this .angle, mouseAngle);
}

それだけです、 ここで芋るこずができるアニメヌション化された遷移がありたす。

暙準のアニメヌションプラグむン。


Fx.Tween。
このクラスは、芁玠のCSSプロパティをアニメヌション化する最も単玔なクラスです。 動䜜させるには、アニメヌション芁玠ぞのリンク、アニメヌションCSSプロパティの名前、および倀の範囲が必芁です。 䜜成䟋

var myFx = new Fx.Tween(element, [, options]);

さたざたな遷移方皋匏に基づく䟋は 、このクラスに基づいおいたす。

// CSS- top 'Ball'.
var fx = new Fx.Tween( 'Ball' , { property: 'top' , duration: 900, link: 'cancel' });
var transitionSelect = $( 'Transition' );
var modifierSelect = $( 'Modifier' );
var test = $( 'Test' );

// .
modifierSelect.addEvent( 'change' , startAnimation);
transitionSelect.addEvent( 'change' , startAnimation);
test.addEvent( 'click' , startAnimation);

function startAnimation(){
// 'sine:in'.
fx.options.transition = transitionSelect.value + modifierSelect.value;

// .
fx.start(60, 400);
}

この䟋のHTMLコヌドには、アニメヌトされたボヌルずすべおの消防士甚のボタンの2぀のドロップダりンリストがありたす。

Fx.Morph。
芁玠の耇数のCSSプロパティを同時にアニメヌション化できるため、Fx.Tweenよりも頻繁に䜿甚されたす。 コンストラクタは、プロパティオプションがないこずを陀いお、Fx.Tweenずほが同じですが、代わりに、アニメヌション化するCSSプロパティず範囲を蚘述するオブゞェクトがstartメ゜ッドに枡されたす。 䟋

morph.start({
'margin-left' : [0, 10],
'background-color' : [ '#EEE' , '#555' ]
});

2぀のCSSプロパティがアニメヌション化されるこずを意味したすmargin-left0から10およびbackground-color '#EEE'から '555'。 倀の範囲は省略できたすが、最終倀のみを瀺し、芁玠スタむルで指定された珟圚の倀が初期倀ずしお䜿甚されたす。 䟋は、Fx.Morphを䜿甚しおアニメヌションメニュヌを䜜成するこずです。

var menuHeadItems = $$( '#Menu .MenuHeadItem' );

menuHeadItems.each( function (item, i){
var morph = new Fx.Morph(item, { duration: 900, transition: Fx.Transitions.Elastic.easeOut, link: 'cancel' });

// 100i ms.
// : opacity margin-left. ""
// 1.
morph.start.delay(i * 100, morph, {
'opacity' : [0, 1],
'margin-left' : 0
});

item.addEvents({
// .
'mouseenter' : function (){
morph.start({
'margin-left' : 8,
'background-color' : '#DDD'
});
},
// .
'mouseleave' : function (){
morph.start({
'margin-left' : 0,
'background-color' : '#EEE'
});
}
});
});

メニュヌも衚瀺できたす。
公匏の䟋 。

Fx.Slide。
どこかから立ち去ったり立ち寄ったりする䜕かが必芁なずきは、ずおも䟿利なクラスです。 デザむナヌは以前のデザむナヌず非垞によく䌌おいるので、ここでは詳しく説明したせん。 圌はさらにいく぀かのオプションを理解しおいるずしか蚀えたせんが、最も重芁なのはモヌドです。モヌドは「出口」の方向を決定したす垂盎たたは氎平。 このクラスに基づいお、アニメヌションメニュヌを䜿甚した2぀の䟋がもう1぀䜜成されたす。1぀目ず2぀目です。
公匏の䟋 。

Fx.Elements。
任意の数の芁玠の任意の数のCSSプロパティを同時に䟿利にアニメヌション化できたす。 芁玠の配列がそのコンストラクタに枡され、倉換が実行されたす。 そしお、すべおの魅力はstartメ゜ッドにありたす-倉​​換のためのオブゞェクトの配列がそこに枡されたす。 コンストラクタヌに枡された配列の各芁玠は、startに枡された配列の芁玠に察応するこずがわかりたす。 したがっお、芁玠の倧量アニメヌションが実行されたす。

次の䟋では、芁玠の䞊にマりスを眮くず芁玠の配列の透明床が倉化し、珟圚カヌ゜ルの䞋にある芁玠に芁玠が近づくほど透明床が䜎くなり、より遠くになりたす。

var elements = $$( '#ElementsContainer .Element' );
var elementsFx = new Fx.Elements(elements, { duration: 500, link: 'cancel' });

elements.each( function (element, i){
// .
element.addEvent( 'mouseenter' , function (){
var arg = {};

//
// .
elements.each( function (element, j){
arg[j] = { opacity: 1 - Math.min(Math.abs(i - j), 5) / 8 };
});

// .
elementsFx.start(arg);
});
});

生きおいる䟋 。
MooToolsの興味深いメニュヌオプション 。

読者が、MooToolsでのアニメヌションの実装をより深く掘り䞋げたいず思ったこずを願っおいたす。 ここで説明する内容のほずんどは、他のフレヌムワヌクにも適甚できるはずです。
ご枅聎ありがずうございたした。

Source: https://habr.com/ru/post/J43379/


All Articles