|
1 | 1 | /**
|
2 |
| - * Isotope v1.4.110906 |
| 2 | + * Isotope v1.5.0 beta |
3 | 3 | * An exquisite jQuery plugin for magical layouts
|
4 | 4 | * http://isotope.metafizzy.co
|
5 | 5 | *
|
|
45 | 45 | }
|
46 | 46 | }
|
47 | 47 |
|
48 |
| - var transformProp = getStyleProperty('transform'); |
| 48 | + var transformProp = getStyleProperty('transform'), |
| 49 | + transitionProp = getStyleProperty('transitionProperty'); |
| 50 | + |
49 | 51 |
|
50 | 52 | // ========================= miniModernizr ===============================
|
51 | 53 | // <3<3<3 and thanks to Faruk and Paul for doing the heavy lifting
|
|
92 | 94 | },
|
93 | 95 |
|
94 | 96 | csstransitions: function() {
|
95 |
| - return !!getStyleProperty('transitionProperty'); |
| 97 | + return !!transitionProp; |
96 | 98 | }
|
97 | 99 | };
|
98 | 100 |
|
|
247 | 249 | };
|
248 | 250 |
|
249 | 251 | }
|
| 252 | + |
| 253 | + // ========================= get transition-end event =============================== |
| 254 | + |
| 255 | + if ( Modernizr.csstransitions ) { |
| 256 | + var transitionEndEvent = { |
| 257 | + WebkitTransitionProperty: 'webkitTransitionEnd', // webkit |
| 258 | + MozTransitionProperty: 'transitionend', |
| 259 | + OTransitionProperty: 'oTransitionEnd', |
| 260 | + transitionProperty: 'transitionEnd' |
| 261 | + }[ transitionProp ]; |
| 262 | + var transitionDurProp = getStyleProperty('transitionDuration'); |
| 263 | + } |
250 | 264 |
|
251 |
| - |
| 265 | + // ========================= smartresize =============================== |
252 | 266 |
|
253 | 267 | /*
|
254 | 268 | * smartresize: debounced resize event for jQuery
|
|
295 | 309 |
|
296 | 310 |
|
297 | 311 | // our "Widget" object constructor
|
298 |
| - $.Isotope = function( options, element ){ |
| 312 | + $.Isotope = function( options, element, callback ){ |
299 | 313 | this.element = $( element );
|
300 | 314 |
|
301 | 315 | this._create( options );
|
302 |
| - this._init(); |
| 316 | + this._init( callback ); |
303 | 317 | };
|
304 | 318 |
|
305 | 319 | // styles of container element we want to keep track of
|
|
423 | 437 |
|
424 | 438 | this.$filteredAtoms = this._filter( this.$allAtoms );
|
425 | 439 | this._sort();
|
426 |
| - |
427 | 440 | this.reLayout( callback );
|
428 | 441 |
|
429 | 442 | },
|
|
588 | 601 | this.styleQueue.push({ $el: this.element, style: containerStyle });
|
589 | 602 | }
|
590 | 603 |
|
591 |
| - this._processStyleQueue(); |
592 |
| - |
593 |
| - // provide $elems as context for the callback |
594 |
| - if ( callback ) { |
595 |
| - callback.call( $elems ); |
596 |
| - } |
| 604 | + this._processStyleQueue( $elems, callback ); |
597 | 605 |
|
598 | 606 | this.isLaidOut = true;
|
599 | 607 | },
|
600 | 608 |
|
601 |
| - _processStyleQueue : function() { |
| 609 | + _processStyleQueue : function( $elems, callback ) { |
602 | 610 | // are we animating the layout arrangement?
|
603 | 611 | // use plugin-ish syntax for css or animate
|
604 | 612 | var styleFn = !this.isLaidOut ? 'css' : (
|
605 | 613 | this.isUsingJQueryAnimation ? 'animate' : 'css'
|
606 | 614 | ),
|
607 | 615 | animOpts = this.options.animationOptions,
|
608 | 616 | _isInsertingAnimated = this._isInserting && this.isUsingJQueryAnimation,
|
609 |
| - objStyleFn; |
610 |
| - |
| 617 | + objStyleFn, processor, |
| 618 | + triggerCallbackNow, callbackFn; |
| 619 | + |
| 620 | + // default styleQueue processor, may be overwritten down below |
| 621 | + processor = function( i, obj ) { |
| 622 | + obj.$el[ styleFn ]( obj.style, animOpts ); |
| 623 | + }; |
| 624 | + |
| 625 | + if ( this._isInserting || !callback ) { |
| 626 | + // process styleQueue |
| 627 | + processor = function( i, obj ) { |
| 628 | + // only animate if it not being inserted |
| 629 | + objStyleFn = _isInsertingAnimated && obj.$el.hasClass('no-transition') ? 'css' : styleFn; |
| 630 | + obj.$el[ objStyleFn ]( obj.style, animOpts ); |
| 631 | + }; |
| 632 | + |
| 633 | + } else { |
| 634 | + var isCallbackTriggered = false; |
| 635 | + callbackFn = function() { |
| 636 | + // trigger callback only once |
| 637 | + if ( isCallbackTriggered ) { |
| 638 | + return; |
| 639 | + } |
| 640 | + callback( $elems ); |
| 641 | + isCallbackTriggered = true; |
| 642 | + }; |
| 643 | + |
| 644 | + if ( this.isUsingJQueryAnimation ) { |
| 645 | + // add callback to animation options |
| 646 | + animOpts.complete = callbackFn; |
| 647 | + } else if ( Modernizr.csstransitions ) { |
| 648 | + // detect if first item has transition |
| 649 | + var i = 0, |
| 650 | + testElem = this.styleQueue[0].$el; |
| 651 | + // get first non-empty jQ object |
| 652 | + // console.log( this.styleQueue ) |
| 653 | + if ( !testElem.length ) { |
| 654 | + return; |
| 655 | + } |
| 656 | + // get transition duration of the first element in that object |
| 657 | + // yeah, this is inexact |
| 658 | + var duration = parseFloat( getComputedStyle( testElem[0] )[ transitionDurProp ] ); |
| 659 | + if ( duration > 0 ) { |
| 660 | + processor = function( i, obj ) { |
| 661 | + obj.$el[ styleFn ]( obj.style, animOpts ) |
| 662 | + // trigger callback at transition end |
| 663 | + .one( transitionEndEvent, callbackFn ); |
| 664 | + } |
| 665 | + } else { |
| 666 | + // no transition? hit it now, son |
| 667 | + triggerCallbackNow = true; |
| 668 | + } |
| 669 | + } |
| 670 | + } |
| 671 | + |
611 | 672 | // process styleQueue
|
612 |
| - $.each( this.styleQueue, function( i, obj ) { |
613 |
| - objStyleFn = _isInsertingAnimated && obj.$el.hasClass('no-transition') ? 'css' : styleFn; |
614 |
| - obj.$el[ objStyleFn ]( obj.style, animOpts ); |
615 |
| - }); |
| 673 | + $.each( this.styleQueue, processor ); |
| 674 | + |
| 675 | + if ( triggerCallbackNow ) { |
| 676 | + callbackFn() |
| 677 | + } |
616 | 678 |
|
617 | 679 | // clear out queue for next time
|
618 | 680 | this.styleQueue = [];
|
|
695 | 757 | $newAtoms.removeClass('no-transition');
|
696 | 758 | // reveal newly inserted filtered elements
|
697 | 759 | instance.styleQueue.push({ $el: $newAtoms, style: instance.options.visibleStyle });
|
698 |
| - instance._processStyleQueue(); |
699 |
| - delete instance._isInserting; |
700 |
| - if ( callback ) { |
701 |
| - callback( $newAtoms ); |
702 |
| - } |
| 760 | + instance._isInserting = false; |
| 761 | + instance._processStyleQueue( $newAtoms, callback ); |
703 | 762 | }, 10 );
|
704 | 763 | },
|
705 | 764 |
|
|
1246 | 1305 | // A bit from jcarousel
|
1247 | 1306 | // https://github.com/jsor/jcarousel/blob/master/lib/jquery.jcarousel.js
|
1248 | 1307 |
|
1249 |
| - $.fn.isotope = function( options ) { |
| 1308 | + $.fn.isotope = function( options, callback ) { |
1250 | 1309 | if ( typeof options === 'string' ) {
|
1251 | 1310 | // call method
|
1252 | 1311 | var args = Array.prototype.slice.call( arguments, 1 );
|
|
1271 | 1330 | if ( instance ) {
|
1272 | 1331 | // apply options & init
|
1273 | 1332 | instance.option( options );
|
1274 |
| - instance._init(); |
| 1333 | + instance._init( callback ); |
1275 | 1334 | } else {
|
1276 | 1335 | // initialize new instance
|
1277 |
| - $.data( this, 'isotope', new $.Isotope( options, this ) ); |
| 1336 | + $.data( this, 'isotope', new $.Isotope( options, this, callback ) ); |
1278 | 1337 | }
|
1279 | 1338 | });
|
1280 | 1339 | }
|
|
0 commit comments