今回、Isotopeプラグインを使ってArchiveページを実装したのでメモ。
Masonryプラグインを使った実装は、前回の記事を参照して下さい。
基本的な実装
Masonryとほぼ同じです。
Isotopeでは、レイアウトオプションが増えたため、masonry
プロパティに設定を書きます。
$(function() { |
ちょっと修正する
前回同様、小気味よい感じにするために手を加える。
HTML
HTMLのマークアップはMasonryと同様。
描画が終わるまでローディングを表示したいので、ローディング用のdivを置き、#container
にグリッド幅計算用の.grid-sizer
を用意します。例によって、#container
に直接.item
を置くのではなく、display:none;
な#hidden-items
に退避。
<section role="main"> |
JavaScript
#hidden-items
から.item
を取得して、#container
にappendするように実装を修正します。MasonryではDOMにappendしてから更にMasonryのappendedメソッドを使って.item
を認識させないといけなかったが、Isotopeでは上手く改善されている。
(function() { |
簡潔に記述できました。
Ajaxでitemを読み込む
これだけじゃつまらないので、「load more」をクリックすると、次のページをAjaxで読み込んで、コンテナに追加していくアレを実装します。
以下のように、コンテナのフッターに次ページがあれば次ページのリンクが表示されるようにします。
<section role="main"> |
このリンクのクリックイベントをフックして、Ajaxで次ページのitemを取得すれば良い。
エラー処理や細かなハンドリングは省いてます。
$('.load-more-link').on('click', function() { |
PHPなど使って自由にAPIを書ける場合はJSONを受け取って、JavaScriptテンプレートなどを使ってDOMを生成するのがMV*っぽくてよいと思います。今回実装したのが、Middlemanのような静的なページだったので、htmlをそのまま受け取っています。
あとは、読み込むたびにload moreのリンク先を次のページに書き換えてあげればOKです。
スクロールに応じて自動的に読み込む
これは、フックするイベントがスクロールイベントになるだけで、上のAjaxの処理を切り出してスクロールイベントで呼び出すとよいでしょう。あとスクロール量とWindowの高さの差が一定のしきい値以下になったときに呼び出せば出来上がり。