이것은 테트리스를 생각나게 합니다. 컨테이너의 모든 블록 요소는 절대 위치로 정렬됩니다. 들어갈 수 없으면 여기에 넣습니다. . 요소 배치, 을 찾을 수 없으면 다음 줄로 줄 바꿈하세요. 코드에 자세한 설명이 있으니 코드만 보시면 됩니다. 다음은 데모입니다: http://demo.jb51.net/js/2012/sortRect/코드 패키지 다운로드sortRect.rar 코드 복사 코드는 다음과 같습니다. 不规则宽高排列 <br> <br> <br>.box { <br>position: absolute; <br>width: 100px; <br>height: 100px; <br>border: 1px solid #ffffff; <br>display: none; <br>background: url(img/1.jpg); <br>/*margin-left: 4px; <br>margin-top: 4px;*/ <br>} <br>.box2 { <br>position: absolute; <br>width: 100px; <br>height: 202px; <br>border: 1px solid #ffffff; <br>display: none; <br>background: url(img/2.jpg); <br>/*margin-left: 4px; <br>margin-top: 4px;*/ <br>} <br>.box3 { <br>position: absolute; <br>width: 202px; <br>height: 100px; <br>border: 1px solid #ffffff; <br>display: none; <br>background: url(img/3.jpg); <br>/*margin-left: 4px; <br>margin-top: 4px;*/ <br>} <br>.box4 { <br>position: absolute; <br>width: 202px; <br>height: 202px; <br>border: 1px solid red; <br>background: url(img/4.jpg); <br>display: none; <br>} <br> <br>//初始化矩阵 <br>var initMatrix = function(x, y){ <br>if (!x || !y) { <br>return; <br>} <br>x = ~ ~ x; <br>y = ~ ~ y; <br>var mt = []; <br>var i = 0; <br>var getX = function(xl){ <br>var i = 0; <br>var 행렬X = []; <br>for (; i matrixX[i] = 0; <br>} <br>return { <br>mt: MatrixX, <br>isComplete: false, <br>spaces: [{ <br>index: 0, <br>len: MatrixX.length <br>}] <br>}; <br>} <br>for (; i < y; i ) { <BR>mt[i] = getX(x); <BR>} <BR>반환산; <BR>} <BR>//生成元素상应的队列 <BR>var getQuene = function(eleColl, base){ <BR>if (!eleColl) { <BR>return; <BR>} <BR>var quene = []; <BR>var i = 0; <BR>var len = eleColl.length; <BR>var getEleMatrix = function(ele, base){ <BR>var ht = ele.outerHeight() / base.height; <BR>var wt = ele.outerWidth() / base.width; <BR>return { <BR>ele: ele, <BR>ht: ht, <BR>wt: wt <BR>} <BR>} <BR>for (; i < len; i ) { <BR> quene[i] = getEleMatrix($(eleColl[i]), base); <BR>} <BR>반환 퀸; <BR>} <BR>//以行为单位扫描矩阵 <BR>var sortEveryEle = function(pannelMatrix, sortQuene, unitEle, callback){ <BR>if (!pannelMatrix || !sortQuene) { <BR>return; <BR>} <BR>unitEle = unitEle || <BR>{ <BR>너비: 0, <BR>높이: 0 <BR>}; <BR>var checkSpace = function(line){ <BR>var i = 0; <BR>var len = line.mt.length; <BR>var tmpWt = 0; <BR>var tmpidx = 0; <BR>var tmpQuene = []; <BR>var isSetIdx = false; <BR>for (; i < len; i ) { <BR>if (line.mt[i] == 0) { <BR>if (!isSetIdx) { <BR>tmpidx = i; <BR>isSetIdx = true; <BR>} <BR>tmpWt ; <BR>} <BR>if ((line.mt[i] == 1) || (i == len - 1)) { <BR>//保存space信息到里面队列 <BR>if (tmpWt > ; 0) { <BR>tmpQuene.push({ <BR>index: tmpidx, <BR>len: tmpWt <BR>}); <BR>} <BR>//공중공간 <BR>tmpidx = 0; <BR>tmpWt = 0; <BR>} <BR>} <BR>if (tmpQuene.length <= 0) { <BR>line.isComplete = true; <BR>} <BR>line.spaces = tmpQuene; <BR>반환; <BR>} <BR>var updateMartix = function(curLine, mt, ele, spidx, lineNum){ <BR>var i = j = 0; <BR>//获取当前공백주 <BR>var sp = curLine.spaces[spidx]; <BR>//如果保 多行则更新所有過间 <BR>if (ele.ht > 1) { <br>j = 0; <br>for (; j i = 0; <br>for (; i mt[lineNum j].mt[sp.index i] = 1; <br>} <br>//更新공백공간 <br>checkSpace(mt[lineNum j]); <br>} <br>} <br>else {//如果是单行的话只要更新第一个本行 <br>for (; i < ele.wt; i ) { <BR>curLine.mt[sp .index i] = 1; <BR>} <BR>//更新模块 <BR>checkSpace(curLine); <BR>} <BR>}; <BR>//获取합동적 원계 <BR>var getRightEle = function(stQu, wd){ <BR>var i = 0; <BR>var len = stQu.length; <BR>for (; i < len; i ) { <BR>if (stQu[i].wt <= wd) { <BR>return stQu.splice(i, 1); <BR>} <BR>} <BR>반환; <BR>} <BR>//扫描单行 <BR>var scanLine = function(oneLine, sortQuene, mt, lineNum){ <BR>var i = 0; <BR>var len = oneLine.spaces.length; <BR>//填充 <BR>var theWt = oneLine.spaces[i].len; <BR>var mtLeft = mtTop = 0; <BR>//判断能容纳的宽是多少 <BR>var rtEle = getRightEle(sortQuene, theWt); <BR>if (rtEle) { <BR>//放置元素 <BR>//rtEle[0].ele.css("left", oneLine.spaces[i].index * 102);//기본 너비 <BR> 🎜>//rtEle[0].ele.css("top", lineNum * 102);//기본 높이; <BR>mtLeft = oneLine.spaces[i].index * (unitEle.width || 0); <BR>mtTop = lineNum * (unitEle.height || 0); <BR>if (콜백) { <BR>callback({ <BR>왼쪽: mtLeft, <BR>상단: mtTop, <BR>직선: rtEle[0] <BR>}); <BR>} <BR>//更新矩阵 <BR>updateMartix(oneLine, mt, rtEle[0], i, lineNum); <BR>//返回位置队列 <BR>return { <BR>left: mtLeft, <BR>top: mtTop, <BR>right: rtEle[0] <BR>} <BR>} <BR>} <BR>var i = j = 0; <BR>var pmLen = pannelMatrix.length; <BR>var CompleteLine = 0; <BR>var thePosQuene = [], pos; <BR>for (; i < pmLen; i ) { <BR>while (!pannelMatrix[i].isComplete && (sortQuene.length > 0)) { <br>pos = scanLine(pannelMatrix[i], sortQuene , 패널매트릭스, i); <br>if (pos) { <br>thePosQuene.push(pos); <br>} <br>} <br>} <br>return thePosQuene; <br>} <br>var con = $("#con"); <br>//생성상의 두 가지 유형 <br>var baseWidth = 102; <br>var baseHeight = 102; <br>var base = { <br>width: baseWidth, <br>height: baseHeight <br>} <br>var pannel = $("#pannel"); <br>var thePannelSize = { <br>너비: pannel.width(), <br>높이: pannel.height() <br>}; <br>var pannelMatrix = initMatrix(thePannelSize.width / baseWidth, thePannelSize.height / baseHeight); <br>//得到要排序不规则宽高的方块队列 <br>var sortQuene = getQuene(pannel.find("div"), base); <br>//遍历matrix <br>var theQu = sortEveryEle(pannelMatrix, sortQuene, base); <br>var theQuOne = theQu.shift(); <br>var selfCall = function(){ <br>if (!theQuOne) { <br>return; <br>} <br>var my =args.callee; <br>theQuOne.lect.ele.show().animate({ <br>left: " " theQuOne.left, <br>top: " " theQuOne.top <br>}, { <br>기간: 1000, <br>완화: "easeOutBounce", <br>완료: function(){ <br>theQuOne = theQu.shift(); <br>my.call(); <br>} <br>}); <br>} <br>selfCall(); <br><br>