这个简单的瀑布流图片布局使用了flexbox。html代码非常简单:
<div id="masonry"> <img src="images/1.jpg"> <img src="images/2.jpg"> <img src="images/3.jpg"> <img src="images/4.jpg"> <img src="images/6.jpg"> <img src="images/8.jpg"> <img src="images/9.jpg"> <img src="images/7.jpg"> </div>
css代码页相当简单,下面的代码中没有使用厂商的前缀。
div#masonry { display: -ms-flexbox; -ms-flex-direction: column; -ms-flex-wrap: wrap; display: flex; flex-direction: column; flex-wrap: wrap; height: 100vw; font-size: 0; } div#masonry img { width: 33.3%; transition: .8s opacity; } div#masonry:hover img { opacity: 0.3; } div#masonry:hover img:hover { opacity: 1; }
css代码要注意一点:图片高度的限制。没有这个限制,图片将忽略flex-wrap属性继续在垂直列上排列。
Firefox回调
在Firefox 28版本之前,firefox不支持多行多列的flexbox。对于没有升级的用户,我们要给他们一个回调。
@supports not (flex-wrap: wrap) { div#masonry { display: block; } div#masonry img { display: inline-block; vertical-align: top; } }
作为媒体查询的一部分,@supports可以知道浏览器支持哪些CSS属性,就像@media queries可以知道屏幕的大小、高度和分辨率一样。现在,@supports能够为我们提供纯css的回调,而不必使用javascript。
目前只有Firefox、Chrome和最新版本的Android浏览器能够识别@supports。但是没关系,上面的CSS已经覆盖了IE10,对于IE9及以下的版本,可以使用注释来解决它们。但是较早版本的Firefox存在一个问题:它支持display:flex但不支持flex-wrap。这将导致视觉上有些偏差。
对于Firefox 27及更早的版本,我们去除了容器元素的display:flex,并将图片改为display: inline-block,虽然偶尔会出现列与列之间的小缝隙,但比之前的效果要好得多。
移动设备(Mobile)
在移动设备上制作两列布局是非常简单的:
@media screen and (max-width: 500px) { div#masonry { height: 200vw; } div#masonry img { width: 50%; } }
小结
正如你所见,使用flexbox制作瀑布流masonry布局和相片分享网站的布局将是一件非常简单的事情。