2012-03-11 15 views
5

Ho una tabella che mostra una struttura ad albero (Super e Sottocategorie). Quando l'utente fa clic su una supercategoria, la proprietà display dei child viene alternata.Selezione di una riga della tabella visibile ogni secondo

Ora voglio aggiungere un colore di sfondo alternato su ogni seconda fila di tabelle, ma ovviamente tenendo conto solo di quelle che sono attualmente visibili. Ecco un esempio semplificato di struttura:

<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> 

Quando l'utente clicca l'elemento "Super 2", le classi "nascondere" vengono rimossi dagli elementi secondari.

Ho provato diversi selettori, ad es .:

/* 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; 
} 

spero mi sono chiare su quello che voglio fare.

È possibile con i CSS o dovrei scrivere uno script JS che ricalchi le righe pari e dispari ogni volta che qualcosa cambia? Grazie in anticipo per eventuali suggerimenti!

+1

Questo viene chiesto molto - la risposta tipica è che non è possibile con CSS puro (fino a quando non CSS4 forse), quindi nel frattempo avrete bisogno di fare tutto questo in JS. In effetti, il selettore ': visible' è in realtà un selettore non standard che appare in jQuery/Sizzle e forse un paio di altre librerie. – BoltClock

+0

possibile duplicato di [Stile utilizzando nth-child per mantenere l'aspetto della tabella (alternando i colori delle righe) aggiornato] (http://stackoverflow.com/questions/9216398/style-using-nth-child-to-keep-tables-aspect- alternating-row-colors-updated) – BoltClock

risposta

1

Questo frammento di codice jQuery farà il lavoro:

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

giocare con lui sul jsFiddle

+0

Wehre viene dalla classe 'alternate'? –

2

Hai detto che la classe hide viene rimossa onclick.
Mantenerlo semplice e aggiungere una classe IE: "mostra".

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

Edit:
darò la colpa exaustion, ma penso che questo potrebbe essere la sintassi corretta.

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

Questo fallisce in modo simile alla terza regola nel codice OP. Vedi il possibile collegamento duplicato che ho appena aggiunto. – BoltClock

+0

Non ho ancora avuto la possibilità di testare quanto sopra. Ma la differenza è che la mia risposta presuppone la possibilità di aggiungere la classe "show" ai TRs appropriati, in base a "... le classi" hide "vengono rimosse ..." Che sono sicuro dovrebbero aggirare il problema usando " TR: non (.nascosto): nth-child". Sicuramente curioso, vedremo di più stasera. – Bradmage

0

L'up-to-date e faster modo per fare il lavoro è:

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

Quindi è possibile ridimensionare quelle linee dispari in CSS con .odd {}

+0

Da dove viene la classe 'dispari'? –

+1

@ BernhardDöbler Ho appena aggiornato la risposta. La domanda riguarda "selezionare" ogni seconda linea visibile, che viene eseguita da: '$ ('tr: not (: hidden)'). Filter (': odd')'. Poi aggiungo semplicemente una classe ".odd" a quelle linee così posso facilmente modellarle in CSS. La risposta scelta fa lo stesso, ma è meno performante. – lapin

Problemi correlati