// ========================= jQuery transform extensions =============================== (function($){ // if props.transform hasn't been set, do it already $.props.transform = getStyleProperty('transform'); var optoTransform = { fnUtilsDimensional : { '2d' : { translate : function ( position ) { return 'translate(' + position[0] + 'px, ' + position[1] + 'px) '; }, scale : function ( scale ) { return 'scale(' + scale[0] + ') '; } }, '3d' : { translate : function ( position ) { return 'translate3d(' + position[0] + 'px, ' + position[1] + 'px, 0) '; }, scale : function ( scale ) { return 'scale3d(' + scale[0] + ', ' + scale[0] + ', 1) '; } } }, dimensions : Modernizr.csstransforms3d ? '3d' : '2d', // always do translate then scale transforms : [ 'translate', 'scale' ] }; optoTransform.fnUtils = optoTransform.fnUtilsDimensional[ optoTransform.dimensions ]; optoTransform.transformsLen = 2; var _jQueryStyle = $.style; $.style = function ( elem, name, value ) { switch ( name ) { case 'scale' : case 'translate' : // unpack current transform data var data = $( elem ).data('opto-transform') || {}, // extend new value over current data newData = {}, fnName, transformObj = {}; newData[ name ] = value; $.extend( data, newData ); for ( fnName in data ) { var transformValue = data[ fnName ], getFn = optoTransform.fnUtils[ fnName ]; transformObj[ fnName ] = getFn( transformValue ); } // get proper order var translateFn = transformObj.translate || '', scaleFn = transformObj.scale || '', valueFns = translateFn + scaleFn; // set data back in elem $( elem ).data('opto-transform', data ); // sorting so scale always comes before value = valueFns; // set name to vendor specific property name = $.props.transform; break; } return _jQueryStyle.apply( this, arguments ); }; var _fxCur = $.fx.prototype.cur; $.fx.prototype.cur = function () { if ( this.prop === 'scale' ) { var data = $( this.elem ).data('transform'), currentScale = data && data[ this.prop ] ? data[ this.prop ] : [ 1 ]; // scale value is saved as a 1 item array return currentScale[0]; } return _fxCur.apply(this, arguments); }; $.fx.step.scale = function (fx) { $( fx.elem ).css({ scale: [ fx.now ] }); }; })( jQuery );