Есть такие данные Code: var _window_height=1000; //Высота экрана var _this_block_height=50; //Высота данного блока var _tmps=[ [950,50], [850,100], [600,50] ]; //Массив из позициями блоков и высотами уже существующих блоков Мне нужно расчитать,куда лучше всего вставить Новый блок,между уже существующими,чтобы он не заехал на них,и был в притык к ним Пример: Сообщения в ICQ - когда вылазят с права окошки,когда уже есть в той или иной позиции окно - то оно идёт выше,если еще есть - еще выше,чтобы не залезть друг на друга но в ICQ всё совсем просто...там одинаковая высота окон,т.е. разделить размер экрана на высоту окошка и проверять не занята ли позиция... но моя задача гараздо сложнее,у меня могут быть окна разной высоты и стоять в разных позициях (одно может пропасть а 2е,то что выше - остаться) Как расчитать свободные оптимальные промежутки между окнами чтобы его туда впихнуть (приоритет отдавать нижним позициям,т.е. расчёт с низу экрана)? Вот пример картинкий,для более лёгкого восприятия вопроса Нужно получить координаты по X и высоту Пустых блоков,с сортированием,чтобы было 1е значение массива - самый оптимальный вариант...
может запоминать в двумерный массив координаты левого нижнего и правого верхнего углов: Code: arrayWindows[0] => [0] = 100 //x1 [1] = 0 //y1 [2] = 0 //x2 [3] = 100 //y2 arrayWindows[1] => ... //и т.д. короче(начало системы координат в правом нижнем углу экрана) потом искать между двумя соседними окнами разницу: Code: arrayWindows[1][0] - arrayWindows[0][2];//x1 второго окна - x2 первого окна и если эта разница больше ширины окна то впихнуть окно туда. чтобы вставлять окна снизу, перебор массива нужно начать с 0. ну и при исчезновении окна удалять данные из массива. Геморно с реализацией, но больше пока идей нет.
Code: var _tmps=[]; $('.mxn_modal').each(function(){ _tmps.push([$(this).data('top'),$(this).data('height')]); }); _tmps.sort(function(i, ii) { if (i[0] < ii[0]) return 1; else if (i[0] > ii[0]) return -1; else return 0; }); var _tmp_h=_tmp.height(); var _posts=[]; for(var i in _tmps){ if(i==0){ _posts.push([$(window).height()-($(window).height()-(_tmps[i][0]+_tmps[i][1])),$(window).height()-(_tmps[i][0]+_tmps[i][1])]); }else if((_tmps[i-1][0]-(_tmps[i][0]+_tmps[i][1])+3)>=_tmp_h){ _posts.push([_tmps[i][0]+_tmps[i][1],_tmps[i-1][0]-(_tmps[i][0]+_tmps[i][1])]); break; } } if(_tmps.length>0)_posts.push([0,_tmps[_tmps.length-1][0]]); var _position=$(window).height()-_tmp_h-3; for(var i in _posts){ if(_posts[i][1]>=_tmp_h+3){ _position=_posts[i][0]+_posts[i][1]-_tmp_h-3; break; } } Спустя 6 часов - получилась вот такая кака...но работает=)