2012-03-11 2 views
5

У меня есть таблица, отображающая древовидную структуру (супер- и подкатегории). Когда пользователь нажимает на суперкатегорию, свойство отображения дочерних элементов отправляется.Выбор каждой второй строки видимой таблицы

Теперь я хочу добавить чередующийся цвет фона для каждой второй строки таблицы, но, конечно, учитывать только те, которые в настоящее время видны. Ниже приведен упрощенный пример структуры:

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

Когда пользователь нажимает на элемент «Супер 2», классы «скрыть», удаляются из дочерних элементов.

Я попробовал несколько селекторов и т.д .:

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

Я надеюсь, что стало ясно на то, что я хочу сделать.

Возможно ли это с помощью CSS или я должен писать сценарий JS, который перепрограммирует четные и нечетные строки всякий раз, когда что-либо изменяется? Заранее благодарим за любые подсказки!

+1

Это очень часто задается вопросом - типичный ответ заключается в том, что это невозможно с чистым CSS (до тех пор, пока не будет возможно CSS4), поэтому в то же время вам нужно будет все это сделать в JS. Фактически, селектор ': visible' действительно является нестандартным селектором, который появляется в jQuery/Sizzle и, возможно, в нескольких других библиотеках. – BoltClock

+0

Возможный дубликат [Стиль, использующий nth-child, чтобы сохранить аспект таблицы (цвета чередующихся строк) обновлен] (http://stackoverflow.com/questions/9216398/style-using-nth-child-to-keep-tables-aspect- переменная-строка-цвета обновлена) – BoltClock

ответ

1

Этот фрагмент кода JQuery сделает работу:

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

играть с ним на jsFiddle

+0

У вас есть класс 'alternate'? –

2

Вы сказали, что класс hide удален onclick.
Сохраните это и добавьте класс IE: «показать».

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

Edit:
Я виню exaustion, но я думаю, что это может быть правильный синтаксис.

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

Это не работает так же, как третье правило в коде OP. См. Возможную дублируемую ссылку, которую я только что добавил. – BoltClock

+0

У меня еще не было возможности проверить выше. Но разница заключается в том, что мой ответ предполагает возможность добавления класса «show» в соответствующие TRs, основанные на «...« скрытых »классах удаляются ...» Я уверен, что обойти эту проблему, используя " тр: нет (.hide): п-й ребенок». Определенно любопытно, хотя, собираюсь проверить это больше сегодня вечером. – Bradmage

0

Повышающий актуальный и faster способ сделать работу является:

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

Затем вы можете стилизовать эти нечетные строки в CSS с помощью .odd {}

+0

Откуда возникает класс 'odd'? –

+1

@ BernhardDöbler Я только что обновил ответ. Речь идет о «выборе» каждой второй видимой строки, которая выполняется: '$ ('tr: not (: hidden)'). Filter (': odd')'. Затем я просто добавляю класс «.odd» к этим строкам, чтобы я мог легко стилизовать их в CSS. Выбранный ответ делает то же самое, но он менее эффективен. – lapin