我正在做一个电子商店,货物像往常一样在网格中显示为“瓷砖”。我只想使用各种尺寸的瓷砖,并确保(通过jQuery)没有可用空间。
在基本情况下,我有一个960px的包装器,想要使用240x180px(类.grid_4)磁贴和480x360px(类.grid_8)磁贴。看图像(想象那里没有边距/填充):
alt text http://img580.imageshack.us/img580/2828/screenshot2010041508h52.png
没有jQuery的问题:
到目前为止我的解决方案看起来像这样:
$(".grid_8").each(function(){
//console.log("BIG on position "+($(this).index()+1)+" which is "+(($(this).index()+1)%2?"ODD":"EVEN"));
switch (($(this).index()+1)%4) {
case 1:
// nothing needed
//console.log("case 1");
break;
case 2:
//need to shift one position and wrap into 240px div
//console.log("case 2");
$(this).insertAfter($(this).next()); //swaps this with next
$(this).prevAll(":nth(0), :nth(1)").wrapAll("<div class=\"grid_4\" />");
break;
case 3:
//need to shift two positions and wrap into 480px div
//console.log("case 3");
$(this).prevAll(":nth(0), :nth(1)").wrapAll("<div class=\"grid_4\" />"); //wraps previous two - forcing them into column
$(this).nextAll(":nth(0), :nth(1)").wrapAll("<div class=\"grid_4\" />"); //wraps next two - forcing them into column
$(this).insertAfter($(this).next()); //moves behind the second column
break;
case 0:
//need to shift one position
//console.log("case 4");
$(this).insertAfter($(this).next());
//console.log("shifted to next line");
break;
}
});
从评论中可以看出它是如何工作的 - 通常总是通过在需要时移回一个位置来确保大块位于奇数位置(前面的小块的数量是偶数)。另外一个div需要将大块左边的小块包裹在另一个div中,这样它们就会出现在列而不是行中。
现在最后问题:
非常感谢您的任何提示。随意重用代码,我认为它可能很有用。
约瑟夫
答案 0 :(得分:3)
听起来你需要使用名为masonry的jQuery插件。
你可以找到它here
答案 1 :(得分:0)
这是否足够简化了?
$(".grid_8")
.each(function () {
switch (($(this)
.index() + 1) % 4) {
case 1:
break;
case 2:
$(this)
.insertAfter($(this)
.next()), $(this)
.prevAll(":nth(0), :nth(1)")
.wrapAll('<div class="grid_4" />');
break;
case 3:
$(this)
.prevAll(":nth(0), :nth(1)")
.wrapAll('<div class="grid_4" />'), $(this)
.nextAll(":nth(0), :nth(1)")
.wrapAll('<div class="grid_4" />'), $(this)
.insertAfter($(this)
.next());
break;
case 0:
$(this)
.insertAfter($(this)
.next())
}
})