2012-03-11 28 views
5

Tôi có bảng hiển thị cấu trúc cây (Siêu và Danh mục con). Khi người dùng nhấp vào một danh mục siêu dữ liệu, thuộc tính hiển thị của các con sẽ được chuyển thành.Chọn mỗi hàng bảng hiển thị thứ hai

Bây giờ tôi muốn thêm màu nền thay thế trên mỗi hàng của bảng thứ hai - nhưng tất nhiên chỉ lấy những màu trong tài khoản hiện đang hiển thị. Dưới đây là ví dụ đơn giản về cấu trúc:

<table> 
    <tr data-level="0"><td>Super 1</td></tr> 
    <tr class="hide" data-level="1"><td>Sub 1</td></tr> 
    <tr data-level="0"><td>Super 2</td></tr> 
    <tr class="hide" data-level="1"><td>Sub 2</td></tr> 
    <tr class="hide" data-level="1"><td>Sub 3</td></tr> 
    <tr class="hide" data-level="1"><td>Sub 4</td></tr> 
</table> 

Khi người dùng nhấp vào phần tử "Super 2", lớp "ẩn" bị xóa khỏi phần tử con.

Tôi đã thử nhiều selectors, ví dụ .:

/* Ugly result (dosn't recognize that elements are hidden) */ 
tr:nth-child(2n) 
{ 
    background-color: grey; 
} 

/* Doesn't work at all */ 
tr:visible:nth-child(2n) 
{ 
    background-color: grey; 
} 

/* Not what I inteded to do */ 
tr:not(.hide):nth-child(2n) 
{ 
    background-color: grey; 
} 

Tôi hy vọng tôi đã rõ ràng về những gì tôi muốn làm.

Điều đó có thể thực hiện với CSS hay tôi nên viết tập lệnh JS để tính toán lại các hàng chẵn và lẻ bất cứ khi nào có thay đổi? Cảm ơn trước vì bất kỳ gợi ý nào!

+1

Điều này được hỏi rất nhiều - câu trả lời thông thường là không thể với CSS thuần túy (cho đến CSS4 có thể), vì vậy trong thời gian chờ đợi, bạn sẽ cần thực hiện tất cả điều này trong JS. Trên thực tế, bộ chọn ': visible' thực sự là một bộ chọn không chuẩn xuất hiện trong jQuery/Sizzle và có thể là một vài thư viện khác. – BoltClock

+0

bản sao có thể có của [Kiểu sử dụng nth-child để giữ cho mặt của bảng (màu sắc thay đổi hàng) được cập nhật] (http://stackoverflow.com/questions/9216398/style-using-nth-child-to-keep-tables-aspect- luân phiên-hàng-màu sắc-cập nhật) – BoltClock

Trả lời

1

đoạn jQuery này sẽ thực hiện công việc:

$('tr').removeClass('alternate')​ 
$('tr:not(.hide):odd').addClass('alternate')​ 

Chơi với nó trên jsFiddle

+0

Wehre có lớp 'alternative' đến từ đâu không? –

2

Bạn đã nói rằng lớp ẩn sẽ bị xóa khi nhấp.
Giữ đơn giản và thêm lớp IE: "hiển thị".

.show tr:nth-child(odd) { background-color:#eee; } 
.show tr:nth-child(even) { background-color:#fff; } 

Edit:
tôi sẽ đổ lỗi cho exaustion, nhưng tôi nghĩ rằng đây có thể là cú pháp chính xác.

tr.show:nth-child(odd) { background-color:#eee; } 
tr.show:nth-child(even) { background-color:#fff; } 
+0

Điều này không theo một cách tương tự như quy tắc thứ ba trong mã OP. Xem liên kết trùng lặp có thể tôi vừa thêm vào. – BoltClock

+0

Tôi chưa có cơ hội để thử nghiệm ở trên. Nhưng sự khác biệt là câu trả lời của tôi giả định khả năng thêm lớp "hiển thị" vào TRs thích hợp, dựa trên "... các" ẩn "các lớp học được loại bỏ ..." Mà tôi chắc chắn sẽ nhận được xung quanh vấn đề bằng cách sử dụng " tr: không (.hide): nth-child ". Chắc chắn tò mò mặc dù, Gonna kiểm tra nó ra tối nay. – Bradmage

0

Các up-to-date và faster cách để thực hiện công việc là:

$('tr').removeClass(); 
$('tr:not(:hidden)').filter(':odd').addClass('odd'); 

Sau đó, bạn có thể tạo kiểu cho các dòng lẻ đó trong CSS với .odd {}

+0

Lớp 'lẻ' đến từ đâu? –

+1

@ BernhardDöbler Tôi vừa cập nhật câu trả lời. Câu hỏi đặt ra là "chọn" mỗi dòng hiển thị thứ hai, được thực hiện bởi: '$ ('tr: not (: hidden)'). Filter (': odd')'. Sau đó tôi chỉ cần thêm một lớp ".odd" vào các dòng đó để tôi có thể dễ dàng tạo kiểu cho chúng trong CSS. Câu trả lời được chọn cũng giống nhau, nhưng chỉ kém hiệu quả hơn. – lapin

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