2010-10-19 52 views
6

tôi có một số lượng ngẫu nhiên của DIV (tối thiểu 1, tối đa là 10)jquery show/hide divs và một bộ đếm

<div id="container"> 
<div class="foo">Content</div> <!-- div 1 --> 
<div class="foo">Content</div> <!-- div 2 --> 
<div class="foo">Content</div> <!-- div 3 --> 
<div class="foo">Content</div> <!-- div 4 --> 
<div class="foo">Content</div> <!-- div 5 --> 
<div class="foo">Content</div> <!-- i need this one hidden --> 
<div class="foo">Content</div> <!-- and this one --> 
</div> 

Tôi muốn 5 divs đầu tiên được nhìn thấy (hoặc với .show() hoặc với một lớp học, không quan trọng). Bất kỳ DIV bổ sung nào cũng sẽ bị ẩn.

tôi sau đó mô phỏng các "đóng cửa" của một div với:

$('.foo').click(function(){ 
    $(this).fadeOut('slow');  
}); 

mà loại bỏ các div nhấn vào, khiến cho tất cả các divs dưới đây để di chuyển lên một. Đây là hiệu ứng mong muốn của tôi.

Tuy nhiên, tôi cần một số logic ở đây.

Nếu tôi có ít hơn 5 DIVS, cơ sở đóng sẽ bị vô hiệu hóa. Nếu tôi có nhiều hơn 5 DIV, thì khi div được "đóng", tôi muốn div "ẩn" tiếp theo hiển thị.

tôi có thể thêm ID cho mỗi DIV nếu được yêu cầu với ID như "foo1" "foo2" vv

+1

Giải pháp của Nick Craver là một giải pháp hay. Tôi chỉ muốn lưu ý rằng bằng cách sử dụng 'slideDown' và' slideUp', nơi bạn đang sử dụng 'fadeOut/In' tạo ra một hiệu ứng tốt đẹp với ít bị giật. – lonesomeday

+0

lời khuyên được lưu ý, đẹp hơn nhiều! – Ross

Trả lời

5

Something như thế này nên làm việc:

$("#container .foo:gt(4)").hide(); 

$("#container").delegate(".foo", "click", function() { 
    if(!$("#container .foo:hidden").length) return; 
    $(this).fadeOut('slow', function() { 
     $(this).siblings(":hidden:first").fadeIn() 
       .end().remove(); 
    }); 
}); 

You can test it out here. Điều này làm ẩn tất cả 5 bằng cách sử dụng bộ chọn :gt(4) (dựa trên 0). Sau đó, chúng tôi đang sử dụng .delegate() để có hiệu quả (mặc dù .click() cũng sẽ hoạt động). Nếu không còn ẩn nữa, không có hiệu lực. Nếu có ẩn hơn, làm mờ dần hình ảnh chúng tôi đã nhấp vào, ở cuối mờ dần, hãy hiển thị số :first:hiddden một và .remove() thứ chúng tôi đã xóa hoàn toàn.

+0

hoặc css xấu xí! .foo + .foo + .foo + .foo + .foo + .foo {display: none; } bất cứ điều gì với hơn 5 trước anh em .foo sẽ bị ẩn. nếu bạn vẫn xóa nó. nó không có fadeIn hỗ trợ mặc dù – DoXicK

+0

@DoXicK - Tôi nghĩ bạn đã bỏ qua cuộc gọi '.end()', nó không phải là người anh em đang phai màu mà tôi đang xóa, đó là '$ (this)' :) –

+0

sẽ +2 - hoàn hảo hơn bao giờ hết, cảm ơn. – Ross

0
$('.foo').each(
    function(index,element) { 
     if(index>5) $(element).hide(); 
    } 
) 
0
$('#container div.foo').click(function() { 
    if ($(this).index() >= 5) ...; //etc 
} 
+0

nếu bạn có một nghìn kết quả, bạn sẽ thực thi hàm đó hàng nghìn lần. những gì về việc sử dụng: gt (4) kết hợp với một ẩn trực tiếp()? Đó là cách nhanh hơn – DoXicK

+0

Nhưng chúng tôi không, chúng tôi có tối đa 10 như OP đã nêu - và chúng tôi có khả năng sửa đổi mã dựa trên từng chỉ mục ... –

Các vấn đề liên quan