Я разобрался с этим изящным решением JQuery, которое может работать с контейнером неизвестной ширины (ширина: авто).Это работает с DIV, имеющими «float: left» и «position: родственник».Я называю каждый из этих DIV «панелью» (у каждого также будет свой класс «панели»).
Хитрость заключается в том, чтобы выяснить, сколько панелей имеется в каждом ряду (неЯ не знаю этого заранее, так как ширина контейнера сначала неизвестна).Вы можете выяснить количество панелей в ряду, отслеживая первое изменение в позиции (). Top.Панели в первом ряду должны начинаться сверху: 0.Как только вы узнаете, сколько панелей в строке - вы можете перенастроить панели в первых рядах в соответствии с положением каждой панели непосредственно над ней, а также вы можете и должны установить для первой панели каждой новой строки значение «clear: left».
Это необходимо выполнить после того, как панели уже находятся в DOM.Вы также можете прикрепить его кСобытие $ (window) .resize - чтобы перенастроить панели при изменении размера контейнера.
function fixPanelsPosition() {
var panelsPassedInRow = 0;
var panelsPerRow = 0;
var $panelAbove;
var newTop;
var ptop;
$('.panel').each(function (i) {
// reset css (because this will be called on window resize as well...)
$(this).css('top','').css('clear','');
panelsPassedInRow++;
ptop = $(this).position().top;
//Figure out number of panels per row:
if (ptop == 0) { panelsPerRow++; }
// new row
if (panelsPassedInRow > panelsPerRow) {
//First panel in each row should have 'clear:left':
$(this).css('clear','left');
panelsPassedInRow = 1;
}
// If not in first row - bump panel up:
if (ptop > 0) {
$panelAbove = $('.panel').eq(i-panelsPerRow);
newTop = $panelAbove.position().top + $panelAbove.height();
/* Bump the panel up by setting its 'top' value to a negative value.
* If you have margin-top/margin-bottom on the panels you should add that
* value to the calculation:
*/
$(this).css('top',-($(this).position().top-newTop));
}
});
}