Я не знаю, какой объект является контейнером вашего размера, и я не уверен, что точно понял, какой должна быть логика, но если предположить, что контейнер равен grid_list
, вы можете создать некоторую логику, подобную этой, и затем включить это в программно построенную строку селектора:
var numPerRow = 3;
var width = $(".grid_list").width();
if (width > 960) {
numPerRow = 4;
} else if (width > 720) {
numPerRow = 3;
} else if (width > 520) {
numPerRow = 2;
} else {
numPerRow = 1;
}
Затем построил свой селектор вот так:
$('ul.grid_list li:nth-child(' + numPerRow + 'n)').addClass('last');
Я не был точно уверен, какова была ваша логика ширины, но, очевидно, вы можете адаптировать этот код к точным точкам ширины и столбцам num.
Или, если алгоритм работает в зависимости от того, сколько будет соответствовать, вы можете сократить его до вычисления, подобного этому:
var numPerRow = Math.floor($(".grid_list").width() / 250);
numPerRow = Math.min(numPerRow, 1);
Чтобы этот код реагировал на события изменения размера окна, вы должны сделать что-то вроде этого:
function setupGrid() {
$('ul.grid_list li').removeClass('last');
var numPerRow = 3;
var width = $(".grid_list").width();
if (width > 960) {
numPerRow = 4;
} else if (width > 720) {
numPerRow = 3;
} else if (width > 520) {
numPerRow = 2;
} else {
numPerRow = 1;
}
$('ul.grid_list li:nth-child(' + numPerRow + 'n)').addClass('last');
}
$(window).resize(setupGrid);
Если скорость отклика немного запаздывает, иногда полезно использовать короткий таймер для события изменения размера, например:
var timer = null;
$(window).resize(function() {
if (timer) clearTimeout(timer);
timer = setTimeout(function() {
timer = null;
setupGrid();
}, 500);
});
Ретрансляция будет выполняться только после того, как событие изменения размера остановится на 1/2 секунды, вместо того, чтобы пытаться активировать его во время изменения размера.