thisisid 2019-06-25
fx 模块提供了 animate 动画方法,fx_methods 利用 animate 方法,提供一些常用的动画方法。所以 fx_methods 模块依赖于 fx 模块,在引入 fx_methods 前必须引入 fx 模块。
读 Zepto 源码系列文章已经放到了github上,欢迎star: reading-zepto
本文阅读的源码为 zepto1.2.0
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 位置的参数为 callback。
props 是过渡的属性, fx_fethods 主要实现 show 、 hide 和 fadeIn、 fadeOut 等动画,用到的过渡属性为 opecity 和 scale 。
当为 scale 时,将转换的原点设置为 0 0。
最后调用的是 fx 模块中的 animate 方法。
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源码之样式操作》
$.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 才有过渡的效果。
$.fn.hide = function(speed, callback) {
if (speed === undefined) return origHide.call(this)
else return hide(this, speed, '0,0', callback)
}如果 speed 没有传递,简单调用原有的 hide 方法即可,因为不需要过渡效果。
否则调用内部方法 hide。
$.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 方法是 show 和 hide 方法的切换。
如果 speed 没有传递,或者为 boolean 值,则表示不需要动画,调用原有的 toggle 方法即可。为什么要有一个 boolean 值的判断呢,这要看回 《读Zepto源码之样式操作》关于 toggle 方法的分析了,原有的 toggle 方法接收一个参数,如果为 true,则指定调用 show 方法,否则调用 hide 方法。
否则,判断每个元素的 display 属性值,如果为 none,则调用 show 方法显示,否则调用 hide 方法隐藏。
$.fn.fadeTo = function(speed, opacity, callback) {
return anim(this, speed, opacity, null, callback)
}fadeTo 可以其实是通过调节过渡时间 speed 和透明度 opacity 来实现动画效果。
和 show 和 hide 不同的是,fadeTo 的 opacity 不一定为 1 或者 0, 可以由调用者指定。
$.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 变形。
$.fn.fadeOut = function(speed, callback) {
return hide(this, speed, null, callback)
}淡出。
fadeOut 调用的是 hide 方法,只是不处理 scale 变形。
$.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)
})
}切换淡入淡出效果。
如果 display 为 node 时,调用 fadeIn 方法显示,否则调用 fadeOut 方法隐藏。
署名-非商业性使用-禁止演绎 4.0 国际 (CC BY-NC-ND 4.0)
最后,所有文章都会同步发送到微信公众号上,欢迎关注,欢迎提意见: 
作者:对角另一面