use*_*739 15 html javascript css algorithm
目标是生成流体布局,如下所示.

到目前为止,我有一个工作函数moveBox(lastBox, "east"),可以跟踪行和列索引.
function moveBox(box, where) {
switch (where) {
case "north":
lastTopOffset -= BOX_HEIGHT + BOX_MARGIN;
box.style.top = lastTopOffset + 'px';
box.style.left = lastLeftOffset + 'px';
rowIndex -= 1;
break;
// ...
}
Run Code Online (Sandbox Code Playgroud)
我目前的代码,
(function () {
var i, lastBox,
MAX_DIVS = 72,
BOX_HEIGHT = 50,
BOX_WIDTH = 100,
BOX_MARGIN = 5,
field = document.getElementById('fieldPerimeter'),
fieldHeight = field.offsetHeight,
maxRows = Math.floor(fieldHeight / (BOX_HEIGHT + BOX_MARGIN)),
rowIndex = 0,
colIndex = 0,
lastLeftOffset = 0,
lastTopOffset = 0;
function moveBox(box, where) {
switch (where) {
case "north":
lastTopOffset -= BOX_HEIGHT + BOX_MARGIN;
box.style.top = lastTopOffset + 'px';
box.style.left = lastLeftOffset + 'px';
rowIndex -= 1;
break;
case "east":
lastLeftOffset += BOX_WIDTH + BOX_MARGIN;
box.style.top = lastTopOffset + 'px';
box.style.left = lastLeftOffset + 'px';
colIndex += 1;
break;
case "south":
lastTopOffset += BOX_HEIGHT + BOX_MARGIN;
box.style.top = lastTopOffset + 'px';
box.style.left = lastLeftOffset + 'px';
rowIndex += 1;
break;
default:
break;
}
}
for (i = 0; i < MAX_DIVS; i += 1) {
lastBox = document.createElement('div');
lastBox.className = 'box';
lastBox.innerHTML = i;
field.appendChild(lastBox);
//delete me
if( (i + 1) % 2 === 0 || (i + 1)% 3 === 0){
moveBox(lastBox, "east");
} else {
moveBox(lastBox, "south");
}
//delete me
// if(rowIndex < maxRows && rowIndex > 0){
// if (colIndex % 4 === 0){
// moveBox(lastBox, "south");
// } else if (colIndex % 2 === 0){
// moveBox(lastBox, "north");
// } else {
// moveBox(lastBox, "east");
// }
// }
}
})();
Run Code Online (Sandbox Code Playgroud)
将div附加到容器然后移动它.下面的代码显示了我指定何时移动北或南的部分尝试.但我正在努力实现理想的布局.
if (colIndex % 4 === 0) { moveBox(lastBox, "south"); }
else if (colIndex % 2 === 0) { moveBox(lastBox, "north"); }
else { moveBox(lastBox, "east"); }
Run Code Online (Sandbox Code Playgroud)

这是工作小提琴,http://jsfiddle.net/efortis/zuY74/
注意我硬编码offsetHeight,以便在小提琴上工作,并lastMove在顶部添加一个变量.
for (i = 0; i < MAX_DIVS; i += 1) {
lastBox = document.createElement('div');
lastBox.className = 'box';
lastBox.innerHTML = i;
field.appendChild(lastBox);
if (i === 0) {
rowIndex += 1;
} else {
if (colIndex % 4 === 0 && rowIndex < maxRows) {
moveBox(lastBox, "south");
lastMove = "south";
} else if (colIndex % 2 === 0 && rowIndex !== 1 && lastMove !== "south") {
moveBox(lastBox, "north");
lastMove = "north";
} else {
moveBox(lastBox, "east");
lastMove = "east";
}
}
}
Run Code Online (Sandbox Code Playgroud)