例如,我有一些.article类,并且我想将该类作为网格视图进行查看。所以我采用了这种风格:
.article{
width:100px;
height:100px;
background:#333;
float:left;
margin:5px;
}
这种样式将使.article看起来平铺/网格化。固定高度可以正常工作。但是,如果我要将高度设置为自动(根据其中的数据自动拉伸),则网格看起来很讨厌。
我想要这样的视图:
例如,我有一些.article类,并且我想将该类作为网格视图进行查看。所以我采用了这种风格:
.article{
width:100px;
height:100px;
background:#333;
float:left;
margin:5px;
}
这种样式将使.article看起来平铺/网格化。固定高度可以正常工作。但是,如果我要将高度设置为自动(根据其中的数据自动拉伸),则网格看起来很讨厌。
我想要这样的视图:
Answers:
这种布局称为砌体布局。石工是另一种网格布局,但它将填充由元素高度不同引起的空白。
jQuery Masonry是创建砌体布局的jQuery插件之一。
或者,您可以使用CSS3 column
。但是目前基于jQuery的插件是最佳选择,因为CSS3列存在兼容性问题。
您可以使用flexbox。
将元素放置在多行列flex容器中
#flex-container {
display: flex;
flex-flow: column wrap;
}
重新排列元素,以使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 */
在每列的第一项之前强制分行符:
#flex-container > :nth-child(-n + 3) {
page-break-before: always; /* CSS 2.1 syntax */
break-before: always; /* New syntax */
}
可悲的是,并非所有浏览器都支持flexbox中的换行符。不过,它可以在Firefox上运行。
既然CSS3可以通过主要的浏览器广泛使用并兼容,那么现在是使用SO的摘录工具的纯解决方案的时候了:
对于使用CSS3 创建砌体布局,只需column-count
配合使用即可column-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>
masonry bricks
。该列按从上到下的顺序排序,问题是要求顺序在水平方向保持不变,而不是在垂直方向切换。例如,在上面找到的最短的块应该在第三列中但在第一行中。
解决仅使用CSS的最佳选择是使用CSS的column-count属性。
.content-box {
border: 10px solid #000000;
column-count: 3;
}
检查此以获取更多信息:https : //developer.mozilla.org/en/docs/Web/CSS/column-count
使用CSS网格模块,您可以创建非常相似的布局。
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;
}
如果您想进一步了解砖石,请使用同位素http://isotope.metafizzy.co/。这是砖石的高级版本(由同一作者开发),它不是纯CSS,它使用了Javascript的帮助但它非常受欢迎,因此您会发现很多文档
如果您觉得它很复杂,那么已经有很多高级插件已经基于同位素进行了开发,例如Media Boxes http://codecanyon.net/item/media-boxes-sensitive-jquery-grid/5683020
有一个基于网格的示例。
.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>