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。

时间: 2024-10-23 12:07:30

zepto源码研究 - fx_methods.js的相关文章

zepto源码研究 - deferred.js(jquery-deferred.js)

简要:zepto的deferred.js 并不遵守promise/A+ 规范,而在jquery v3.0.0中的defer在一定程度上实现了promise/A+ ,因此本文主要研究jquery v3.0.0中的defer. 首先   在上源码前,本人觉得有必要认识一下promise/A+ 规范:https://segmentfault.com/a/1190000002452115 接下来上源码: define( [ "./core", "./var/slice",

zepto源码研究 - callback.js

简要:$.Callbacks是一个生成回调管家Callback的工厂,Callback提供一系列方法来管理一个回调列表($.Callbacks的一个私有变量list),包括添加回调函数, 删除回调函数等等...,话不多说看正文: var memory, // Last fire value (for non-forgettable lists) fired, // Flag to know if list was already fired //是否回调过 firing, // Flag to

zepto源码研究 - zepto.js - 6(模板方法)

width  height  模板方法   读写width/height ['width', 'height'].forEach(function(dimension){ //将width,hegiht转成Width,Height,用于document获取 var dimensionProperty = dimension.replace(/./, function(m){ return m[0].toUpperCase() }) $.fn[dimension] = function(value

zepto源码研究 - zepto.js-4(常用的工具)

$.each: /** * 以集合每一个元素作为上下文,来执行回调函数 * @param elements * @param callback * @returns {*} */ $.each = function(elements, callback){ var i, key if (likeArray(elements)) { //数组.伪数组 for (i = 0; i < elements.length; i++) if (callback.call(elements[i], i, el

underscore.js源码研究(8)

概述 很早就想研究underscore源码了,虽然underscore.js这个库有些过时了,但是我还是想学习一下库的架构,函数式编程以及常用方法的编写这些方面的内容,又恰好没什么其它要研究的了,所以就了结研究underscore源码这一心愿吧. underscore.js源码研究(1) underscore.js源码研究(2) underscore.js源码研究(3) underscore.js源码研究(4) underscore.js源码研究(5) underscore.js源码研究(6)

【JavaScript】$.extend使用心得及源码研究

最近写多了js的面向对象编程,用$.extend写继承写得很顺手.但是在使用过程中发现有几个问题. 1.深拷贝 $.extend默认是浅拷贝,这意味着在继承复杂对象时,对象中内嵌的对象无法被拷贝到. 因此如果要深拷贝,则需要将第一个参数设置为true. 如: var a = { a:1 }; var b = { b:{c:1} }; $.extend(a,b); a = { a:1,b:{c:1} }; 2.对象覆盖 在进行面向对象编程时,有这么一种情况. 比如有一个公共对象,某个类在实例化的时

自写图片遮罩层放大功能jquery插件源码,photobox.js 1.0版,不兼容IE6

阿嚏~~~ 话说本屌丝没啥开发插件的经验,但是天公不作美,公司需要让我自己开发个图片放大的插件 但公司老大的话,犹如吾皇之圣旨,微臣必当肝脑涂地,莫敢不从啊~~~ 于是乎,作为一个超级小白,本人只能瞎研究了,幸好黑天不负屌丝人,本屌丝终于搞出来了,虽然不尽善尽美,但是功能还是可以用的啦 先附上源码,求各种大神指导: /******************************* * photobox跨浏览器兼容插件 v1.0(不支持IE6) * 格式:<a href="big.jpg&q

Zepto源码分析之二~三个API

由于时间关系:本次只对这三个API($.camelCase.$.contains.$.each)方法进行分析 第一个方法变量转驼峰:$.camelCase('hello-world-welcome'); 源码: var camelize; /** * 字符串替换 * 使用replace第二个参数带回调 */ camelize = function(str) { return str.replace(/-+(.)?/g, function(match, chr) { return chr ? ch

Chrome自带恐龙小游戏的源码研究(完)

在上一篇<Chrome自带恐龙小游戏的源码研究(七)>中研究了恐龙与障碍物的碰撞检测,这一篇主要研究组成游戏的其它要素. 游戏分数记录 如图所示,分数及最高分记录显示在游戏界面的右上角,每达到100分就会出现闪烁特效,游戏第一次gameover时显示历史最高分.分数记录器由DistanceMeter构造函数实现,以下是它的全部代码: 1 DistanceMeter.dimensions = { 2 WIDTH: 10, //每个字符的宽度 3 HEIGHT: 13, //每个字符的高 4 DE