-
-
Save ifthenelse/f8c48d5c64e51739a2b5d566e779c9c7 to your computer and use it in GitHub Desktop.
Quick jQuery plugin to get the duration of a CSS transition for an element. Support multiple transition values
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* jQuery.getTransitionDuration | |
* A jQuery plugin to get transition-duration in milliseconds | |
* Works with multiple values and supports all browser vendor prefixes | |
* | |
* Usage with single transition-duration values $(div).getTsDuration() | |
* Usage with multiple transition-duration values $(div).getTsDuration("opacity") (otherwise would return the first) | |
* | |
* Based on a gist by Chris Montes https://gist.github.com/mandelbro/4067903 | |
*/ | |
(function(factory) { | |
if (typeof define === 'function' && define.amd) { | |
// AMD. Register as an anonymous module. | |
define(['jquery'], factory); | |
} else if (typeof module === 'object' && module.exports) { | |
// Node/CommonJS | |
module.exports = function(root, jQuery) { | |
if (jQuery === undefined) { | |
if (typeof window !== 'undefined') { | |
jQuery = require('jquery'); | |
} else { | |
jQuery = require('jquery')(root); | |
} | |
} | |
factory(jQuery, window, document); | |
return jQuery; | |
}; | |
} else { | |
// Browser globals | |
factory(jQuery, window, document); | |
} | |
}(function($, window, document, undefined) { | |
"use strict"; | |
var pluginName = "getTsDuration", | |
defaults = { | |
property: "", | |
}; | |
// The actual plugin constructor | |
function Plugin(element, o) { | |
this.element = element; | |
// make options an object | |
var options = (typeof o !== "undefined" && typeof o !== "object") ? { property: "" + o } : o; | |
this.settings = $.extend({}, defaults, options); | |
this._defaults = defaults; | |
this._name = pluginName; | |
this.init(); | |
} | |
// Avoid Plugin.prototype conflicts | |
$.extend(Plugin.prototype, { | |
init: function() { | |
var propRx = new RegExp(this.settings.property, 'g'), | |
propArray = (this.element.style.transitionProperty.length) ? this.element.style.transitionProperty.split(", ") : false, | |
propItem = "", | |
propIndex = 0; | |
// if there are multiple values, get the position of the property reqeusted | |
if (!!propArray && propArray.length) { | |
propItem = propArray.find(function(v) { return propRx.test(v); }); | |
propIndex = propArray.indexOf(propItem); | |
} | |
// check the main transition duration property | |
if (this.element.style.transitionDuration) { | |
return Math.round(parseFloat(this.element.style.transitionDuration.split(", ")[propIndex]) * 1000); | |
} else { | |
// check the vendor transition duration properties | |
if (!!this.element.style.webkitTranstionDuration) return Math.round(parseFloat(this.element.style.webkitTranstionDuration.split(", ")[propIndex]) * 1000); | |
if (!!this.element.style.mozTranstionDuration) return Math.round(parseFloat(this.element.style.mozTranstionDuration.split(", ")[propIndex]) * 1000); | |
if (!!this.element.style.msTranstionDuration) return Math.round(parseFloat(this.element.style.msTranstionDuration.split(", ")[propIndex]) * 1000); | |
if (!!this.element.style.oTranstionDuration) return Math.round(parseFloat(this.element.style.oTranstionDuration.split(", ")[propIndex]) * 1000); | |
} | |
// if we're here, then no transition duration was found, return 0 | |
return 0; | |
} | |
}); | |
$.fn[pluginName] = function(options) { | |
return this.each(function() { | |
if (!$.data(this, "plugin_" + pluginName)) { | |
$.data(this, "plugin_" + | |
pluginName, new Plugin(this, options)); | |
} | |
}); | |
}; | |
})); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment