Подтвердить что ты не робот

Как использовать 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, а затем продолжал.

Наверное, нет решения, но подумал, что я спрошу: -)

4b9b3361

Ответ 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>