第12回 masonryでコンテンツを隙間なく敷き詰め表示方法いろいろ試す
masonryプラグインを使用して、カラム(写真などコンテンツを含んだひとまとまりの要素)を一定サイズに整然と並べるのではなく、それぞれの持つ幅や高さを生かして、タイル状に隙間なく敷き詰めるレイアウトを作成してみます。バリエーションとして横幅サイズの異なるカラムの配置や、カラム幅の相対指定方法など配置を調整することもできます。
解説:(有)ムーニーワークス ハヤシユタカ前回は、グラフィックスペースをブラウザ全体を使用してグラフィカルに見せる作例を作成しましたが、今回はPinterestのようなコンテンツの内容によって一定ではなく隙間なく埋めていくレイアウトをmasonryプラグインを使用して作成してみたいと思います。
■今回作成したサンプル
●コンテンツを敷き詰めるプラグイン「masonry」
今回使用する「masonry」プラグインは、コンテンツを含んだカラムをタイル状にレイアウトするためのプラグインです。要素がタイル状に自動レイアウトされるWebサイトが話題になり始めたころからオープンソースで提供されているjQueryプラグインで、導入されたWebサイトの事例も多くあります。
現在でもバージョンアップが重ねられていて、バージョン3ではHTML5の独自data属性に必要パラメータを設定するだけでJavascriptを一切記述しなくても導入できるなど、比較的容易に使用することができるようになっています。
●コンテンツを配置するHTML
コンテンツを敷き詰めるサイトを作成する場合、画像だけを使用する場合や画像とテキストなどの要素を入れたいなど目的によって表示させる内容が変わります。そこで、class(column)内に記述した内容を一つのブロックとして考えて作成することで、表示する内容を自由に調整することができます。
■■■■ HTMLコード
<div class="column"> <p class="photo"><img src="img/01.jpg" alt=""></p> </div>
●コンテンツを敷きつめかた:写真サイズが共通の場合
画像サイズが一定の縦横比で並べる場合は、指定した段数で一定のグリッドレイアウトで配置されるので、敷き詰めるというよりは整列されたイメージで見ることができます。この場合は、「masonry」プラグインを使用するまでもなく、CSSのfloatプロパティで実現可能であり、1行4列のレイアウトの場合は、画像の並び方は左から「1→2→3→4」、1段下がり再び左から「5→6→7→8」とアルファベットの「Z」字状にジグザグに配置されていきます。
サイズが統一されている場合は整列される |
●コンテンツを敷きつめかた:縦写真、横写真が混在する場合
縦写真、横写真が混在する場合は、floatで実装すると画像の並び方は左から「1→2→3→4」は変わりませんが、図のように「3」の画像がほかの画像よりも縦長の時、1段下がった後の「5」は、「3」と「4」の隙間に入り込むようなところに配置され、左側には画像が配置されないまま、大きな隙間を残してさらに1段下へ下がって一番左から「6→7→8→9」と配置されていきます。このようにCSSのみでは一定の秩序を乱す要素が存在すると以後の画像の配置が不安定になり、期待しているように隙間無く画像を敷き詰めることができません。
そこで、Javascriptによってレイアウトを調整するためにmasonryプラグインを導入するわけですが、このプラグインはグリッドと同様に単に左から「1→2→3→4」、1段下がって「5→6→7→8」と並べるわけではなく、「3」のような縦長の要素があったとき、その下に来る「7」と次の「8」の縦位置を比べ、「7」の方が「8」よりも下に配置されてしまうときは本来「8」の位置に「7」を配置し、本来「7」の位置だった「3」の下に「8」を配置するようになります。つまり、上から順番に画像の配置順(時系列順)に画像が表示されるように調整してくれるということです。
縦写真、横写真が混在する場合でも「masonry」プラグインによって、上から順番に画像の配置順に表示されるように調整してくれる |
●コンテンツを敷き詰める基本設定
今回のサンプルの1つ目(sample1_basic.html)は、「masonry」プラグインを適用するコンテンツ全体を格納する要素(※以後、masonryコンテナ)の幅を1080ピクセルとし、その中に格納される写真などをコンテンツ内容を含んだ要素(※以後、カラム)1つの幅を270ピクセルと絶対値で設定した。masonryは、このカラムのサイズをCSSで指定すると同時に、Javascript上でmasonryメソッドを実行する際の引数のひとつ「columnWidth」にも、CSSで指定したカラムサイズと同じ値を設定しておく必要があります。このサンプルでは270に設定しました(※最新バージョンのmasonryではHTML5の独自data属性で「columnWidth」を設定することが可能です)。
■■■■ JSコード
;(function (d, $) { var jQdm_flexGrid; jQdm_flexGrid = function () { // 初期設定 var param = { masonryTargetContainer: $('#photoGalleryContainer'), itemSelector: '.column', loaderSymbolSelector: '.loaderSymbol' // ローダー用のCSSセレクタ }; // タイル上にレイアウトする複数要素を格納した、 // masonryプラグインを適用するコンテナ要素 // 扱いやすいように初期設定の変数から$containerに代入 var $container = param.masonryTargetContainer; // masonryの基本設定を引数として、関数に渡し実行する $container.masonry({ columnWidth: 270, // 整列用基本カラム幅(ピクセル) itemSelector: param.itemSelector // カラムのCSSセレクタ }); // ロード中に表示するアニメーション画像の処理 var LoaderSymbol = { init: function () { var _sel = param.loaderSymbolSelector; if ($(_sel).length == 0) { $('').prependTo('body').addClass(replaceString(_sel, '.')).hide().fadeIn(1000); } }, destroy: function () { $(param.loaderSymbolSelector).fadeOut(500, function () { $(this).remove(); revealItems(); }); } }; // 画像を全て読み込んだ後にmasonryを実行する LoaderSymbol.init(); $container.imagesLoaded().done(function () { // 画像読み込み完了 LoaderSymbol.destroy(); }); // 読み込んだ画像を表示する function revealItems() { var _elmes, _items; _elems = $container.masonry('getItemElements'), _items = $container.masonry('getItems', _elems); $container.children().css({ visibility: 'visible' }); $container.fadeIn().masonry('reveal', _items).masonry(); } // 文字列置換処理 function replaceString(_str, _bf, _af, _flg) { var _reg = new RegExp(_bf, _flg || ''); return _str.replace(_reg, _af || ''); } } jQdm_flexGrid(); })(document, jQuery);
■1カラム(段・グリッド)の基本設定CSS
■■■■ CSSコード.grid_container .column { width: 266px; padding: 5px; margin: 2px; overflow: hidden; background-color: #fff; border: 1px solid #d9d9d9; visibility: hidden; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; }
●表示させる段組の変更や全体の幅の調整
1つ目のサンプルではmasonryコンテナの幅は1080ピクセル、カラムの幅は270ピクセルとしているため、横1列ごとに1080÷270=4段のカラムが並ぶ計算になり、横1行ごとに並べます。
段数を変更したい場合は、単純にコンテナの幅やカラムの幅を変更すれば良いが、前述のようにカラムのは幅を変更した場合は、別途Javascriptでmasonryメソッドを実行する際の引数の1つ「columnWidth」の値も変更する必要があります。
縦写真、横写真でもカラムの幅は一定にレイアウトされる |
■■■■ CSSコード
.grid_container { width: 100%; margin: 0 0 50px; } .grid_container .column { width: 266px; …省略… }
■■■■ JSコード
$container.masonry({ columnWidth: 270, // 整列用基本カラム幅(ピクセル) itemSelector: param.itemSelector // カラムのCSSセレクタ });
また、表示させたブラウザのサイズを後から変更した場合には、アニメーションしながら段組が変更されるようになっています。
ブラウザサイズが小さくなり一段分が入らない場合はアニメーションしながらカラムの段数が変更される |
その他にも書籍の方ではカラムの幅を変えたり相対的なサイズ指定、画像拡大機能付などのバリエーションも作成しております。
【その他のサンプル】
・各カラムの幅をピクセル(絶対値)指定。カラム幅は3種類
・各カラムの幅をパーセント(相対)指定
・各カラムの幅をパーセント(相対)指定。ColorBoxプラグインによる画像拡大機能付き
今回は以上になります。
次回はこういったレイアウトに関連するものとして、コンテンツを次々に読み込んで無限にスクロールするページを作成してみたいと思います。
『現場でかならず使われている jQueryデザインのメソッド』
今回紹介したサンプルは『現場でかならず使われている jQueryデザインのメソッド』にてサンプルダウンロードとコードの解説を行っております。 |
作成したサンプルや本の紹介はこちらをご覧ください。
2015/2/4
●本連載で使用している書籍「現場でかならず使われている jQueryデザインのメソッド」
Profile
【ハヤシユタカ】2001年、有限会社ムーニーワークスを設立。WEB制作の他、書籍執筆、セミナー講演、企業研修などを行う。また、クリエイター育成機関デジタルハリウッドでは1999年より教鞭をとる。2004年からは、デジタルハリウッド大学大学院、明治大学大学院非常勤講師を歴任。2012年からはデジハリオンラインスクールにてWEB関連講座のeラーニング教材の開発に携わり、会社・自宅のPCからいつでも「HTML5」「WordPress」を学べる講座を担当。2013年御苗場Vol12.横浜にて「The Zoological Garden ~言葉のない対話~」エプソン賞受賞。
こちらの連載もあわせてご覧ください
●WordPressでブログでなくビジネスサイトをつくろう:http://www.mdn.co.jp/di/articles/2782/
●ゼロからはじめるHTML5でのサイト制作:http://www.mdn.co.jp/di/articles/2605/
●HTML5でサイトをつくろう:http://www.html5-memo.com/
●Webデザインクリップ:http://webdesignmatome.com/
【著書・共著】
●現場でかならず使われている jQueryデザインのメソッド (2014/4/25)
●HTML5デザイン 仕事のネタ帳 CSS3+JavaScript+CSSフレームワークと活用するプロのテクニック (2014/3/24)
●現場で役立つCSS3デザインパーツライブラリ (2013/5/17)
●WordPress 3.x 現場のワークフローで覚えるビジ?ネスサイト制作 (2012/9/20)
●WebデザイナーのためのHTML5入門 (2012/08)
●ポケット詳解 jQuery Mobile辞典 (2012/05)
●すべての人に知っておいてほしい HTML5 & CSS3 の基本原則(2012/10/20)
●すべての人に知っておいてほしい スタイルシートデザインの基本原則(2012/5/25)
この連載のすべての記事
-
アプリ風インターフェイスのフォトギャラリーを作成する
-
マウスホイールに対応した横スクロールのページを作成する
-
マウスホイールに応じて1画面毎にページを遷移するパララックスを作成する
-
スクロール位置がボックス境界にスナップするページ
-
コンテンツを次々に読み込んで無限にスクロールするページを作成する
-
masonryでコンテンツを隙間なく敷き詰め表示方法いろいろ試す
-
ブラウザ一杯に広がったメイングラフィックに最適なスライドショーを作成する
-
クリックでサイドから展開するスライドメニューを作成する
-
PCとスマートフォンで画像を切り替える
-
SNSのボタンをまとめて配置する
-
特定のタイミングでヘッダーナビゲーション部分を上部に固定する
-
ユーザビリティを向上するツールチップを作る
-
エフェクトの豊富なタブパネルを実装する(フェード切り替えなど)
-
ページトップへ戻る+スムーズスクロールとボタンの出現方法いろいろ
-
ブラウザの背景全体に画像を表示する(ランダム配置とアニメーション)
-
Bigvideoプラグインを使用してvideo要素で動画をブラウザの背景全体に再生させる
-
プラグインを使用してYOUTUBEの動画をブラウザの背景全体に再生させる
-
現場でかならず使われている jQueryデザインのメソッド