bootstrap之transition

本文从源码角度探讨Bootstrap的transition机制,包括transitionEnd事件的浏览器兼容处理、emulateTransitionEnd的定时器补偿机制以及event.special.bsTransitionEnd的jQuery事件委托。通过对这些关键部分的分析,有助于更深入地了解Bootstrap的动画功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、前言

最近一段时间研究了下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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值