【发布时间】:2017-07-20 13:53:49
【问题描述】:
我想创建一个图片列表,就像 Facebook 在您查看相册时所做的那样:
所以,输入数据是:
- 我们有一个
infinite已知图像列表width和height - 我们有一个
container和一个已知的width和无限高 - 我们希望按照图像在首选列数上的列出顺序显示图像,调整它们的宽度以适应容器宽度
- 有时图像会覆盖一排或两排或多排,例如纵向或横向
一些涵盖可能情况的 ascii 场景:
|------------------|------------------|------------------|
| | | |
| Normal tile | Normal tile | Normal tile |
| | | |
|------------------|------------------|------------------|
| | |
| Landscape tile | |
| | |
|------------|------------------------|------------------|
| | | |
| Smaller | Landscape tile | Normal tile |
| | | |
|------------|--|------------------|--|------------------|
| | | |
| Portrait tile | Normal tile | Larger tile |
| | | |
| |------------------|---------------------|
| | | |
| | Larger tile | Normal tile |
| | | |
|---------------|---------------------|------------------|
我考虑过使用 D3 js 中的 Treemap 算法,但我不太确定这是否是正确的选择,因为在我的问题中我不知道容器的高度。
这是一个包装问题。
任何帮助或想法将不胜感激!
更新
可以对图像进行缩放或剪裁以更好地适应布局。 因此,例如,如果有一个方形瓷砖可以填充一行并且当前图像是纵向图像,则该算法可以将图像缩放到可用宽度并将其裁剪到可用高度,或者相反。
【问题讨论】:
-
你可能想看看 Flexbox 网格系统。 philipwalton.github.io/solved-by-flexbox/demos/grids
-
树形图在这里不是最好的选择。树形图的空洞点根据传入的值和平铺方法动态生成矩形。这显然不是您想要的,因为您已经为每个元素预定义了宽度和高度。
-
感谢@NicoVanBelle,这似乎是一个很好的资源!
-
whole 点,而不是 hole 点,抱歉(S.O. 确实应该增加编辑 cmets 的 5 分钟宽限期)。
-
如果瓷砖的水平尺寸非常不稳定,我不会谈论列。我认为,试图去想它们,你是在给自己制造问题。
标签: javascript algorithm d3.js packing