EDIT cho đề xuất sửa chữa:
Đây là working jsFiddle và đây là results only demo.
Như bạn có thể thấy, tôi hoàn toàn thừa nhận mã jQuery ban đầu của bạn. Tôi đã xóa mọi thứ khỏi Global cũng như đưa ra các chức năng. .resize()
hy vọng một chức năng đã có, vì vậy tôi chỉ làm mọi thứ bên trong một chức năng đó và sau đó gọi ngay .resize()
để gọi nó trên trang tải ban đầu.
Một thay đổi khác mà tôi đã thực hiện là tăng vòng lặp của bạn trở lại, bắt đầu với kích thước chiều rộng rộng nhất có thể cho phép (5), giảm kích thước chiều rộng nhỏ nhất có thể cho phép (2).
Ngoài ra, bên trong vòng lặp của bạn, tôi đã tạo các biến số j
và k
để giúp bạn dễ dàng đọc các điều kiện đó hơn.
Thay đổi chính là câu lệnh if. Nếu chúng ta đang lặp lại max_column và chiều rộng của vùng chứa rộng hơn k
, chúng ta muốn đặt chiều rộng của bảng là k
và nhảy ra khỏi vòng lặp, nếu không chúng ta đánh giá câu lệnh if ban đầu nếu không, nếu không chúng ta min_column iteration và chiều rộng của container nhỏ hơn j
, chúng ta muốn thiết lập chiều rộng của board là j
.
Tôi đã thử nghiệm tính năng này trong Chrome và nó hoạt động rất đẹp. Tôi hy vọng cái này sẽ giúp bạn.
$(document).ready(function()
{
$(window).resize(function()
{
var item_width = 200,
item_height = 300,
gap = 20,
min_columns = 2,
max_columns = 5,
min_width = min_columns * (item_width + gap),
max_width = max_columns * (item_width + gap),
container_width = $(".display_container").width(),
$display_board = $("#display_board"),
$display_board_ol_li = $display_board.find("ol > li");
//console.log("container width: " + container_width);
for (var i = max_columns; i >= min_columns; i--)
{
var j = i * (item_width + gap),
k = (i+1) * (item_width + gap);
//console.log("j: " + j);
//console.log("k: " + k);
//console.log("display_board width (before): " + $display_board.css("width"));
if (i === max_columns && container_width > k)
{
$display_board.css("width", max_width + "px");
//console.log("display_board width (after): " + $display_board.css("width"));
break;
}
else if (container_width > j && container_width < k)
{
$display_board.css("width", j + "px");
//console.log("display_board width (after): " + $display_board.css("width"));
break;
}
else if (i === min_columns && container_width < j)
{
$display_board.css("width", min_width + "px");
//console.log("display_board width (after): " + $display_board.css("width"));
}
}
$display_board_ol_li.css({
"width" : item_width + "px",
"height": item_height + "px",
"margin": gap/2 + "px"
});
}).resize();
});
Điều này là để ngăn không cho IE kích hoạt sự kiện thay đổi kích cỡ quá thường xuyên, do đó thực tế tự đặt đầu gối lên… – Matijs
Chỉ cần cập nhật OP để nói rằng tôi đã thử nghiệm đây là Chrome và Firefox. Kiểm tra trình duyệt IE và nhận được kết quả tương tự, mọi thứ hoạt động hoàn hảo nhưng chức năng dường như kích hoạt trước khi phần tử được thay đổi kích thước (hoặc trước khi phần tử đã làm việc ra được thay đổi kích thước của nó). –
Bạn có thể tạo [jsBin] (http://jsbin.com) hoặc [jsFiddle] (http://jsfiddle.net) để chứng minh sự cố của bạn không? –