Isotope - fitColumns in fit container
Re http://stackoverflow.com/questions/5100009/relayout-items-with-isotope-doesnt-seem-to-maintain-structure
HTML
<script src="http://isotope.metafizzy.co/jquery.isotope.min.js"></script>
<div id="container">
<div class="item large">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5</div>
<div class="item">6</div>
<div class="item">7</div>
<div class="item">8</div>
<div class="item">9</div>
<div class="item">10</div>
<div class="item">11</div>
<div class="item">12</div>
<div class="item">13</div>
</div>
CSS
#container {
border: 2px solid;
padding: 5px;
width: 500px;
height: 225px;
}
.item {
width: 75px;
height: 75px;
background: #26D;
float: left;
color: white;
font-size: 60px;
}
.item.large {
width: 225px;
height: 225px;
background: #2D6;
z-index: 10;
}
.item:hover {
cursor: pointer;
}
/**** Isotope CSS3 transitions ****/
.isotope,
.isotope .isotope-item {
-webkit-transition-duration: 0.8s;
-moz-transition-duration: 0.8s;
transition-duration: 0.8s;
}
.isotope {
-webkit-transition-property: height, width;
-moz-transition-property: height, width;
transition-property: height, width;
}
.isotope .isotope-item {
-webkit-transition-property: -webkit-transform, opacity;
-moz-transition-property: -moz-transform, opacity;
transition-property: transform, opacity;
}
JavaScript
$(function(){
var $container = $('#container'),
$items = $('.item');
$container.isotope({
itemSelector: '.item',
layoutMode : 'fitColumns',
resizesContainer : false,
getSortData: {
fitOrder: function($item) {
var index, order, v;
order = void 0;
index = $item.index() + 1;
if ($item.hasClass("large") && (index % 3)) {
v = index % 3;
if (v === 1) {
order = index;
}
if (v === 2) {
order = index + 3;
}
} else if ($item.hasClass("large") && !(index % 3)) {
order = index + 2;
} else {
order = index;
}
return order;
}
},
sortBy : 'fitOrder'
});
$items.click(function(){
var $this = $(this);
// nothing to change if this already has large class
if ( $this.hasClass('large') ) {
return;
}
var $previousLargeItem = $items.filter('.large');
$previousLargeItem.removeClass('large');
$this.addClass('large');
$container
// update sort data on changed items
.isotope('updateSortData', $this )
.isotope('updateSortData', $previousLargeItem )
// trigger layout and sort
.isotope();
});
});