29th April 2014 – I updated the code below and I think that now it really is as good as this can possibly get.
Perfect result!
I love both Isotope and Twitter Bootstrap framework, I think they’re great tools for developers & web designers alike.
However, due to the nature of TB’s fluid structure (with widths in % rather than px) and Isotope being originally developed way before this kind of layout structures were popular…. they don’t work nicely together out of the box.
Desandro (who, ironically, is a designer at Twitter), Isotope‘s developer, has recently released a beta for Isotope v.2 and the direction is definitely going towards making the library more accomodating of responsive and fluid layouts.
That said, I still had some trouble to make a full width website work as I wished, while implementing both, but I finally managed to make everything work beautifully.
Also, I am using Infinite Scroll (developed by Paul Irish), imagesLoaded (also developed by Desandro) and WP Imager (developed by me), to accomplish 3 more objectives:
– resize and cache images inside items
– make an endless list of items without needing to click on pagination
– make sure all images inside the items load before firing Isotope (mostly to avoid overlapping of partially formed items, while images are still loading).
All of this, on a WordPress site.
So here I’ll show you how they all work together.
Download and setup in your site, the (latest versions of) necessary scripts:
Isotope v2 beta .
Twitter Bootstrap (or use their CDN)
Infinite Scroll
imagesLoaded
WP Imager (keep in mind that this only works on WordPress)
I have removed pretty much all WordPress related code, so feel free to adapt it to whatever you need it for.
Template file
<div id="iso"> <div class="row"> <div class="post col-xs-12 col-sm-6 col-md-3 col-lg-3"> <div class="post_img"><img src="#"></div> <div class="content"> <h2><a href="#">Item Title</a></h2> </div> </div> </div> <div class="pagination"> <a href="#/page/2/">Next</a> </div> </div>
CSS
#iso { margin: 0 auto; width: 100%; } /* Browser Support of ':first-of-type' pseudo-class Chrome Safari Firefox Opera IE Android iOS Works 3.2+ Works 9.5+ 9+ Works Works */ #iso .row:first-of-type { margin: 0; } .post { margin: 10px 0; max-width: 100%; padding: 0; } .post .content { padding: 20px; } /* * PAGINATION */ .pagination { display: none; visibility: hidden; } /* * MEDIA QUERIES */ @media (min-width: 768px) and (max-width: 980px) { #iso .col-md-3, #iso .col-lg-3 { width: 300px; } } @media (min-width: 980px) and (max-width: 1300px) { #iso .col-md-3, #iso .col-lg-3 { width: 350px; } } @media (min-width: 1300px) { #iso .col-md-3, #iso .col-lg-3 { width: 400px; } }
JS
<script> $(document).ready(function() { var $container = $('#iso'); // Fire Isotope only when images are loaded $container.imagesLoaded(function(){ $container.isotope({ itemSelector : '.post', masonry: { isFitWidth: true, gutter: 20 } }); }); // Infinite Scroll $('#iso').infinitescroll({ navSelector : 'div.pagination', nextSelector : 'div.pagination a:first', itemSelector : '.post', bufferPx : 200, loading: { finishedMsg: 'We\'re done here.', //img: +templateUrl+'ajax-loader.gif' } }, // Infinite Scroll Callback function( newElements ) { var $newElems = jQuery( newElements ).hide(); $newElems.imagesLoaded(function(){ $newElems.fadeIn(); $container.isotope( 'appended', $newElems ); }); }); }); </script> <!--[if lte IE 8]> <script> $(document).ready(function() { // IE8 compatibility of pseudo-class $('#iso .row').first().css({margin:'0'}); }); </script> <![endif]-->
There’s probably more solutions on how to achieve all of this, however after I researched extensively, this was the only solution that did the trick for me.
So, take all of this and adapt it to your needs!