Как использовать nth-child для стилизации со столом с rowspan?
У меня есть таблица, в которой есть одна строка, которая использует rowspan. Таким образом,
<table>
<tr>
<td>...</td><td>...</td><td>...</td>
</tr>
<tr>
<td rowspan="2">...</td><td>...</td><td>...</td>
</tr>
<tr>
<td>...</td><td>...</td>
</tr>
<tr>
<td>...</td><td>...</td><td>...</td>
</tr>
</table>
Я хотел бы использовать псевдокласс класса nth-child, чтобы добавить цвет фона в каждую другую строку, но rowpan - это испортить его; он добавляет цвет фона в строку ниже строки с rowspan, когда на самом деле мне бы хотелось пропустить эту строку и перейти к следующей.
Есть ли способ заставить nth-child делать что-то умное или использовать [rowspan] в селекторе, чтобы обойти это? Поэтому в этом случае я хотел бы, чтобы цвет фона находился в строках 1 и 4, но затем после этого на 6, 8, 10 и т.д. (Так как ни у одного из них нет rowspans)? Мне нравится, если я вижу rowpan, тогда я хочу, чтобы nth-child добавлял от 1 до n, а затем продолжал.
Наверное, нет решения, но подумал, что я спрошу: -)
Ответы
Ответ 1
К сожалению, нет способа сделать это с помощью :nth-child()
самостоятельно или с помощью только селекторов CSS. Это связано с характером :nth-child()
, который выбирает чисто основанный на том, что элемент является n-м дочерним элементом его родителя, а также с отсутствием родительского селектора CSS. (вы не можете выбрать tr
, если он не содержит td[rowspan]
, например).
jQuery имеет селектор :has()
, который отсутствует в CSS, который вы можете использовать в сочетании с :even
(не :odd
, поскольку он 0-индексированный по сравнению с :nth-child()
1-index) для фильтрации в качестве альтернативы к CSS:
$('tr:not(:has(td[rowspan])):even')
jsFiddle preview
Ответ 2
Что, по-видимому, работает для меня, - это поставить td в строке ниже с отображением: none
<table>
<tr>
<td rowspan="2">2 rows</td>
<td>1 row</td>
</tr>
<tr>
<td style="display:none"></td>
<td>1 row</td>
</tr>
</table>
Ответ 3
У меня была аналогичная проблема, и я просто переопределил фон строки с фоном на TD внутри них. В зависимости от вашего желаемого результата, это может сработать и для вас?
tr:nth-child(odd) {
background: #DDE;
}
tr:nth-child(odd) td[rowspan] {
background: #FFF;
}
Конечно, вы можете переопределить другие строки, такие как заголовки и т.д. с классом или th.
Ответ 4
Попробуйте отделить таблицу телом, что-то вроде:
tbody tr:nth-child(odd){
background: #00FFFF;
}
tbody tr:nth-child(even){
background: #FF0000;
}
tbody:nth-child(odd) td[rowspan]{
background: #00FFFF;
}
tbody:nth-child(even) td[rowspan]{
background: #FF0000;
}
<table>
<tbody>
<tr>
<td rowspan="4">...</td>
<td>...</td>
<td>...</td>
<td rowspan="4">...</td>
<td>...</td>
</tr>
<tr>
<td>...</td>
<td>...</td>
<td>...</td>
</tr>
<tr>
<td>...</td>
<td>...</td>
<td>...</td>
</tr>
<tr>
<td>...</td>
<td>...</td>
<td>...</td>
</tr>
</tbody>
<tbody>
<tr>
<td rowspan="3">...</td>
<td>...</td>
<td>...</td>
<td rowspan="3">...</td>
<td>...</td>
</tr>
<tr>
<td>...</td>
<td>...</td>
<td>...</td>
</tr>
<tr>
<td>...</td>
<td>...</td>
<td>...</td>
</tr>
</tbody>
</table>
Ответ 5
Я использовал комбинацию предыдущего ответа, чтобы добавить tr
с display=none
программно:
HTML
<table>
<tr>
<td>A</td>
<td>B</td>
<td>C</td>
</tr>
<tr>
<td rowspan=2>1</td>
<td rowspan=2>2</td>
<td>sub C 1</td>
</tr>
<tr>
<td>sub C 2</td>
</tr>
<tr>
<td>3</td>
<td>4</td>
<td>5</td>
</tr>
<tr>
<td>6</td>
<td>7</td>
<td>8</td>
</tr>
</table>
CSS
table tr:nth-child(2n) {
background-color: #F8ECE0;
}
JQuery
$( "<tr style='display:none'></tr>" ).insertAfter('tbody tr:has(td[rowspan])');
Смотрите JSfiddle.
Ответ 6
Вы можете сделать это, используя только CSS, если вы захотите добавить дополнительную разметку. Оберните каждую "группу" строк в теге <tbody>
. Затем добавьте цвет фона для каждого нечетного tbody
.
tbody:nth-child(odd) {
background-color: yellow;
}
<table>
<tbody>
<tr>
<td>tr 1</td>
<td>...</td>
<td>...</td>
</tr>
</tbody>
<tbody>
<tr>
<td rowspan="2">tr 2+3</td>
<td>...</td>
<td>...</td>
</tr>
<tr>
<td>...</td>
<td>...</td>
</tr>
</tbody>
<tbody>
<tr>
<td>tr 4</td>
<td>...</td>
<td>...</td>
</tr>
</tbody>
<tbody>
<tr>
<td>tr 5</td>
<td>...</td>
<td>...</td>
</tr>
</tbody>
<tbody>
<tr>
<td>tr 6</td>
<td>...</td>
<td>...</td>
</tr>
</tbody>
<tbody>
<tr>
<td>tr 7</td>
<td>...</td>
<td>...</td>
</tr>
</tbody>
<tbody>
<tr>
<td>tr 8</td>
<td>...</td>
<td>...</td>
</tr>
</tbody>
<tbody>
<tr>
<td>tr 9</td>
<td>...</td>
<td>...</td>
</tr>
</tbody>
<tbody>
<tr>
<td>tr 10</td>
<td>...</td>
<td>...</td>
</tr>
</tbody>
</table>