zepto源码研究 - fx_methods.js
简要:依赖fx.js,主要是针对show,hide,fadeIn,fadeOut的封装。
源码如下:
// Zepto.js
// (c) 2010-2015 Thomas Fuchs
// Zepto.js may be freely distributed under the MIT license. ;(function($, undefined){
var document = window.document, docElem = document.documentElement,
origShow = $.fn.show, origHide = $.fn.hide, origToggle = $.fn.toggle// origShow展示 origHide隐藏 origToggle展示隐藏开关 /**
* 便捷动画的核心方法
* @param el DOM
* @param speed 持续时间
* @param opacity 不透明度
* @param scale 缩放
* @param callback 回调
* @returns {*}
*/
// anim 主要针对缩放和透明度的过渡效果
// 对 animate方法的进一步的封装
function anim(el, speed, opacity, scale, callback) {
//修正参数 anim(el,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)//不支持速率变化,
} /**
* 底层方法:隐藏显示的元素
* @param el
* @param speed
* @param scale
* @param callback
* @returns {*}
*/
// TODO 这里既然是hide的功能,为什么还要传入scale参数 ,这里有点多余
function hide(el, speed, scale, callback) {
//不透明度设为0,即完全透明,相当于隐藏元素。这里的原理是播放不透明-透明的过渡。
//具体代码为 $(dom).animate({opacity: 0, '-webkit-transform-origin': '0px 0px 0px', '-webkit-transform': 'scale(0, 0)' },800)
//设置了变形原点,缩放为0,它就会缩到左上角再透明
return anim(el, speed, 0, scale, function(){
origHide.call($(this)) //调用隐藏
callback && callback.call(this)
})
} /**
* 显示
* @param speed 持续时间
* @param callback 回调函数
* @returns {*}
*/
$.fn.show = function(speed, callback) {
origShow.call(this)
//具体代码为 $(dom).animate({opacity: 1, '-webkit-transform-origin': '0px 0px 0px', '-webkit-transform': 'scale(1, 1)' },800)
//设置了变形原点,缩放为0,它就会缩到左上角再透明
if (speed === undefined) speed = 0
// TODO 这个if,else有点奇怪
else this.css('opacity', 0)
return anim(this, speed, 1, '1,1', callback)
} /**
* 隐藏
* @param speed 持续时间
* @param callback 回调函数
* @returns {*}
*/
// TODO 为什么在上一不要封装出hide函数,难道其他地方有调用
$.fn.hide = function(speed, callback) {
if (speed === undefined) return origHide.call(this)
else return hide(this, speed, '0,0', callback)
} /**
* 显示、隐藏开关
* @param speed 持续时间
* @param callback 回调函数
* @returns {*}
*/
$.fn.toggle = function(speed, callback) {
if (speed === undefined || typeof speed == 'boolean')
return origToggle.call(this, speed)
else return this.each(function(){
var el = $(this)
//这是toggle的关键逻辑
el[el.css('display') == 'none' ? 'show' : 'hide'](speed, callback)
})
} /**
* 淡入淡出
* 原理: $(dom).animate({opacity: 1/0, '-webkit-transform-origin': '0px 0px 0px'},800)
* @param speed 持续时间
* @param opacity 不透明度
* @param callback 回调函数
* @returns {*}
*/
// 淡入淡出总函数
$.fn.fadeTo = function(speed, opacity, callback) {
return anim(this, speed, opacity, null, callback)
} /**
* 淡入
* 原理: $(dom).animate({opacity: 1, '-webkit-transform-origin': '0px 0px 0px'},800)
* @param speed 持续时间
* @param callback 回调函数
* @returns {*}
*/
$.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)
} /**
* 淡出
* 原理: $(dom).animate({opacity: 0, '-webkit-transform-origin': '0px 0px 0px'},800)
* @param speed 持续时间
* @param callback 回调函数
* @returns {*}
*/
// fadeOut 会将元素先变为透明,然后隐藏
$.fn.fadeOut = function(speed, callback) {
return hide(this, speed, null, callback)
} /**
* 淡入淡出开关
* @param speed 持续时间
* @param callback 回调函数
* @returns {*}
*/
$.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)
})
} })(Zepto)
$.fn.show:
先调用原方法显示出来,如果参数有speed,callback则先让元素变透明调用anim逐步将元素显示出来,最后调用callback回调方法。
$.fn.hide:
和$.fn.show的过程相反,先调用anim将元素透明化,然后调用callback和原hide方法。当然,如果未传入参数,则直接隐藏。
$.fn.fadeIn:
首先将元素变为不透明,然后调用 origShow.call(this).fadeTo(speed,1, callback);
$.fn.fadeOut:
直接调用: hide(this, speed, null, callback) 注:$.fn.hide也调用了hide方法,但不同的是$.fn.hide要求非但透明化,并且以(0,0)为中心scale缩为0。
zepto源码研究 - fx_methods.js的更多相关文章
- zepto源码研究 - deferred.js(jquery-deferred.js)
简要:zepto的deferred.js 并不遵守promise/A+ 规范,而在jquery v3.0.0中的defer在一定程度上实现了promise/A+ ,因此本文主要研究jquery v3. ...
- zepto源码研究 - fx.js
简要:zepto 提供了一个基础方法animate来方便我们运用css动画.主要针对transform,animate以及普通属性(例如left,right,height,width等等)的trans ...
- zepto源码研究 - callback.js
简要:$.Callbacks是一个生成回调管家Callback的工厂,Callback提供一系列方法来管理一个回调列表($.Callbacks的一个私有变量list),包括添加回调函数, 删除回调函数 ...
- zepto源码研究 - ajax.js($.ajax具体流程分析)
简要:$.ajax是zepto发送请求的核心方法,$.get,$.post,$.jsonp都是封装了$.ajax方法.$.ajax将jsonp与异步请求的代码格式统一起来,内部主要是先处理url,数据 ...
- zepto源码研究 - ajax.js($.ajaxJSONP 的分析)
简要:jsonp是一种服务器和客户端信息传递方式,一般是利用script元素赋值src来发起请求.一般凡是带有src属性的元素发起的请求都是可以跨域的. 那么jsonp是如何获取服务器的数据的呢? j ...
- zepto源码研究 - ajax.js(请求过程中的各个事件分析)
简要:ajax请求具有能够触发各类事件的功能,包括:触发全局事件,请求发送前事件,请求开始事件,请求结束事件等等,贯穿整个ajax请求过程,这是非常有用的,我们可以利用这些事件来做一些非常有意思的事情 ...
- zepto源码研究 - zepto.js - 1
简要:网上已经有很多人已经将zepto的源码研究得很细致了,但我还是想写下zepto源码系列,将别人的东西和自己的想法写下来以加深印象也是自娱自乐,文章中可能有许多错误,望有人不吝指出,烦请赐教. 首 ...
- 读Zepto源码之fx_methods模块
fx 模块提供了 animate 动画方法,fx_methods 利用 animate 方法,提供一些常用的动画方法.所以 fx_methods 模块依赖于 fx 模块,在引入 fx_methods ...
- 从壹开始前后端分离 [ vue + .netcore 补充教程 ] 二八║ Nuxt 基础:面向源码研究Nuxt.js
前言 哈喽大家周五好,又是一个开开心心的周五了,接下来就是三天小团圆啦,这里先祝大家节日快乐咯,希望都没有加班哈哈,今天公司发了月饼,嗯~时间来不及了,上周应该搞个活动抽中几个粉丝发月饼的,下次吧,这 ...
随机推荐
- COS访谈第十八期:陈天奇
COS访谈第十八期:陈天奇 [COS编辑部按] 受访者:陈天奇 采访者:何通 编辑:王小宁 简介:陈天奇,华盛顿大学计算机系博士生,研究方向为大规模机器学习.他曾获得KDD CUP 20 ...
- TRAFFIC LIGHTS POJ 1158
题目大意: 在Dingilville 城市安排是一种不同寻常的方式,每个交叉路口有一条道路连接,一条道路最多连接两个不同的交叉路口.每个交叉路口不能连接他自己.道路旅行一端到另一端的时间是相同的,任何 ...
- HDOJ(HDU) 1976 Software Version(简单判断)
Problem Description 相信大家一定有过在网上下载软件而碰到多个不同版本的情况. 一般来说,软件的版本号由三个部分组成,主版本号(Major Version Number),子版本号( ...
- linux awk命令详解【转载】
本文转载自:http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html 简介 awk是一个强大的文本分析工具,相对于grep的查找 ...
- 《算法问题实战策略》-chaper17-部分和
数组上的一个基本优化——部分和: 对于一定长度的数组,我们想不断访问这个数组上的某个区间的和,我们能够怎么做呢?这里先不去谈一些数据结构在这个问题上的优化处理.首先我们最简单的一个方法就是穷举出所有区 ...
- 你不知道的关于计算机大师 Dijkstra 的事情
Dijkstra 的全名叫 Edsger Wybe Dijkstra(艾兹赫尔·韦伯·戴克斯特拉).大部分中国程序员如果能记住这个名字是因为学过计算最短路径的「Dijkstra 算法」,然而大部分人都 ...
- linux上使用netstat查看当前服务和监听端口
netstat这个命令常用在网络监控方面.利用这个命令,可以查看当前系统监听的服务和已经建立的服务,以及相应的端口.协议等信息. netstat参数说明 netstat参数虽然很多,但是常用的不多,主 ...
- python爬虫__第一个爬虫程序
前言 机缘巧合,最近在学习机器学习实战, 本来要用python来做实验和开发环境 得到一个需求,要爬取大众点评中的一些商户信息, 于是开启了我的第一个爬虫的编写,里面有好多心酸,主要是第一次. 我的文 ...
- 学习之路十四:客户端调用WCF服务的几种方法小议
最近项目中接触了一点WCF的知识,也就是怎么调用WCF服务,上网查了一些资料,很快就搞出来,可是不符合头的要求,主要有以下几个方面: ①WCF的地址会变动,地址虽变,但是里面的逻辑不变! ②不要引用W ...
- 工作的准备:atoi,itoa,strcpy,memcpy,strcmp,二分查找,strcat
对常见的几个函数,周末没事写写,绝对是笔试面试中非频繁,前面n届学长无数次强调了,大家就别怀疑了.从今天开始,每天10道题. int atoi(const char* str) { if(str==N ...