mirror of https://github.com/metafizzy/isotope
Filter & sort magical layouts
http://isotope.metafizzy.co
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
220 lines
6.2 KiB
220 lines
6.2 KiB
13 years ago
|
---
|
||
|
title: Masonry Column Shift
|
||
|
layout: default
|
||
|
category: custom-layout-modes
|
||
|
---
|
||
|
|
||
|
<style>
|
||
|
.shifty-item {
|
||
|
width: 210px;
|
||
|
margin: 10px;
|
||
|
float: left;
|
||
|
background: #AAA;
|
||
|
border: 5px solid white;
|
||
|
}
|
||
|
|
||
|
.shifty-item:hover { z-index: 10; }
|
||
|
|
||
|
.shifty-item.h1 { height: 140px; background: #66F; }
|
||
|
.shifty-item.h2 { height: 200px; background: #F66; }
|
||
|
.shifty-item.h3 { height: 240px; background: #6F6; }
|
||
|
.shifty-item.h4 { height: 280px; background: #FF6; }
|
||
|
|
||
|
</style>
|
||
|
|
||
|
<section id="copy">
|
||
|
<p>Custom layout mode <code>masonryColumnShift</code>. Enabled columns of a masonry layout to be shifted and not affect other columns. After the size of an item element has changed, you can trigger a special <code>columnShiftOfItem</code> method that will push the column down.</p>
|
||
|
|
||
|
{% highlight javascript %}
|
||
|
|
||
|
var $container = $('#container');
|
||
|
|
||
|
$container.isotope({
|
||
|
itemSelector: '.shifty-item',
|
||
|
layoutMode: 'masonryColumnShift'
|
||
|
});
|
||
|
|
||
|
$container.find('.shifty-item').hover(
|
||
|
function() {
|
||
|
$(this).css({ height: "+=100" });
|
||
|
// note that element is passed in, not jQuery object
|
||
|
$container.isotope( 'shiftColumnOfItem', this );
|
||
|
},
|
||
|
function() {
|
||
|
$(this).css({ height: "-=100" });
|
||
|
$container.isotope( 'shiftColumnOfItem', this );
|
||
|
}
|
||
|
);
|
||
|
|
||
|
{% endhighlight %}
|
||
|
|
||
|
</section>
|
||
|
|
||
|
|
||
|
<div id="container">
|
||
|
<div class="shifty-item h1"></div>
|
||
|
<div class="shifty-item h2"></div>
|
||
|
<div class="shifty-item h1"></div>
|
||
|
<div class="shifty-item h4"></div>
|
||
|
<div class="shifty-item h2"></div>
|
||
|
<div class="shifty-item h3"></div>
|
||
|
<div class="shifty-item h1"></div>
|
||
|
<div class="shifty-item h2"></div>
|
||
|
<div class="shifty-item h1"></div>
|
||
|
<div class="shifty-item h4"></div>
|
||
|
<div class="shifty-item h1"></div>
|
||
|
<div class="shifty-item h1"></div>
|
||
|
<div class="shifty-item h2"></div>
|
||
|
<div class="shifty-item h4"></div>
|
||
|
<div class="shifty-item h1"></div>
|
||
|
<div class="shifty-item h2"></div>
|
||
|
<div class="shifty-item h3"></div>
|
||
|
<div class="shifty-item h1"></div>
|
||
|
<div class="shifty-item h2"></div>
|
||
|
<div class="shifty-item h1"></div>
|
||
|
<div class="shifty-item h4"></div>
|
||
|
<div class="shifty-item h1"></div>
|
||
|
<div class="shifty-item h1"></div>
|
||
|
<div class="shifty-item h2"></div>
|
||
|
<div class="shifty-item h1"></div>
|
||
|
<div class="shifty-item h1"></div>
|
||
|
<div class="shifty-item h2"></div>
|
||
|
<div class="shifty-item h4"></div>
|
||
|
<div class="shifty-item h1"></div>
|
||
|
<div class="shifty-item h2"></div>
|
||
|
<div class="shifty-item h3"></div>
|
||
|
<div class="shifty-item h1"></div>
|
||
|
<div class="shifty-item h2"></div>
|
||
|
<div class="shifty-item h1"></div>
|
||
|
<div class="shifty-item h4"></div>
|
||
|
<div class="shifty-item h1"></div>
|
||
|
<div class="shifty-item h1"></div>
|
||
|
<div class="shifty-item h2"></div>
|
||
|
|
||
|
</div> <!-- #container -->
|
||
|
|
||
|
|
||
|
<script src="../{{ site.jquery_js }}"></script>
|
||
|
<script src="../{{ site.isotope_js }}"></script>
|
||
|
<script>
|
||
|
|
||
|
|
||
|
// -------------------------- Masonry Column Shift -------------------------- //
|
||
|
|
||
|
// custom layout mode
|
||
|
$.Isotope.prototype._masonryColumnShiftReset = function() {
|
||
|
// layout-specific props
|
||
|
var props = this.masonryColumnShift = {
|
||
|
columnBricks: []
|
||
|
};
|
||
|
// FIXME shouldn't have to call this again
|
||
|
this._getSegments();
|
||
|
var i = props.cols;
|
||
|
props.colYs = [];
|
||
|
while (i--) {
|
||
|
props.colYs.push( 0 );
|
||
|
// push an array, for bricks in each column
|
||
|
props.columnBricks.push([])
|
||
|
}
|
||
|
};
|
||
|
|
||
|
$.Isotope.prototype._masonryColumnShiftLayout = function( $elems ) {
|
||
|
var instance = this,
|
||
|
props = instance.masonryColumnShift;
|
||
|
$elems.each(function(){
|
||
|
var $brick = $(this);
|
||
|
var setY = props.colYs;
|
||
|
|
||
|
// get the minimum Y value from the columns
|
||
|
var minimumY = Math.min.apply( Math, setY ),
|
||
|
shortCol = 0;
|
||
|
|
||
|
// Find index of short column, the first from the left
|
||
|
for (var i=0, len = setY.length; i < len; i++) {
|
||
|
if ( setY[i] === minimumY ) {
|
||
|
shortCol = i;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// position the brick
|
||
|
var x = props.columnWidth * shortCol,
|
||
|
y = minimumY;
|
||
|
instance._pushPosition( $brick, x, y );
|
||
|
// keep track of columnIndex
|
||
|
$.data( this, 'masonryColumnIndex', i );
|
||
|
props.columnBricks[i].push( this );
|
||
|
|
||
|
// apply setHeight to necessary columns
|
||
|
var setHeight = minimumY + $brick.outerHeight(true),
|
||
|
setSpan = props.cols + 1 - len;
|
||
|
for ( i=0; i < setSpan; i++ ) {
|
||
|
props.colYs[ shortCol + i ] = setHeight;
|
||
|
}
|
||
|
|
||
|
});
|
||
|
};
|
||
|
|
||
|
$.Isotope.prototype._masonryColumnShiftGetContainerSize = function() {
|
||
|
var containerHeight = Math.max.apply( Math, this.masonryColumnShift.colYs );
|
||
|
return { height: containerHeight };
|
||
|
};
|
||
|
|
||
|
$.Isotope.prototype._masonryColumnShiftResizeChanged = function() {
|
||
|
return this._checkIfSegmentsChanged();
|
||
|
};
|
||
|
|
||
|
$.Isotope.prototype.shiftColumnOfItem = function( itemElem, callback ) {
|
||
|
|
||
|
var columnIndex = $.data( itemElem, 'masonryColumnIndex' );
|
||
|
|
||
|
// don't proceed if no columnIndex
|
||
|
if ( !isFinite(columnIndex) ) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
var props = this.masonryColumnShift;
|
||
|
var columnBricks = props.columnBricks[ columnIndex ];
|
||
|
var $brick;
|
||
|
var x = props.columnWidth * columnIndex;
|
||
|
var y = 0;
|
||
|
for (var i=0, len = columnBricks.length; i < len; i++) {
|
||
|
$brick = $( columnBricks[i] );
|
||
|
this._pushPosition( $brick, x, y );
|
||
|
y += $brick.outerHeight(true);
|
||
|
}
|
||
|
|
||
|
// set the size of the container
|
||
|
if ( this.options.resizesContainer ) {
|
||
|
var containerStyle = this._masonryColumnShiftGetContainerSize();
|
||
|
containerStyle.height = Math.max( y, containerStyle.height );
|
||
|
this.styleQueue.push({ $el: this.element, style: containerStyle });
|
||
|
}
|
||
|
|
||
|
this._processStyleQueue( $(columnBricks), callback )
|
||
|
|
||
|
};
|
||
|
|
||
|
$(function(){
|
||
|
|
||
|
var $container = $('#container');
|
||
|
|
||
|
$container.isotope({
|
||
|
itemSelector: '.shifty-item',
|
||
|
layoutMode: 'masonryColumnShift'
|
||
|
});
|
||
|
|
||
|
$container.find('.shifty-item').hover(
|
||
|
function() {
|
||
|
$(this).css({ height: "+=100" });
|
||
|
// note that element is passed in, not jQuery object
|
||
|
$container.isotope( 'shiftColumnOfItem', this );
|
||
|
},
|
||
|
function() {
|
||
|
$(this).css({ height: "-=100" });
|
||
|
$container.isotope( 'shiftColumnOfItem', this );
|
||
|
}
|
||
|
);
|
||
|
|
||
|
});
|
||
|
</script>
|