Zepto.jsのソースコード解読:fx_methodsモジュール

fxモジュールはanimateアニメーションメソッドを提供し、fx_methodsはこのanimateメソッドを利用して、一般的なアニメーションメソッドを提供します。そのため、fx_methodsモジュールはfxモジュールに依存しており、fx_methodsをインポートする前にfxモジュールをインポートする必要があります。

内部メソッド

performAnimation

function performAnimation(element, duration, targetOpacity, scaleValue, completeCallback) {
  if (typeof duration === 'function' && !completeCallback) {
    completeCallback = duration;
    duration = undefined;
  }
  const animationProps = { opacity: targetOpacity };
  if (scaleValue) {
    animationProps.scale = scaleValue;
    element.css($.fx.cssPrefix + 'transform-origin', '0 0');
  }
  return element.animate(animationProps, duration, null, completeCallback);
}

durationのパラメータタイプが関数であり、かつcompleteCallbackが渡されていない場合、durationの位置のパラメータはcompleteCallbackと見なされます。

animationPropsはトランジションのプロパティです。fx_methodsは主にshowhidefadeInfadeOutなどのアニメーションを実装しており、使用されるトランジションプロパティはopacityscaleです。

scaleが指定されている場合、変換の原点を0 0に設定します。

最終的にfxモジュールのanimateメソッドが呼び出されます。

executeHide

function executeHide(element, duration, scale, completeCallback) {
  return performAnimation(element, duration, 0, scale, function() {
    origHide.call($(this));
    if (completeCallback) completeCallback.call(this);
  });
}

executeHide関数は、opacityのプロパティを0に設定することで要素を非表示にします。アニメーションが完了した後、origHideメソッドが呼び出され、要素のdisplaynoneに設定されます。元のhideメソッドの分析については、「Zeptoソースコードのスタイル操作」を参照してください。

.show()

$.fn.show = function(duration, callback) {
  origShow.call(this);
  if (duration === undefined) {
    duration = 0;
  } else {
    this.css('opacity', 0);
  }
  return performAnimation(this, duration, 1, '1,1', callback);
}

showメソッドはまず元のhideメソッドを呼び出し、要素を表示します。これがアニメーションの基本的な条件です。

durationが設定されていない場合、アニメーションは不要であることを意味し、トランジション時間duration0に設定されます。要素を即座に表示します。

それ以外の場合、まずopacity0に設定し、その後performAnimationメソッドを呼び出してアニメーションを実行します。opacity0に設定することも、0から1に変化するトランジション効果を得るための鍵です。

.hide()

$.fn.hide = function(duration, callback) {
  if (duration === undefined) {
    return origHide.call(this);
  } else {
    return executeHide(this, duration, '0,0', callback);
  }
}

durationが渡されていない場合、元のhideメソッドを単に呼び出すだけで済みます。トランジション効果は不要だからです。

それ以外の場合は、内部メソッドexecuteHideを呼び出します。

.toggle()

$.fn.toggle = function(duration, callback) {
  if (duration === undefined || typeof duration === 'boolean') {
    return origToggle.call(this, duration);
  } else {
    return this.each(function() {
      const element = $(this);
      const currentDisplay = element.css('display');
      element[currentDisplay === 'none' ? 'show' : 'hide'](duration, callback);
    });
  }
}

toggleメソッドはshowhideメソッドの切り替えです。

durationが渡されていない場合、またはboolean値の場合、アニメーションは不要であることを意味し、元のtoggleメソッドを呼び出すだけで済みます。なぜboolean値の判断が必要なのかについては、「Zeptoソースコードのスタイル操作」のtoggleメソッドの分析を参照してください。元のtoggleメソッドは1つのパラメータを受け取り、trueの場合はshowメソッドを呼び出すように指定し、そうでない場合はhideメソッドを呼び出します。

それ以外の場合、各要素のdisplayプロパティの値を判断し、noneの場合はshowメソッドを呼び出して表示し、そうでない場合はhideメソッドを呼び出して非表示にします。

.fadeTo()

$.fn.fadeTo = function(duration, targetOpacity, callback) {
  return performAnimation(this, duration, targetOpacity, null, callback);
}

fadeToは、トランジション時間durationと透明度targetOpacityを調整することでアニメーション効果を実現します。

showhideとは異なり、fadeTotargetOpacityは必ずしも1または0である必要はなく、呼び出し元が指定できます。

.fadeIn()

$.fn.fadeIn = function(duration, callback) {
  const currentOpacity = parseFloat(this.css('opacity'));
  const targetOpacity = currentOpacity > 0 ? 0 : 1;
  this.css('opacity', targetOpacity);
  return origShow.call(this).fadeTo(duration, 1, callback);
}

フェードイン効果。

fadeInは実際にはfadeToを呼び出しており、showと少し似ています。最終的にopacity1にします。ただし、scaleの変形は処理しません。

.fadeOut()

$.fn.fadeOut = function(duration, callback) {
  return executeHide(this, duration, null, callback);
}

フェードアウト。

fadeOutexecuteHideメソッドを呼び出しますが、scaleの変形は処理しません。

.fadeToggle()

$.fn.fadeToggle = function(duration, callback) {
  return this.each(function() {
    const element = $(this);
    const currentOpacity = parseFloat(element.css('opacity'));
    const currentDisplay = element.css('display');
    element[(currentOpacity === 0 || currentDisplay === 'none') ? 'fadeIn' : 'fadeOut'](duration, callback);
  });
}

フェードイン・フェードアウトの切り替え効果。

displaynoneの場合、fadeInメソッドを呼び出して表示し、そうでない場合はfadeOutメソッドを呼び出して非表示にします。

タグ: zepto.js javascript Animation source-code

6月30日 21:26 投稿