最近项目中需要处理与图片相关的布局,不得不说图片这玩意真想要得到完美的展示效果还真是要费些力气。因为图片的尺寸或者比例各不相同。所以想要不同尺寸的图片有好的显示效果,你就需要找到适合的方式。
而且图片往往是不可或缺元素。毕竟一图胜千言,有时候图片能给带来非常好的效果。
比如我们每天都会使用的表情包,它往往能够表达出我们无法用文字描述的信息,还比如我们经常在公众号里看到的漫画虽然短短几个字,但是却能够让我们看的不亦乐乎。
当然如果我们做图片网站的,那图片的处理就是绕不开的话题了。因对图片的处理经验不多,所以就边学边用。今天就把最近学习与图片相关的知识整理出来。
比如单个图片如何更好的展示,瀑布流布局都有哪些你不知道的实现方式。
接下来我们就直接进入正题,我们先从单张图片的展示说起。
因为图片其本身的独特性:
显然当我们采用 1、2 种方式的时候破坏性很强,无法应用到实际的项目中去。
所以往往我们会在项目中使用第 3 种方式,即设置高度或者宽度。它会保持原有比例进行缩放。
但是问题又来了,图片要么超出容器,要么就会留有空白,除非容器的宽高比恰好等于图片的宽高比时,才会完全贴合。
对于超出容器的图片我们可以使用 overflow: hidden
把超出部分隐藏。图片得到了好的展示效果。但相应的我们也损失了图片的一部分可视区域。
所以这个时候就需要你根据需求进行取舍了,到底是选择隐藏图片的一部分,还是留有空白。有的小伙伴会说,我们产品说了,图片变形没问题,你就给我充满容器就行了。好吧…
即使如此,你也要把这篇文章好好读一读,因为需求是千变万化的,保不齐哪一天就需要了。
又有小伙伴说,这 2 种都不符合我们的产品需求怎么办,还有其他的方式吗?答案是必须的,一起来看。
CSS3 的 object-fit 属性是用来指定「可替换元素」的内容是如何适应到容器中的。它的值有 5 种。分别为:fill | contain | cover | none | scale-down
。先看下效果在来一一解释它们到底都是什么意思。
看到上面的显示效果,理解起来并不难了。
而 scale-down
有两种表现方式所以我们单独来看。
到这里不知道有没有小伙伴和我一样,在看到图片的不同表现时,我特意去浏览器查看了下 的真实尺寸,发现依然是
width: 100%;height: 100%;
是充满整个容器的。
但为什么内容显示却有不同的效果呢,这让我产生了疑惑。本着发现探索的精神,就去寻找答案了。
W3c 是这么描述的:标签创建的是被引用图像的占位空间。
而张鑫旭大大在半深入理解CSS3 object-position/object-fit属性一文中也指出:
元素其实与内容是相互独立的。
相当于一个外壳包裹着内容。你控制的只是
元素的尺寸。而内容的尺寸则由
object-fit
属性控制。
综上索述,是一个空间占位符,并不控制内容。原来如此。感觉自己又进步了。每一次的探索,都会发现新的东西,这种感觉很奇妙。特别是还把它整理出文章,提供大家学习,感觉牛逼哄哄带闪电。
知道了这些之后我们操控图片时更加的得心应手一些。那会了这些就结束了吗?不不不,这才是刚刚开始,精彩的还在后面。后面的布局才更加精彩。
上面一直在说的都单张图片的显示。只要我们把图片用合适的方式放进容器即可。如果是图片列表呢?或者专门展示图片的网站会有大量的图片而且尺寸和比例千奇百怪,各不相同。
假设要想实现一个图片画廊效果,首先我们给图片一个 float: left
,但是由于图片的尺寸不一样,导致每个图片的高度不同,下一行的图片就会卡住,导致布局错乱。
此时你不得不给容器设置高度,让图片能够底部对齐,但在文章一开始我们也提到了,这时候图片要么超出容器的高度,要么留有空白。
那如果使用 object-fit
属性按照业务需求去控制内容,貌似可以完成任务。
我们把值设为 contain,布局是没有问题了,但是其实很不美观。如果设为 cover,如果图片过大很多内容都会丢失看不到。 怎么办?有什么解决办法?这时候就是瀑布流布局的优势了。
瀑布流布局即不会出现错乱现象,而且会最大限度显示图片的内容。所以是众多图片网站选择的布局方式。
而瀑布流布局目前有两种形式:一是等宽型,二是等高型。我们先来说说等宽型。
看到上面你实现的思路是什么?可以思考几秒,接下来一起来看这些实现方式中有没有和你一思路一样的。
关键思路:
关键代码:
优势:思路清晰简单,不需要做过多的计算,只要计算需要显示的列数然后添加图片即可。
劣势:每列的末尾可能不够友好,可能出现有些列会很长,有些又会很短。
关键思路:
关键代码:
优势:因为每次追加的图片都是最短列,所以末尾的展示会比思路 1 中要友好很多。
劣势:没渲染一张都会计算一次 top,left 值。而且图片的顺序是打乱的。
关键思路:
关键代码:
优势:更加简单,不用额外计算,直接使用CSS渲染高效。
劣势:图片的顺序是从上向下排列的,这个要看业务需求允不允许了。另外列数固定。
不过你可以尝试通过媒体查询设置不同列数
@media (min-width: 768px) {
.waterfall-width-column {
column-count: 3;
}
}
@media (min-width: 992px) {
.waterfall-width-column {
column-count: 4;
}
}
@media (min-width: 1200px) {
.waterfall-width-column {
column-count: 6;
}
}
说完了等宽型接下来我们来说说等高型。
关键代码:
优势:图片的内容得到全部展示,不会被隐藏。
劣势:需要反复计算以及缩放。