你的前提是有缺陷的。文档结构从左到右、从上到下流动。您需要对结构进行一些更改...最简单的方法是为左列和右列添加两个容器。否则,您会遇到一些棘手的绝对定位标记和一些时髦的 jquery,我只能建议为每个面板添加一些唯一 ID。
我个人会根据您的示例添加诸如 panel1 到 panel4 之类的 ID,然后使用此 javascript(或类似内容)作为起点:
for(var i=1; i<=4; i++) {
$('#panel'+i).css('left', function(index) {
if(i%2 == 0) return "120px";
else return "0px";
});
}
$('.more').click(function(e) {
e.preventDefault();
$(this).parent().children('p').toggle();
var id = $(this).parent().attr("id");
switch( id ) {
case 'panel1':
console.log("panel1 found");
$('#panel3').css('top', function(index) {
var buffer = $('#'+id).height() + 20 + "px";
return buffer;
});
break;
case 'panel2':
$('#panel4').css('top', function(index) {
var buffer = $('#'+id).height() + 20 + "px";
return buffer;
});
break;
default: break;
}
});
在这些面板的 css 中使用默认值:
#panel1 { top:0px; }
#panel2 { top:0px; }
#panel3 { top:56px; }
#panel4 { top:56px; }
您对 html 的调整越少,您在 javascript 中创建的工作就越多。
编辑:
假设每行有两个元素,建议删除需要更改 HTML 的替代 Javascript。因为我们知道问题所在的行...
var ct = 1
$('#container > div').each(function(index, domEle) {
$(domEle).attr('id', 'panel'+ct);
$('#panel'+ct).css({
'position': 'absolute',
'left' : function(index, value) {
if(ct%2 == 0) return "120px";
else return "0px";
},
'top' : function(index, value) {
return (56 * Math.floor(ct/3)) + "px";
}
});
ct++;
});
$('.more').click(function(e) {
e.preventDefault();
$(this).parent().children('p').toggle();
var id = $(this).parent().attr("id");
switch( id ) {
case 'panel1':
$('#panel3').css('top', function(index) {
var buffer = $('#'+id).height() + 20 + "px";
return buffer;
});
break;
case 'panel2':
$('#panel4').css('top', function(index) {
var buffer = $('#'+id).height() + 20 + "px";
return buffer;
});
break;
default: break;
}
});
现在不需要对 HTML 进行任何更改,但您需要重做 click 函数来处理点击后元素的重新定位。我会让生活变得轻松,并在展开新框之前隐藏所有 .more 项目,因为这意味着必须计算上面所有元素的高度,但你想做多少工作是你的事。