Browse Source

🛠 Fix masonry layout mode

+ facadeMethods
+ fix isLayoutInstant check
pull/1127/head
David DeSandro 9 years ago
parent
commit
ccbf92fd02
  1. 5
      js/isotope.js
  2. 39
      js/layout-mode.js
  3. 51
      js/layout-modes/masonry.js

5
js/isotope.js

@ -198,8 +198,9 @@ var trim = String.prototype.trim ?
// Don't animate/transition first layout // Don't animate/transition first layout
// Or don't animate/transition other layouts // Or don't animate/transition other layouts
Isotope.prototype._getIsInstant = function() { Isotope.prototype._getIsInstant = function() {
var isInstant = this._getOption('initLayout') !== undefined ? var isLayoutInstant = this._getOption('layoutInstant')
this._getOption('layoutInstant') : !this._isLayoutInited; var isInstant = isLayoutInstant !== undefined ? isLayoutInstant :
!this._isLayoutInited;
this._isInstant = isInstant; this._isInstant = isInstant;
return isInstant; return isInstant;
}; };

39
js/layout-mode.js

@ -47,27 +47,21 @@
* some methods should just defer to default Outlayer method * some methods should just defer to default Outlayer method
* and reference the Isotope instance as `this` * and reference the Isotope instance as `this`
**/ **/
( function() { var facadeMethods = [
var facadeMethods = [ '_resetLayout',
'_resetLayout', '_getItemLayoutPosition',
'_getItemLayoutPosition', '_manageStamp',
'_manageStamp', '_getContainerSize',
'_getContainerSize', '_getElementOffset',
'_getElementOffset', 'needsResizeLayout',
'needsResizeLayout' '_getOption'
]; ];
for ( var i=0, len = facadeMethods.length; i < len; i++ ) { facadeMethods.forEach( function( methodName ) {
var methodName = facadeMethods[i]; LayoutMode.prototype[ methodName ] = function() {
LayoutMode.prototype[ methodName ] = getOutlayerMethod( methodName ); return Outlayer.prototype[ methodName ].apply( this.isotope, arguments );
} };
});
function getOutlayerMethod( methodName ) {
return function() {
return Outlayer.prototype[ methodName ].apply( this.isotope, arguments );
};
}
})();
// ----- ----- // // ----- ----- //
@ -142,7 +136,8 @@
LayoutMode.apply( this, arguments ); LayoutMode.apply( this, arguments );
} }
Mode.prototype = new LayoutMode(); Mode.prototype = Object.create( LayoutMode.prototype );
Mode.prototype.constructor = Mode;
// default options // default options
if ( options ) { if ( options ) {

51
js/layout-modes/masonry.js

@ -31,47 +31,42 @@
}( window, function factory( LayoutMode, Masonry ) { }( window, function factory( LayoutMode, Masonry ) {
'use strict'; 'use strict';
// -------------------------- helpers -------------------------- //
// extend objects
function extend( a, b ) {
for ( var prop in b ) {
a[ prop ] = b[ prop ];
}
return a;
}
// -------------------------- masonryDefinition -------------------------- // // -------------------------- masonryDefinition -------------------------- //
// create an Outlayer layout class // create an Outlayer layout class
var MasonryMode = LayoutMode.create('masonry'); var MasonryMode = LayoutMode.create('masonry');
// save on to these methods var proto = MasonryMode.prototype;
var _getElementOffset = MasonryMode.prototype._getElementOffset;
var layout = MasonryMode.prototype.layout;
var _getMeasurement = MasonryMode.prototype._getMeasurement;
// sub-class Masonry var keepModeMethods = {
extend( MasonryMode.prototype, Masonry.prototype ); _getElementOffset: true,
layout: true,
_getMeasurement: true
};
// set back, as it was overwritten by Masonry // inherit Masonry prototype
MasonryMode.prototype._getElementOffset = _getElementOffset; for ( var method in Masonry.prototype ) {
MasonryMode.prototype.layout = layout; // do not inherit mode methods
MasonryMode.prototype._getMeasurement = _getMeasurement; if ( !keepModeMethods[ method ] ) {
proto[ method ] = Masonry.prototype[ method ];
}
}
var measureColumns = MasonryMode.prototype.measureColumns; var measureColumns = proto.measureColumns;
MasonryMode.prototype.measureColumns = function() { proto.measureColumns = function() {
// set items, used if measuring first item // set items, used if measuring first item
this.items = this.isotope.filteredItems; this.items = this.isotope.filteredItems;
measureColumns.call( this ); measureColumns.call( this );
}; };
// HACK copy over isOriginLeft/Top options // point to mode options for fitWidth
var _manageStamp = MasonryMode.prototype._manageStamp; var _getOption = proto._getOption;
MasonryMode.prototype._manageStamp = function() { proto._getOption = function( option ) {
this.options.isOriginLeft = this.isotope.options.isOriginLeft; if ( option == 'fitWidth' ) {
this.options.isOriginTop = this.isotope.options.isOriginTop; return this.options.isFitWidth !== undefined ?
_manageStamp.apply( this, arguments ); this.options.isFitWidth : this.options.fitWidth;
}
return _getOption.apply( this.isotope, arguments );
}; };
return MasonryMode; return MasonryMode;

Loading…
Cancel
Save