ホームページ > 記事 > ウェブフロントエンド > Javascriptパーフェクトモーションフレームワーク(コードを一行ずつ解析し、動きの原理を簡単に理解できる)_JavaScriptスキル
名前を聞いたら、このフレームワークを使用すると、基本的にすべてのオンライン効果を達成できることがすぐにわかります。実際、以前のモーション フレームワークにはまだ制限がありました。つまり、複数の値を一緒に動かすことができませんでした。
それでは、この問題をどうやって解決するのでしょうか? まずは前のモーションフレームを見てみましょう
function getStyle(obj, name) { if (obj.currentStyle) { return obj.currentStyle[name]; } else { return getComputedStyle(obj, null)[name]; } } function startMove(obj, attr, iTarget) { clearInterval(obj.time); obj.time = setInterval(function() { var cur = 0; if (attr == 'opacity') { cur = Math.round(parseFloat(getStyle(obj, attr)) * 100); } else { cur = parseInt(getStyle(obj, attr)); } var speed = (iTarget - cur) / 6; speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed); if (cur == iTarget) { clearInterval(obj.time); } else { if (attr == 'opacity') { obj.style.filter = 'alpha(opacity=' + cur + speed + ')'; obj.style.opacity = (cur + speed) / 100; } else { obj.style[attr] = cur + speed + 'px'; } } }, 30); }
それを変更するにはどうすればよいですか? 実際、これは非常に単純です。以前のフレームワークでは、一度に 1 つのスタイルと 1 つの値しか渡すことができませんでした。そこで、これらを json オブジェクトに変更します。誰もが理解できると信じています。
これを呼び出すと、startMove(oDiv,{width:200,height:200}); 必要に応じてコールバック関数を追加します。それでは、コードがどのように変更されるかを見てみましょう。
function startMove(obj, json, fnEnd) { var MAX=18; //每次调用就只有一个定时器在工作(开始运动时关闭已有定时器) //并且关闭或者开启都是当前物体的定时器,已防止与页面上其他定时器的冲突,使每个定时器都互不干扰 clearInterval(obj.timer); obj.timer=setInterval(function (){ var bStop=true; // 假设:所有的值都已经到了 for(var name in json) { var iTarget=json[name]; // 目标点 //处理透明度,不能使用parseInt否则就为0了 if(name=='opacity') { // *100 会有误差 0000007 之类的 所以要用 Math.round() 会四舍五入 var cur=Math.round(parseFloat(getStyle(obj, name))*100); } else { var cur=parseInt(getStyle(obj, name)); // cur 当前移动的数值 } var speed=(iTarget-cur)/5; // 物体运动的速度 数字越小动的越慢 /5 : 自定义的数字 speed=speed>0?Math.ceil(speed):Math.floor(speed); if(Math.abs(speed)>MAX)speed=speed>0?MAX:-MAX; if(name=='opacity') { obj.style.filter='alpha(opacity:'+(cur+speed)+')'; //IE obj.style.opacity=(cur+speed)/100; //ff chrome } else { obj.style[name]=cur+speed+'px'; } // 某个值不等于目标点 if(cur!=iTarget) { bStop=false; } } // 都达到了目标点 if(bStop) { clearInterval(obj.timer); if(fnEnd) //只有传了这个函数才去调用 { fnEnd(); } } }, 20); }
なぜ bstop が想定されているのでしょうか?
実際、startMove(oDiv,{width:101,height:200}); を呼び出すと、幅は 101 になり、移動は完了しますが、高さにはまだ達していませんが、現在のタイマー。動作が終了し、特殊な状況でのバグが発生します。説明:
実際には、すべての動作が完了したらタイマーをオフにする必要があります。逆に、失敗がない場合は、タイマーをオフにします。プログラムは、
を仮定して、最初は true であるブール値を定義します。すべての値が到着しました。目標点と等しくない値がある場合、bstop は false になります。 サイクル全体が終了した後、bstop が true の場合、すべての動作が完了したことを意味し、この時点でタイマーがオフになります。
これで、このモーション フレームワークは基本的に完成しました。css2 には適用できますが、css3 には適用できません。
概要:
モーションフレームワークの進化
startMove(iTarget) モーション フレーム
startMove(obj,iTarget) 複数のオブジェクト
startMove(obj,attr,iTarget) 任意の値
startMove(obj,attr,iTarget,fn) チェーン モーション
startMove(obj,json,fn) 完璧な動き
O(∩_∩)Oありがとうございます~