讀Zepto源碼之fx_methods模塊

fx 模塊提供了 animate 動畫方法弯屈,fx_methods 利用 animate 方法蔽莱,提供一些常用的動畫方法捻激。所以 fx_methods 模塊依賴于 fx 模塊蛾娶,在引入 fx_methods 前必須引入 fx 模塊括勺。

讀 Zepto 源碼系列文章已經(jīng)放到了github上缆八,歡迎star: reading-zepto

源碼版本

本文閱讀的源碼為 zepto1.2.0

GitBook

reading-zepto

內(nèi)部方法

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 的參數(shù)類型為函數(shù),并且 callback 沒有傳遞疾捍,則認為 speed 位置的參數(shù)為 callback奈辰。

props 是過渡的屬性, fx_fethods 主要實現(xiàn) show 乱豆、 hidefadeIn奖恰、 fadeOut 等動畫,用到的過渡屬性為 opecityscale 宛裕。

當為 scale 時瑟啃,將轉(zhuǎn)換的原點設置為 0 0

最后調(diào)用的是 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 翰守。在動畫完成后,調(diào)用 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 方法首先調(diào)用原有的 hide 方法朗恳,將元素顯示出來湿颅,這是實現(xiàn)動畫的基本條件。

如果沒有設置 speed粥诫, 表示不需要動畫油航,則過渡時間 speed 設置為 0。立即顯示元素怀浆。

否則谊囚,先將 opactity 設置為 0, 再調(diào)用 anim 方法執(zhí)行動畫执赡。opacity 設置為 0 也是執(zhí)行動畫的關鍵镰踏,從 0 變?yōu)?1 才有過渡的效果。

.hide()

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

如果 speed 沒有傳遞沙合,簡單調(diào)用原有的 hide 方法即可奠伪,因為不需要過渡效果。

否則調(diào)用內(nèi)部方法 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 值,則表示不需要動畫滤否,調(diào)用原有的 toggle 方法即可脸狸。為什么要有一個 boolean 值的判斷呢,這要看回 《讀Zepto源碼之樣式操作》關于 toggle 方法的分析了藐俺,原有的 toggle 方法接收一個參數(shù)肥惭,如果為 true,則指定調(diào)用 show 方法紊搪,否則調(diào)用 hide 方法蜜葱。

否則,判斷每個元素的 display 屬性值耀石,如果為 none牵囤,則調(diào)用 show 方法顯示,否則調(diào)用 hide 方法隱藏滞伟。

.fadeTo()

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

fadeTo 可以其實是通過調(diào)節(jié)過渡時間 speed 和透明度 opacity 來實現(xiàn)動畫效果揭鳞。

showhide 不同的是,fadeToopacity 不一定為 1 或者 0梆奈, 可以由調(diào)用者指定野崇。

.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 其實調(diào)用的是 fadeTo 亩钟,跟 show 有點類似乓梨,最終將 opacity 變?yōu)?1 。只是不處理 scale 變形清酥。

.fadeOut()

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

淡出扶镀。

fadeOut 調(diào)用的是 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 時,調(diào)用 fadeIn 方法顯示辱志,否則調(diào)用 fadeOut 方法隱藏蝠筑。

系列文章

  1. 讀Zepto源碼之代碼結(jié)構
  2. 讀Zepto源碼之內(nèi)部方法
  3. 讀Zepto源碼之工具函數(shù)
  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

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

最后,所有文章都會同步發(fā)送到微信公眾號上揩懒,歡迎關注,歡迎提意見:

作者:對角另一面

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末什乙,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子旭从,更是在濱河造成了極大的恐慌稳强,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,222評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件和悦,死亡現(xiàn)場離奇詭異退疫,居然都是意外死亡,警方通過查閱死者的電腦和手機鸽素,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,455評論 3 385
  • 文/潘曉璐 我一進店門褒繁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人馍忽,你說我怎么就攤上這事棒坏。” “怎么了遭笋?”我有些...
    開封第一講書人閱讀 157,720評論 0 348
  • 文/不壞的土叔 我叫張陵坝冕,是天一觀的道長。 經(jīng)常有香客問我瓦呼,道長喂窟,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,568評論 1 284
  • 正文 為了忘掉前任央串,我火速辦了婚禮磨澡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘质和。我一直安慰自己稳摄,他們只是感情好,可當我...
    茶點故事閱讀 65,696評論 6 386
  • 文/花漫 我一把揭開白布饲宿。 她就那樣靜靜地躺著厦酬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瘫想。 梳的紋絲不亂的頭發(fā)上辉阶,一...
    開封第一講書人閱讀 49,879評論 1 290
  • 那天,我揣著相機與錄音贯要,去河邊找鬼镰官。 笑死,一個胖子當著我的面吹牛支竹,可吹牛的內(nèi)容都是我干的旋廷。 我是一名探鬼主播,決...
    沈念sama閱讀 39,028評論 3 409
  • 文/蒼蘭香墨 我猛地睜開眼礼搁,長吁一口氣:“原來是場噩夢啊……” “哼饶碘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起馒吴,我...
    開封第一講書人閱讀 37,773評論 0 268
  • 序言:老撾萬榮一對情侶失蹤扎运,失蹤者是張志新(化名)和其女友劉穎瑟曲,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體豪治,經(jīng)...
    沈念sama閱讀 44,220評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡洞拨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,550評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了负拟。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片烦衣。...
    茶點故事閱讀 38,697評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖掩浙,靈堂內(nèi)的尸體忽然破棺而出花吟,到底是詐尸還是另有隱情,我是刑警寧澤厨姚,帶...
    沈念sama閱讀 34,360評論 4 332
  • 正文 年R本政府宣布衅澈,位于F島的核電站,受9級特大地震影響谬墙,放射性物質(zhì)發(fā)生泄漏矾麻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,002評論 3 315
  • 文/蒙蒙 一芭梯、第九天 我趴在偏房一處隱蔽的房頂上張望险耀。 院中可真熱鬧,春花似錦玖喘、人聲如沸甩牺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,782評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽贬派。三九已至,卻和暖如春澎媒,著一層夾襖步出監(jiān)牢的瞬間搞乏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,010評論 1 266
  • 我被黑心中介騙來泰國打工戒努, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留请敦,地道東北人。 一個月前我還...
    沈念sama閱讀 46,433評論 2 360
  • 正文 我出身青樓储玫,卻偏偏與公主長得像侍筛,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子撒穷,可洞房花燭夜當晚...
    茶點故事閱讀 43,587評論 2 350

推薦閱讀更多精彩內(nèi)容