小编典典

智能对齐/页面上多个图像的布局

algorithm

假设我正在开发一个需要显示大量不同大小和纵横比的图像的应用程序,例如Flickr照片流或Google Image搜索。

是否有任何现有的算法/库可以帮助确定每行的高度以及每行应插入多少图像,从而使图像之间的间隙尽可能小,同时也不会过度调整任何图像的大小,从而使所有图像保持不变相对相似的尺寸(当然不会改变长宽比)?

理想情况下,它将是一种可插入算法,接收图像大小,目标/平均行高,屏幕宽度的列表作为输入,并返回“行分配”列表,说明哪些图像进入哪一行,以什么尺寸以及什么行高是。

这个Flickr页面是我想要实现的一个很好的例子:

http://www.flickr.com/explore


阅读 291

收藏
2020-07-28

共1个答案

小编典典

围绕Flickr布局,可能已经有足够的Javascript脚本。但是,推出自己的产品并不难。

该算法类似于自动换行。查看您链接的Flickr页面:一行中的图像都具有相同的高度。这些行的高度略有不同,这使外观看起来不均匀,但也确保了行在整个屏幕上延伸。

假设您的父元素具有固定的宽度,但是高度灵活,可以适应图像布局。然后,您可以轻松地布置图像列表:

  • 保留行列表;每行都是图像列表。一开始,该行列表为空。

  • 选择行的标称高度。这将是图像的最小高度。确定每个图像的实际高度和宽度并计算名义宽度:

    w_nom = w_orig * h_nom / h_orig
    
  • 对于列表中的每个图像,找到可以容纳该图像的行,即列表中图像的宽度加上装订线宽度加上图像的宽度必须小于父元素的宽度。如果没有这样的行(或者行列表为空),请开始新的一行并放置图像。

  • 现在每个图像都有一行。对于每一行,为所有图像选择比例因子,以使所有图像的宽度加上(恒定的,即未缩放的)装订线是父图像的宽度。缩放每个图像的宽度和高度。

  • 现在进行布局:将图像从上到下放在父元素上。调整父母的身高。

这只是初稿。更具雄心的布局可以为每一行计算一个“坏处”,并更智能地分发图像。同样,如果最后一行只有一个小图像,那会不合理地被炸掉,但是如果您有很多图像,则用户必须滚动很多才能看到它。我还不知道如果调整父元素的大小时必须立即执行此操作,效果如何。

我在这里用Javascript做了一个小模型,但这只是概念上的证明-
例如,它在IE中不起作用。代码在页面源代码中,并且不必要地复杂,因为摆弄javascript样式是如此罗word。该算法本身非常简单。

2020-07-28