5.1.2 源码分析
动画过渡效果不是标准的插件,而是一个判断动画的工具方法,所以没有遵守JavaScript插件的标准开发步骤。Bootstrap的transition.js文件用于将浏览器是否支持动画的标记赋值给$.support.transition属性,其他插件在使用的时候可以直接从$.support.transition属性获取相应的值。transition.js源码如下所示:
- +function ($) {
- 'use strict'; // 严格模式
- function transitionEnd() {
- var el = document.createElement('bootstrap') // 创建一个自定义标签做测试
- var transEndEventNames = { // 用于检测CSS3 transition结束时的回调事件
- 'WebkitTransition': 'webkitTransitionEnd',// Webkit浏览器事件
- 'MozTransition': 'transitionend', // Mozlia浏览器事件
- 'OTransition': 'oTransitionEnd otransitionend', // Opera浏览器事件
- 'transition': 'transitionend' // 其他浏览器事件
- }
- for (var name in transEndEventNames) {
- if (el.style[name] !== undefined) {
- return { end: transEndEventNames[name] }
- // 如果支持动画事件,则返回对象字面量,如果没有,默认返回undefind
- }
- }
- return false // 解决 IE8下的bug
- }
- $.fn.emulateTransitionEnd = function (duration) { // 触发动画事件
- var called = false, $el = this
- $(this).one($.support.transition.end, function () { called = true })
- var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
- setTimeout(callback, duration) // 根据传入的延迟毫秒数,再触发
- return this
- }
- $(function () {
- $.support.transition = transitionEnd() // 全局赋值
- })
- }(jQuery);
通过源码可以看出,$.support.transition属性的值是{end:事件名称},插件在确定支持动画的情况下,给该事件绑定其他额外的处理代码,以便在触发时进行调用。示例如下:
- $.support.transition && this.$element.hasClass('fade')?
- this.$backdrop.one($.support.transition.end, callback) : callback()
该代码的意思是如果浏览器支持动画,并且元素上也设置了启用动画(fade),则在动画结束的时候才继续执行callback代码(即在$.support.transition.end上绑定callback),否则直接执行callback代码。
有很多效果都用到了动画,动画特效本身的代码都在CSS里设置,一般都是通过元素内部定义fade样式,fade的源码如下:
- // 源码2346行
- .fade {
- opacity: 0; /*100%透明*/
- -webkit-transition: opacity .15s linear; /*透明度,匀速变化0.15秒*/
- transition: opacity .15s linear;
- }
- .fade.in { /*应用in样式,表示全部打开*/
- opacity: 1; /*完全不透明*/
- }
fade样式在弹窗弹出以后的源码设置如下:
- // 源码5109行
- .modal.fade .modal-dialog {
- -webkit-transition: -webkit-transform .3s ease-out; /*减速运行*/
- -moz-transition: -moz-transform .3s ease-out;
- -o-transition: -o-transform .3s ease-out;
- transition: transform .3s ease-out;
- -webkit-transform: translate(0, -25%); /*向下移动25%的距离,从而产生向下的动画视觉*/
- -ms-transform: translate(0, -25%);
- transform: translate(0, -25%);
- }
- .modal.in .modal-dialog { /*页面完整显示时,回归到原始位置*/
- -webkit-transform: translate(0, 0);
- -ms-transform: translate(0, 0);
- transform: translate(0, 0);
- }