web-dev-qa-db-ja.com

グリッド/タイルビューを作成する方法

たとえば、クラス.articleがあり、このクラスをグリッドビューとして表示したい。だから私はこのスタイルを適用しました:

.article{
  width:100px;
  height:100px;
  background:#333;
  float:left;
  margin:5px;
}

そのスタイルは、.articleがタイル/グリッドに見えるようにします。高さを固定しても問題ありません。しかし、高さをautoに設定する(その中のデータに従って自動的に伸縮する)場合、グリッドは見た目が悪くなります。

enter image description here

そして、私はこのようなビューを作りたいです:

enter image description here

120
Ariona Rian

このタイプのレイアウトは、石造レイアウトと呼ばれます。組積造は別のグリッドレイアウトですが、要素の高さの違いによって生じる空白を埋めます。

jQuery Masonry は、石工レイアウトを作成するjQueryプラグインの1つです。

または、CSS3 column sを使用できます。ただし、現在のところ、CSS3列との互換性の問題があるため、jQueryベースのプラグインが最適です。

76
bookcasey

フレックスボックスを使用できます。

  1. 複数行の列フレックスコンテナに要素を配置する

    #flex-container {
      display: flex;
      flex-flow: column wrap;
    }
    
  2. DOMの順序が垂直ではなく水平に尊重されるように、要素を並べ替えます。たとえば、3つの列が必要な場合、

    #flex-container > :nth-child(3n + 1) { order: 1; } /* 1st column */
    #flex-container > :nth-child(3n + 2) { order: 2; } /* 2nd column */
    #flex-container > :nth-child(3n + 3) { order: 3; } /* 3rd column */
    
  3. 各列の最初の項目の前に列の区切りを強制します。

    #flex-container > :nth-child(-n + 3) {
      page-break-before: always; /* CSS 2.1 syntax */
      break-before: always;  /* New syntax */
    }
    

    悲しいことに、すべてのブラウザがflexboxの改行をまだサポートしているわけではありません。ただし、Firefoxでも動作します。

#flex-container {
  display: flex;
  flex-flow: column wrap;
}

#flex-container > :nth-child(3n + 1) { order: 1; } /* 1st column */
#flex-container > :nth-child(3n + 2) { order: 2; } /* 2nd column */
#flex-container > :nth-child(3n + 3) { order: 3; } /* 3rd column */

#flex-container > :nth-child(-n + 3) {
  page-break-before: always; /* CSS 2.1 syntax */
  break-before: always;  /* New syntax */
}

/* The following is optional */
#flex-container > div {
  background: #666;
  color: #fff;
  margin: 3px;
  display: flex;
  justify-content: center;
  align-items: center;
  font-size: 36px;
}
#flex-container > :nth-child(1) { height: 100px; }
#flex-container > :nth-child(2) { height: 50px; }
#flex-container > :nth-child(3) { height: 75px; }
#flex-container > :nth-child(4) { height: 50px; }
#flex-container > :nth-child(5) { height: 100px; }
#flex-container > :nth-child(6) { height: 50px; }
#flex-container > :nth-child(7) { height: 100px; }
#flex-container > :nth-child(8) { height: 75px; }
#flex-container > :nth-child(9) { height: 125px; }
<div id="flex-container">
  <div>1</div><div>2</div><div>3</div>
  <div>4</div><div>5</div><div>6</div>
  <div>7</div><div>8</div><div>9</div>
</div>
25
Oriol

CSS3が広く利用可能になり、主要なブラウザを介して互換性を持つようになりました。SOのスニペットツールを備えた純粋なソリューションの時間:


CSS3を使用してmasonryレイアウトを作成するには、column-countcolumn-gapで十分です。しかし、media-queriesを使用して応答性を高めました。

実装に飛び込む前に、jQuery Masonryライブラリフォールバックを追加して、レガシーブラウザー、特にIE8-と互換性のあるコードを作成する方がはるかに安全であることを考慮してください。

<!--[if lte IE 9]>
    <script src="/path/to/js/masonry.pkgd.min.js"></script>
<![endif]-->

さあ:

.masonry-brick {
    color: #FFF;
    background-color: #FF00D8;
    display: inline-block;
    padding: 5px;
    width: 100%;
    margin: 1em 0; /* for separating masonry-bricks vertically*/
}

@media only screen and (min-width: 480px) {
    .masonry-container {
        -moz-column-count: 3;
        -webkit-column-count: 3;
        column-count: 3;
    }
}

@media only screen and (min-width: 768px) {
    .masonry-container {
        -moz-column-count: 4;
        -webkit-column-count: 4;
        column-count: 4;
    }
}

@media only screen and (min-width: 960px) {
    .masonry-container {
        -moz-column-count: 5;
        -webkit-column-count: 5;
        column-count: 5;
    }
}
<div class="masonry-container">
   <div class="masonry-brick">Masonry pure CSS3 Masonry pure CSS3 Masonry pure CSS3 Masonry pure CSS3 Masonry pure CSS3 </div>
   <div class="masonry-brick">Masonry pure CSS3 Masonry pure CSS3 Masonry pure CSS3 Masonry pure CSS3 Masonry pure CSS3 </div>
   <div class="masonry-brick">Masonry pure CSS3 Masonry pure CSS3 </div>
   <div class="masonry-brick">Masonry pure CSS3 Masonry pure CSS3 Masonry pure CSS3 Masonry pure CSS3 Masonry pure CSS3 </div>
   <div class="masonry-brick">Masonry pure CSS3 Masonry pure CSS3 Masonry pure CSS3 Masonry pure CSS3 Masonry pure CSS3 Masonry pure CSS3 Masonry pure CSS3 Masonry pure CSS3 Masonry pure CSS3 Masonry pure CSS3 </div>
   <div class="masonry-brick">Masonry pure CSS3 Masonry pure CSS3 Masonry pure CSS3 Masonry pure CSS3 Masonry pure CSS3 </div>
   <div class="masonry-brick">Masonry pure CSS3 Masonry pure CSS3 Masonry pure CSS3 Masonry pure CSS3 Masonry pure CSS3 </div>
</div>
10
Behrad Khodayar

それをcssのみで解決する最良のオプションは、css column-countプロパティを使用することです。

 .content-box {
   border: 10px solid #000000;
   column-count: 3;
 }

詳細はこちらをご覧ください: https://developer.mozilla.org/en/docs/Web/CSS/column-count

CSS Grid Module を使用すると、非常によく似たレイアウトを作成できます。

CodePenデモ

1)3つの固定幅グリッド列を設定します

ul {
  display: grid;
  grid-template-columns: 150px 150px 150px;
  ...
}

2)高さの大きいアイテムが2行にまたがることを確認します

li:nth-child(1),
li:nth-child(3),
li:nth-child(5),
li:nth-child(8),
li:nth-child(9),
li:nth-child(10),
li:nth-child(12)
{
  grid-row: span 2;
}
body {
  margin: 0;
}
ul {
  display: grid;
  grid-template-columns: 150px 150px 150px;
  grid-gap: 1rem;
  justify-content: center;
  align-items: center;
  
  /* boring properties: */
  list-style: none;
  width: 90vw;
  height: 85vh;
  margin: 4vh auto;
  border: 5px solid green;
  padding: 1rem;
  overflow: auto;
  counter-reset: item;
}
li {
  position: relative;
}
li:after {
  content: counter(item);
  counter-increment: item;
  position: absolute;
  padding: 0.3rem;
  background: salmon;
  color: white;
  left:0;
  top:0;
}
img {
  outline: 5px solid salmon;
}
li:nth-child(1),
li:nth-child(3),
li:nth-child(5),
li:nth-child(8),
li:nth-child(9),
li:nth-child(10),
li:nth-child(12)
{
  grid-row: span 2;
}
<ul>
  <li><img src="http://lorempixel.com/150/150/animals" alt="" /></li>
  <li><img src="http://lorempixel.com/150/50/animals" alt="" /></li>
  <li><img src="http://lorempixel.com/150/140/animals" alt="" /></li>
  <li><img src="http://lorempixel.com/150/80/animals" alt="" /></li>
  <li><img src="http://lorempixel.com/150/220/animals" alt="" /></li>
  <li><img src="http://lorempixel.com/150/120/animals" alt="" /></li>
  <li><img src="http://lorempixel.com/150/70/animals" alt="" /></li>
  <li><img src="http://lorempixel.com/150/200/animals" alt="" /></li>
  <li><img src="http://lorempixel.com/150/230/animals" alt="" /></li>
  <li><img src="http://lorempixel.com/150/240/animals" alt="" /></li>
  <li><img src="http://lorempixel.com/150/130/animals" alt="" /></li>
  <li><img src="http://lorempixel.com/150/160/animals" alt="" /></li>
</ul>

Codepenデモ

問題点:

2
Danield

ディスプレイを使用できます:グリッド

例えば:

これは7列のグリッドで、行には自動サイズがあります。

.myGrid{
      display: grid;
      grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr 1fr;
      grid-auto-rows: auto;
      grid-gap: 10px;
      justify-items: center;
}

詳細については、次のリンクにアクセスしてください: https://css-tricks.com/snippets/css/complete-guide-grid/

2
vrbsm

そして石積みよりもさらに進んで行きたい場合は、同位体を使用してください http://isotope.metafizzy.co/ それは石積みの高度なバージョンであり(同じ作者によって開発された)、純粋なCSSではありません、Javascriptのヘルプを使用しますが、非常に人気があるため、多くのドキュメントがあります。

非常に複雑な場合は、アイソトープに基づいた開発に基づいたプレミアムプラグインが多数あります。たとえば、Media Boxes http://codecanyon.net/item/media-boxes-responsive-jquery-grid/568302

1
user1978456

1つgrid-basedの例があります。

.grid-layout {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));
  grid-gap: 10px;
  grid-auto-rows: minmax(100px, auto);
  grid-auto-flow: dense;
  padding: 10px;
}

.grid-layout .item {
  padding: 15px;
  color: #fff;
  background-color: #444;
}

.span-2 {
  grid-column-end: span 2;
  grid-row-end: span 2;
}

.span-3 {
  grid-column-end: span 3;
  grid-row-end: span 4;
}
<div class="grid-layout">
    <div class="item">content</div>
    <div class="item">content</div>
    <div class="item span-3">content</div>
    <div class="item">content</div>
    <div class="item">content</div>
    <div class="item span-2">content</div>
    <div class="item">content</div>
    <div class="item">content</div>
    <div class="item span-3">content</div>
    <div class="item">content</div>
    <div class="item">content</div>
    <div class="item span-2">content</div>
    <div class="item">content</div>
    <div class="item">content</div>
    <div class="item">content</div>
    <div class="item">content</div>
    <div class="item">content</div>
    <div class="item">content</div>
    <div class="item">content</div>
    <div class="item">content</div>
    <div class="item">content</div>
    <div class="item">content</div>
    <div class="item">content</div>
    <div class="item">content</div>
    <div class="item">content</div>
    <div class="item">content</div>
    <div class="item">content</div>
    <div class="item">content</div>
</div>

このコードペンに基づくby Rachel Andrew F.T.W

1