讀Zepto源碼之fx_methods模塊

fx 模塊提供了 animate 動畫方法,fx_methods 利用 animate 方法,提供一些經常使用的動畫方法。因此 fx_methods 模塊依賴於 fx 模塊,在引入 fx_methods 前必須引入 fx 模塊。javascript

讀 Zepto 源碼系列文章已經放到了github上,歡迎star: reading-zeptocss

源碼版本

本文閱讀的源碼爲 zepto1.2.0java

GitBook

reading-zeptonode

內部方法

anim

function anim(el, speed, opacity, scale, callback) {
  if (typeof speed == 'function' && !callback) callback = speed, speed = undefined
  var props = { opacity: opacity }
  if (scale) {
    props.scale = scale
    el.css($.fx.cssPrefix + 'transform-origin', '0 0')
  }
  return el.animate(props, speed, null, callback)
}

若是 speed 的參數類型爲函數,而且 callback 沒有傳遞,則認爲 speed 位置的參數爲 callbackgit

props 是過渡的屬性, fx_fethods 主要實現 showhidefadeInfadeOut 等動畫,用到的過渡屬性爲 opecityscalegithub

當爲 scale 時,將轉換的原點設置爲 0 0ide

最後調用的是 fx 模塊中的 animate 方法。函數

hide

var document = window.document, docElem = document.documentElement,
    origShow = $.fn.show, origHide = $.fn.hide, origToggle = $.fn.toggle
function hide(el, speed, scale, callback) {
  return anim(el, speed, 0, scale, function(){
    origHide.call($(this))
    callback && callback.call(this)
  })
}

hide 方法其實就是將 opacity 的屬性設置爲 0 。在動畫完成後,調用 origHide 方法,即原有的 hide 方法,將元素的 display 設置爲 none。原有的 hide 方法分析見《讀Zepto源碼之樣式操做工具

.show()

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

show 方法首先調用原有的 hide 方法,將元素顯示出來,這是實現動畫的基本條件。動畫

若是沒有設置 speed, 表示不須要動畫,則過渡時間 speed 設置爲 0。當即顯示元素。

不然,先將 opactity 設置爲 0, 再調用 anim 方法執行動畫。opacity 設置爲 0 也是執行動畫的關鍵,從 0 變爲 1 纔有過渡的效果。

.hide()

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

若是 speed 沒有傳遞,簡單調用原有的 hide 方法便可,由於不須要過渡效果。

不然調用內部方法 hide

.toggle()

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

toggle 方法是 showhide 方法的切換。

若是 speed 沒有傳遞,或者爲 boolean 值,則表示不須要動畫,調用原有的 toggle 方法便可。爲何要有一個 boolean 值的判斷呢,這要看回 《讀Zepto源碼之樣式操做》關於 toggle 方法的分析了,原有的 toggle 方法接收一個參數,若是爲 true,則指定調用 show 方法,不然調用 hide 方法。

不然,判斷每一個元素的 display 屬性值,若是爲 none,則調用 show 方法顯示,不然調用 hide 方法隱藏。

.fadeTo()

$.fn.fadeTo = function(speed, opacity, callback) {
  return anim(this, speed, opacity, null, callback)
}

fadeTo 能夠實際上是經過調節過渡時間 speed 和透明度 opacity 來實現動畫效果。

showhide 不一樣的是,fadeToopacity 不必定爲 1 或者 0, 能夠由調用者指定。

.fadeIn()

$.fn.fadeIn = function(speed, callback) {
  var target = this.css('opacity')
  if (target > 0) this.css('opacity', 0)
  else target = 1
  return origShow.call(this).fadeTo(speed, target, callback)
}

淡入效果。

fadeIn 其實調用的是 fadeTo ,跟 show 有點相似,最終將 opacity 變爲 1 。只是不處理 scale 變形。

.fadeOut()

$.fn.fadeOut = function(speed, callback) {
  return hide(this, speed, null, callback)
}

淡出。

fadeOut 調用的是 hide 方法,只是不處理 scale 變形。

.fadeToggle()

$.fn.fadeToggle = function(speed, callback) {
  return this.each(function(){
    var el = $(this)
    el[
      (el.css('opacity') == 0 || el.css('display') == 'none') ? 'fadeIn' : 'fadeOut'
    ](speed, callback)
  })
}

切換淡入淡出效果。

若是 displaynode 時,調用 fadeIn 方法顯示,不然調用 fadeOut 方法隱藏。

系列文章

  1. 讀Zepto源碼之代碼結構
  2. 讀Zepto源碼以內部方法
  3. 讀Zepto源碼之工具函數
  4. 讀Zepto源碼之神奇的$
  5. 讀Zepto源碼之集合操做
  6. 讀Zepto源碼之集合元素查找
  7. 讀Zepto源碼之操做DOM
  8. 讀Zepto源碼之樣式操做
  9. 讀Zepto源碼之屬性操做
  10. 讀Zepto源碼之Event模塊
  11. 讀Zepto源碼之IE模塊
  12. 讀Zepto源碼之Callbacks模塊
  13. 讀Zepto源碼之Deferred模塊
  14. 讀Zepto源碼之Ajax模塊
  15. 讀Zepto源碼之Assets模塊
  16. 讀Zepto源碼之Selector模塊
  17. 讀Zepto源碼之Touch模塊
  18. 讀Zepto源碼之Gesture模塊
  19. 讀Zepto源碼之IOS3模塊
  20. 讀Zepto源碼之Fx模塊

參考

License

署名-非商業性使用-禁止演繹 4.0 國際 (CC BY-NC-ND 4.0)

做者:對角另外一面

相關文章
相關標籤/搜索