Pinterest風グリッドレイアウトを作ってみようjQuery×HTML5×CSS3を真面目に勉強(3)(4/4 ページ)

» 2013年06月10日 18時00分 公開
[山田 直樹,クラスメソッド]
前のページへ 1|2|3|4       

JavaScriptの実装4 - 各グリッドの幅を個別に設定できるようにする

 ここまでは異なる高さのグリッドを並べるための実装でしたが、幅に関しては全て同じ幅に固定されていました。

 そこで各グリッドに任意の値を指定することで異なる幅のグリッドを生成して並べられるようにカスタマイズしてみたいと思います。

実装方法を定義

 幅を設定したいグリッドをどうやって指定するか、幅の基準はどうするかを決めます。なるべく手軽に指定できるようにしたいので、今回は次のようにします。

  1. 任意のグリッド要素のHTMLタグにdata属性を使って幅を設定する
  2. デフォルトのグリッド幅を基準として、基準となるグリッド1個分、2個分・・・、といったように指定する

 HTML5には、HTMLの名前空間に属さないユーザーオリジナルの属性を定義する機能が備わっています。これを独自データ属性と呼びます。よく知らない、より詳しく知りたいという方は、こちらのページをご参照ください。

 以下のように記述することで、任意のグリッド要素に幅を設定します。

  1. <div class="grid" data-size="2">
  2. <div class="imgholder">
  3. <img src="http://media-cache-ec3.pinimg.com/192x/34/c5/e2/34c5e2172503fa9a5aa719ee4e541202.jpg">
  4. </div>
  5. <h2>3 | Photo title</h2>
  6. <p>For a foster child who's been passed around from home to home, a little piece of hope is lost at each transition. This week, your support will give them a duffel ...</p>
  7. <div class="meta">by Annie onto style.</div>
  8. </div>
HTML

 続いてJavaScriptです。主にグリッドを配置するロジックが以下のように変わります。

  1. //gridが配置されるx座標値、y座標値を取得
  2. var getGridPosition = function(size) {
  3. if (size > 1) {
  4. var arrayLimit = gridArray.length - size,
  5. defined = false,
  6. tempHeight;
  7. for (var i=0; i<gridArray.length; i++) {
  8. var obj = gridArray[i],
  9. x = obj.x;
  10. if (x >= 0 && x <= arrayLimit) {
  11. var heightArray = getHeightArray(x, size);
  12. if (!defined) {
  13. defined = true;
  14. tempHeight = heightArray;
  15. tempHeight.x = x;
  16. } else {
  17. if (heightArray.max < tempHeight.max) {
  18. tempHeight = heightArray;
  19. tempHeight.x = x;
  20. }
  21. }
  22. }
  23. }
  24. return tempHeight;
  25. } else {
  26. return getHeightArray(0, gridArray.length);
  27. }
  28. };
  29. //gridを配置
  30. var setPosition = function(grid) {
  31. //check grid size
  32. var size;
  33. if (!grid.data('size') || grid.data('size') < 0) {
  34. size = 1;
  35. } else if (grid.data('size') > numOfCol) { // extra
  36. size = numOfCol;
  37. } else {
  38. size = grid.data('size');
  39. }
  40. // gridの情報を定義
  41. var pos = [];
  42. var tempHeight = getGridPosition(size); // extra
  43. pos.x = tempHeight.x;
  44. if (size > 1) {
  45. pos.y = tempHeight.max;
  46. } else {
  47. pos.y = tempHeight.min;
  48. }
  49. var gridWidth = colWidth * size - (grid.outerWidth() - grid.width()); // extra
  50. // gridのスタイルを更新
  51. grid.css({
  52. 'width': gridWidth - opts.offsetX * 2, // extra
  53. 'left': pos.x * colWidth,
  54. 'top': pos.y,
  55. 'position': 'absolute'
  56. });
  57. // gridArrayを新しいgridで更新
  58. removeGridArray(pos.x, size);
  59. pushGridArray(pos.x, pos.y, size, grid.outerHeight());
  60. };
JavaScript

 まず独自データ属性でサイズが指定されているかをチェックします。指定されていなければサイズ1とし、されていればその指定のサイズとします。ただし最大カラム数を超えたサイズが指定されていた場合は、最大カラム数と等しい値をサイズとして上書きします。

 次にグリッドが配置されるx座標値とy座標値を取得します。今まではグリッドをカラム順序に沿った座標位置を取得するだけでしたが、グリッドにサイズが設けられたことにより、1行当たりの残りカラム数の幅にグリッドが収まりきるかどうかを判断する処理が必要になりました。収まるようならこれまで通りの座標値を取得し、収まりきらず改行して配置する必要がある場合は、そちらの座標値を取得するようにします。

 また、指定されたグリッドのサイズに応じてwidth値も変化するため、それを算出する処理も1行加えます。

 これで改修は終わりです。こちらから実際の動きを確認できます。

おわりに

 従来とは一味違ったこのグリッドレイアウトは、Pinterestを始めファッション性の高いWebサイトでよく見かけます。以前このシリーズで紹介したパララックスエフェクト(関連記事)と並ぶトレンドだったといっても過言ではないでしょう。トレンドだっただけにこの手のレイアウトを実現するプラグインは探せばいくつか出てきますが、筆者としては自作することによってアルゴリズムを理解する良いトレーニングになったと思います。

 今回作成したのは他に出回っているプラグインに比べていくらか機能の少ないシンプルなモノとなっていますが、もしご興味ある方がおりましたら、当ソースコードをフォークして、より高機能にカスタマイズしていただければ幸いです。

著者プロフィール

山田直樹(やまだ なおき)

クラスメソッドではたらくフロントエンド・エンジニア。JavaScript・HTML・CSSによる開発を主な生業とする一方、スタイリッシュかつクールなデザインを何よりも愛していることから、UIデザインを担当することもしばしば。実はプログラムよりも洋服を自作するのが一番得意だったりする。

クラスメソッド 開発ブログ山田直樹

前のページへ 1|2|3|4       

Copyright © ITmedia, Inc. All Rights Reserved.

スポンサーからのお知らせPR

HTML5+UX 記事ランキング

本日月間

注目のテーマ

4AI by @IT - AIを作り、動かし、守り、生かす
Microsoft & Windows最前線2025
AI for エンジニアリング
ローコード/ノーコード セントラル by @IT - ITエンジニアがビジネスの中心で活躍する組織へ
Cloud Native Central by @IT - スケーラブルな能力を組織に
システム開発ノウハウ 【発注ナビ】PR
あなたにおすすめの記事PR

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。