基于Flex的简单磁贴式布局
今天Mozilla Foundation发布的了FireFox v28,带来了对多行多列形式 flexbox布局的跨平台支持。在我的
Designer’s Guide To Flexbox中,
我对此技术的带来的更多新布局可能性有很我要说的。
但现在,我还是先要庆祝一下flexbox元素带来的小例子。
如果你还没有升级最新的浏览器,我将会给出一些反馈选项。
制作图片磁贴
这个例子是用flexbox实现的一个磁贴式图片布局。实现起来很简单。
<div id="masonry">
<img src="irina.jpg" alt>
<img src="daniella.jpg" alt>
<img src="karina.jpg" alt>
…
</div>
CSS也非常简单,在样式表中,我没有使用Chrome与FireFox内核特定的前缀,flexbox在这两者中都是可以免前缀的。(但是在 IE 中不可以)
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;
max-height: 0; //chrome v48 会有 flex 下 img 的 height 不能按比例放缩的 BUG
}
div#masonry:hover img {
opacity: 0.3;
}
div#masonry:hover img:hover {
opacity: 1;
}
在这段代码中有一处要点:是对个DIV容器(#masonry)高度的设定。
如果没有这个限制,这些图片就会以一个单纯的不换行垂直列的形式显示,从而忽视了 flex-wrap 的属性。
针对 Firefox 的绛级处理
对于那些还没有升级到最新 Firefox 的用户,我在样式表的最后多加了一项CSS规则
@supports not (flex-wrap: wrap) {
div#masonry {
display: block;
}
div#masonry img {
display: inline-block;
vertical-align: top;
}
}
这是一个特征查询的代码块。@supports语法会使一个网页对当前浏览器支持哪些 CSS 属性或特性作出一个判断。
就像@media 媒体查询一样,可以让我们检查当前视窗的宽高与分辨率。
到现在,@supports 让我们可以在纯 CSS 中实现对浏览器的回退绛级处理,替代了许多对特性与兼容性检测的javascript脚本。
现在,@supports仅在Firefox、Chrome和最新版的Android浏览器中有效(写这篇文章时是4.4)。
好吧,估计又有人问到 IE 的情况了,IE10也是支持的,
IE9及其更早的版本可以将单独针对这个问题的样式(表)
写在一个特有的条件注释中。
但是在早期的 Firefox 中会出现一个问题:它支持display: flex但不支持flex-wrap,视觉上简直是一种“科学怪物”。
对于 Firefox 27 及更早期的浏览器,我们可以将容器中的display: flex去掉,对每个 img 加上 display:inline-block的属性。
这样的结果会有些不同,常会在纵向图之间出现垂直的间隙,但这也比其它的好点。
移动端的支持
在移动端改变成两列布局以保证图片的显示效果也是很简单的:
@media screen and (max-width: 500px) {
div#masonry {
height: 200vw;
}
div#masonry img {
width: 50%;
}
}
总结
就像你看到的,flexbox可以让我们方便的制作出磁贴式或Pinterest-Style风格的布局。
当然,还有一种比“可换行flex元素”更好的解决方案,过些日子给大家展示。