如何创建网格/平铺视图?

时间:2011-12-12 04:50:01

标签: css grid positioning css-float tiles

例如,我有一些类.article,我想将此类视为网格视图。所以我应用了这种风格:

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

该样式将使.article看起来平铺/网格。固定高度可以正常工作。但是如果我想将高度设置为自动(根据其中的数据自动拉伸),网格看起来很讨厌。

enter image description here

我想这样看法:

enter image description here

8 个答案:

答案 0 :(得分:76)

此类布局称为砌体布局。砌体是另一种网格布局,但它会填充由元素高度差异引起的空白。

jQuery Masonry是用于创建砌体布局的jQuery插件之一。

或者,您可以使用CSS3 column。但是现在基于jQuery的插件是最好的选择,因为CSS3列存在兼容性问题。

答案 1 :(得分:25)

您可以使用flexbox。

  1. 将元素放在多行列Flex容器中

    #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。

  4. 
    
    #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>
    &#13;
    &#13;
    &#13;

答案 2 :(得分:10)

现在CSS3已经广泛使用&amp;通过主流浏览器兼容,是时候采用SO&#s封装工具的纯解决方案:

使用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]-->

我们走了:

&#13;
&#13;
.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;
    }
}
&#13;
<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>
&#13;
&#13;
&#13;

答案 3 :(得分:4)

仅使用css解决此问题的最佳方法是使用css column-count属性。

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

点击此处了解详情:https://developer.mozilla.org/en/docs/Web/CSS/column-count

答案 4 :(得分:1)

如果你想要比砌体更进一步,使用同位素http://isotope.metafizzy.co/它是砌体的高级版本(由同一作者开发)它不是纯CSS,它使用Javascript的帮助但它非常受欢迎,所以你会发现很多文档

如果您发现它非常复杂,那么很多基于同位素开发的高级插件已经存在,例如Media Box http://codecanyon.net/item/media-boxes-responsive-jquery-grid/5683020

答案 5 :(得分:1)

使用CSS Grid Module,您可以创建非常相似的布局。

CodePen demo

1)设置三个固定宽度的网格列

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;
}

&#13;
&#13;
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;
}
&#13;
<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>
&#13;
&#13;
&#13;

Codepen demo

问题:

  • 项目之间的差距不会是统一的
  • 您必须手动将大/高项目设置为跨越2行或更多行
  • Limited browser support :)

答案 6 :(得分:1)

  

您可以使用display:grid

例如:

这是一个包含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/

答案 7 :(得分:0)

有一个基于网格的示例。

class DocIntEnum(IntEnum):
    def __new__(cls, value, doc=None):
        self = int.__new__(cls, value)  # calling super().__new__(value) here would fail
        self._value_ = value
        if doc is not None:
            self.__doc__ = doc
        return self
.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;
}

based on this code-pen 作者:Rachel Andrew F.T.W