如何复制pinterest.com的绝对div堆栈布局


104

我正在寻找复制Pinterest.com的div布局,特别是如何调整列数以适应浏览器调整大小的更多/更少,并且垂直堆叠不取决于相邻列的高度。源代码显示每个div是绝对位置。一位联合创始人回答了Quora的一篇文章,指出这是使用自定义jQuery和CSS完成的。我希望结果从左到右排序。您可以提供任何指示使其成为我自己的方向,将不胜感激。


我用简单的Jquery和CSS编写了自己的代码。如果要在调整大小时进行更改,只需将其包装在函数中,然后在容器元素jsfiddle.net/92gxyugb/1
Andrew WC Brown

Answers:



183

我写了Pinterest脚本。这些ID与布局无关,并且用于其他与交互相关的JS。这是其工作原理的基础:

预先:

  • 绝对放置图钉容器
  • 确定列宽
  • 确定列之间的边距(装订线)

设置一个数组:

  • 获取父容器的宽度;计算适合的列数
  • 创建一个空数组,其长度等于列数。在构建布局时,使用此数组存储每一列的高度,例如,列1的高度存储为array [0]

遍历每个引脚:

  • 将每个图钉添加到最短的列中
  • “ left:” ===列号(索引数组)乘以列宽+边距
  • “ top:” ===当时最短列的数组(高度)中的值
  • 最后,将引脚的高度添加到列的高度(数组值)

结果是轻巧的。在Chrome中,布局一整页的50多个引脚需要不到10毫秒的时间。


4
您如何计算列的高度?如果您不知道其中的项目数量和高度,您如何知道应该达到的高度?您是否有可能布置一些伪代码进行演示?
Michael Giovanni Pumo

22
这是一个扎实的教程-benholland.me/javascript/…–
hollandben

1
匿名用户的反馈(位于编辑队列中):奇怪的是,我在jQuery中执行了完全相同的脚本,实际上创建了一个具有1行N列的表,只是将它们从左到右追加到最短的列而略有不同。优先。即使我还添加了一个“最小高度差”常量,从左到右定位时实际跳过一列都需要此常量,这为布局提供了按时间顺序直观的显示,而不会尽可能地降低高度
2012年

1
@MichaelGiovanniPumo我认为应该在布局之前知道高度(对于Pinterest),它们没有div相互重叠的“初始”状态。如果高度未知,则无法执行此操作。
ptgamr 2014年

1
@ hollandben的链接是死了,新的链接:benholland.me/javascript/2012/02/20/...
Lukmo


2

看完所有选项后,我最终以这种方式实现了类似于Pinterest的布局:

所有DIV是:

div.tile {
    display: inline-block;
    vertical-align: top;
}

这使它们在行中的位置比浮动时更好。

然后,在加载页面时,我会迭代JavaScript中的所有DIV,以消除它们之间的间隙。在以下情况下,它可以很好地工作:

  1. DIV的高度差别不大。
  2. 您不必介意一些轻微的排序冲突(下面的某些元素可以在上面向上拉)。
  3. 您不必介意底线的高度不同。

这种方法的好处-您的HTML对搜索引擎有意义,可以与被防火墙禁用/阻止的JavaScript一起使用,HTML中的元素顺序与逻辑顺序相匹配(新的项目比旧的要早)


嘿,您能告诉我如何计算必须减去的偏移量吗?还有如何解决最后一个元素在右侧的问题,因为有一个元素稍大一些,然后将其推到那里。
Lukas Oppermann

@LukasOppermann 1)瓦片的偏移量是上一行中同一列的瓦片的偏移量与上一行中最高瓦片的高度与同一列中瓦片的高度之差的总和在上一行。看一下dev.sheeporpig.com/news(您首先需要单击链接dev.sheeporpig.com/sheep/3210才能访问开发站点-这样您就可以在单独的文件中查看未压缩和注释的脚本),脚本文件stock_news.js,函数compressTiles。
特别是2013年

@LukasOppermann 2)如果您在回答中使用CSS(尤其是display:inline-block),则不会发生。仅当您浮动:离开div时才会发生。我不使用浮动。
特别是2013年

0

他们按具有ID的列对实体进行拆分(错误的解决方案……更好地使用类名),然后按列组计算位置


2
+1用于查看其源代码。
Bojangles

这对我来说很有趣,但是我认为有一种js计算
量少的更好的

您可以使用display: inline-block我想的方法,但是垂直高度不同的项目不会放在一起。
Bojangles,

1
最好使用列容器(带有的div,float:left;最后一个带有的overflow: hidden;)并在那里存储元素
ant_Ti 2011年

4
好点子。如果您真的想走JavaScript路线,可以使用jQuery Masonry吗?
Bojangles


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.