bootstrap之transition

来源:互联网 发布:好伙伴物流软件 编辑:程序博客网 时间:2024/05/19 12:18

一、前言

最近一段时间研究了下bootstrap源码,现在开始总结,先从transition(动画)开始。

二、源码

 /* ========================================================================  * Bootstrap: transition.js v3.3.7(动画过渡)  * http://getbootstrap.com/javascript/#transitions  * ========================================================================  * Copyright 2011-2016 Twitter, Inc.  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)  * ======================================================================== */ +function ($) {   'use strict';   // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)   // ============================================================   // 判断浏览器是否支持哪种transitionEnd,如果不支持则返回false   function transitionEnd() {     var el = document.createElement('bootstrap')     var transEndEventNames = {       WebkitTransition : 'webkitTransitionEnd',       MozTransition    : 'transitionend',       OTransition      : 'oTransitionEnd otransitionend',       transition       : 'transitionend'     }     for (var name in transEndEventNames) {       if (el.style[name] !== undefined) {         return { end: transEndEventNames[name] }       }     }     return false // explicit for ie8 (  ._.)   }   // http://blog.alexmaccaw.com/css-transitions   $.fn.emulateTransitionEnd = function (duration) {     var called = false     var $el = this     $(this).one('bsTransitionEnd', function () { called = true })     // 如果没有监听到了bsTransitionEnd,那么采用定时器触发事件     var callback = function () { if (!called) $($el).trigger($.support.transition.end) }     setTimeout(callback, duration)     return this   }   // 初始化   $(function () {     $.support.transition = transitionEnd()     if (!$.support.transition) return     // 用于传入事件类型,来自定义事件。这样就能自己添加事件$el.one('bsTransitionEnd', function() {}),而不用$el.one($.support.transition.end, function() {})     $.event.special.bsTransitionEnd = {       bindType: $.support.transition.end,       delegateType: $.support.transition.end,       handle: function (e) {         if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)       }     }   }) }(jQuery);

三、源码分析

1、transitionEnd

遍历各浏览器兼容的transitionEnd,判断哪个是当前浏览器兼容,并返回。

2、emulateTransitionEnd

当监听到bsTransitionEnd设置called标志量为true,并设置定时器,如果bsTransitionEnd没有被触发,那么采用定时器来触发transitionEnd事件。

3、event.special.bsTransitionEnd

采用jQuery处理特殊的事件,将兼容的transitionEnd委托为bsTransitionEnd。