这有点难以解释和理解..但这里是:
通过运行 for 循环检查每个 div 与每个 div。
x,y,h,w
- x 是左上角到左边的距离。
- y 是左上角到顶部的距离。
- h 是 div 的高度。
- w 是 div 的宽度。
要考虑的点...您实际上并不需要检查每个 div ..考虑一下
有 10 个 div...
- 首先,您将检查 1 与 9。
- 二一对八。
- ......
- 八一对二。
- 九一对一。
- 不要最后一个。
在将它们分配给 dom 之前,分配值并检查数据中的冲突也是一个好主意。 Dom 应该只用于渲染最终结果。
我假设你不想保留两个冲突的 div。
预览
http://jsfiddle.net/techsin/m4fSf/6/
正如预期的那样,代码很大
var
div={},
number=10,
size=20,
m = ele('main');
mw= parseFloat(getComputedStyle(m).getPropertyValue("width"))-size,
mh= parseFloat(getComputedStyle(m).getPropertyValue("height"))-size,
f=true,
nn;
var i
for (i = 0; i < number; i++) {
div[i] = {};
var t = true, newX, newY, nn;
if (i!=0){
while (t) {
newX = rand(mw);
newY = rand(mh);
for (nn = 0; nn < i; nn++) {
if (!(((newX > div[nn].x + size+5) || (newY > div[nn].y + size+5)) ||
((newX + size+5 < div[nn].x) || (newY + size+5 < div[nn].y)))) {
break;
}
if (nn == i-1) t = false;
}}} else {
newX = rand(mw);
newY = rand(mh);
}
console.log(newX);
div[i].x = newX;
div[i].y = newY;
}
for (i = 0; i < number; i++) {
render(div[i]);
}
console.log(div);
function render(x){
var d=document.createElement('div');
d.style.position='absolute';
d.style.left=(x.x+'px');
d.style.top=(x.y+'px');
m.appendChild(d);
}
function rand(x) { return Math.random()*x;}
function ele(x){return document.getElementById(x);}
这段代码来自我的碰撞站点...我试着把它放在上面的代码中,但这是避免碰撞和缩小差距所需要的。
if (xpost+30>xx.left && xx.left>xpost && xx.top+30>ypost && xx.top<ypost+30) { xspeed = -speed; }
if (xpost<xx.left+30 && xx.left<xpost && xx.top+30>ypost && xx.top<ypost+30) { xspeed = speed; }
if (ypost+30>xx.top && xx.top>ypost && xx.left+30>xpost && xx.left<xpost+30) { yspeed = -speed; }
if (ypost<xx.top+30 && xx.top<ypost && xx.left+30>xpost && xx.left<xpost+30) { yspeed = speed; }