Isotope plugin jQuery
Isotope to bardzo ciekawy plugin jQuery do tworzenia "magicznych" layoutów.
Dzięki niemu można tworzyć inteligentne, dynamiczne układy, które są trudne do osiągnięcia
przy użyciu samego css. Przy użyciu selektorów jQuery umożliwia atrakcyjne filtrowanie
danych pokazując lub ukrywając odpowiednie elementy DOM. Zapewnia też funkcję sortowania.
Podstawowy przykład
Isotope działa na pojemniku zawierającym podobne elementy podrzędne.<div id="container"> <div class="item green"></div> <div class="item w2 orange"></div> <div class="item green"></div> <div class="item yellow"></div> <div class="item green"></div> <div class="item orange"></div> <div class="item green"></div> <div class="item red"></div> <div class="item w2 green"></div> <div class="item yellow"></div> </div>Idealnie by isotopowy layout był ładowany po załadowaniu całej treści. Oczywiście należy załączyć bibliotekę jQuery oraz skrypt isotope.
<script src="js/jquery-1.11.2.min.js"></script>v <script src="js/isotope.pkgd.min.js"></script>Plugin posiada wszechstronny silnik układów oraz wiele wbudowanych układów. Układ można ustawić i zmienić poprzez opcję layoutMode. Dodajmy teraz trochę css.
* { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } .item { width: 25%; /*width:200px;*/ height: 100px; float:left; position: relative; } .green { background: green; } .item.w2 { width: 50%; /*width:400px;*/ } .orange { background:orange; } .red { background:red; } .yellow { background:yellow; }Następnie zainicjalizuj isotope.
$(function(){ var $container = $('#container'); // init $container.isotope({ // options itemSelector: '.item', layoutMode: 'fitRows' }); });Uruchom skrypt i sprawdź jak działa. Następnie odkomentuj odpowiednie linie w pliku css, ustalając w ten sposób stałe szerokości elementów i popatrz jak zmieniło się działanie skryptu.
Poziome układy layoutów (masonryHorizontal, fitColumns, cellsByColumn, straightAcross) wymagają ustalenia wysokości dla naszego kontenera. To ważne aby ustawić wysokość w css.
Filtrowanie
Isotope może pokazywać i ukrywać odpowiednie elementy dzięki opcji filtrowania używając selektorów jQuery. Elementy pasujące do filtra są pokazywane, a niepasujące ukrywane. W celu pokazania wszystkich elementów green należy zastosować filtr.$(function(){ var $container = $('#container'); // init $container.isotope({ // options itemSelector: '.item', layoutMode: 'fitRows', filter: '.green' }); });Rozbudujmy nieco nasz przykład o filtrowanie za pomocą przycisków. Dodajmy w kodzie html sekcję z buttonami. Zauważmy, że każdy przycisk ma odpowiedni parametr data-filter, którego będziemy używać w naszej funkcji filtrującej.
<div id="buttons"> <button data-filter="*">All</button> <button data-filter=".green">green</button> <button data-filter=".orange">orange</button> <button data-filter=".red">red</button> <button data-filter=".yellow">yellow</button> </div>Dopiszemy teraz kod jQuery. Działa on w ten sposób, że po kliknięciu na button ma być przefiltrowywana lista elementów zgodnie z atrybutem data-filter.
$('#buttons').on('click', 'button', function() { var filterValue = $(this).attr('data-filter'); $container.isotope({ filter: filterValue }); });
Sortowanie
Kolejną ważną funkcjonalnością isotope jest sortowanie elementów. Domyślne jest sortowanie rosnące. Aby to zmienić należy ustawić atrybut sortAscending na false. Dodajmy teraz do kodu html dodatkowe informacje, na podstawie których będziemy sortować dane.<div id="container"> <div class="item green"><span class="name">London</span> <span class="number">18</span></div> <div class="item w2 orange"><span class="name">Madrid</span> <span class="number">1</span></div> <div class="item green"><span class="name">Warsaw</span> <span class="number">5</span></div> <div class="item yellow"><span class="name">Krakow</span> <span class="number">3</span></div> <div class="item green"><span class="name">Berlin</span> <span class="number">20</span></div> <div class="item orange"><span class="name">Rome</span> <span class="number">30</span></div> <div class="item green"><span class="name">Barcelona</span> <span class="number">28</span></div> <div class="item red"><span class="name">Milano</span> <span class="number">4</span></div> <div class="item w2 green"><span class="name">Paris</span> <span class="number">15</span></div> <div class="item yellow"><span class="name">Oslo</span> <span class="number">7</span></div> </div>Isotope czyta dane z kodu za pomocą parametru getSortData.Parametr ten akceptuje obiekty. Klucze obiektu są słowami kluczowymi używanymi później w sort by. Wartości dla kluczy mogą być po prostu stringami albo funkcjami pobierającymi dane. Poniżej przykład.
var $container = $('#container').isotope({ getSortData: { name: '.name', // text from querySelector category: '[data-category]', // value of attribute weight: function( itemElem ) { // function var weight = $( itemElem ).find('.weight').text(); return parseFloat( weight.replace( /[\(\)]/g, '') ); } } });W naszym przypadku opcja getSortData wygląda następująco.
$container.isotope({ // options itemSelector: '.item', layoutMode: 'fitRows', getSortData: { name: '.name', number: '.number' } });Dodajmy w html również przyciski do sortowania.
<div id="sort"> <button data-sort="original-order">Original order</button> <button data-sort="name">by Name</button> <button data-sort="number">by Number</button> </div>vTeraz wystarczy już tylko w javascript zaimplementować sortowanie.
$('#sort').on('click', 'button', function() { var sortValue = $(this).attr('data-sort'); $container.isotope({ sortBy: sortValue }); });
Animacje
Isotope posiada fallback javascriptowych animacji dla starszych przeglądarek. Za pomocą parametru animationEngine ustawiamy jak Isotope ma przechwytywć animacje. Dostępne opcje to:- best-available - jeżeli przeglądarka wspiera CSS Transistions Isotope używa .css(), jeśli nie używa .animate()
- css - Isotope używa .css()
- jquery - Isotope używa .animate()
$('#container').isotope({ animationOptions: { duration: 750, easing: 'linear', queue: false } });
Dodawanie nowych elementów
Isotope dostarcza kilka metod służących do dodawania nowych elementów do drzewa DOM. Pierwszą z nich jest metoda addItems. Dodaje ona nowe elementy do isotopowego pojemnika.var $newItems = $('<div class="item" /><div class="item" /><div class="item" />'); $('#container').append($newItems).isotope('addItems', $newItems);Metoda insert wstawi nowe dane do pojemnika, przefiltruje i posortuje na nowo zawartość oraz wywoła metodą reLayout, tak aby wszystkie elementy były prawidłowo ułożone.
var $newItems = $('<div class="item" /><div class="item" /><div class="item" />'); $('#container').isotope('insert', $newItems);Kolejna metoda to appended. Wywołuje ona addItems dla nowych elementów i kładzie je na końcu układu.
var $newItems = $('<div class="item" /><div class="item" /><div class="item" />'); $('#container').isotope('insert', $newItems);Możesz potrzebować poniższego kodu css, aby animacje na nowo dodanych elementach działały poprawnie.
/**** disabling Isotope CSS3 transitions ****/ .isotope.no-transition, .isotope.no-transition .isotope-item, .isotope .isotope-item.no-transition { -webkit-transition-duration: 0s; -moz-transition-duration: 0s; -ms-transition-duration: 0s; -o-transition-duration: 0s; transition-duration: 0s; }Isotope demo