it-swarm.com.ru

Как использовать 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, чтобы добавить цвет фона ко всем другим строкам, но в строках с ним все портится; он добавляет цвет фона к строке под строкой с интервалом строки, когда на самом деле я бы хотел, чтобы он пропустил эту строку и перешел к следующей. 

Есть ли способ заставить nth-child сделать что-то умное или использовать [rowspan] в селекторе, чтобы обойти это? Так что в этом случае я бы хотел, чтобы цвет фона был в строках 1 и 4, а затем в 6, 8, 10 и т.д. (Поскольку ни один из них не имеет пробелов)? Это похоже на то, что если я вижу строку, то я хочу, чтобы nth-child добавил 1 к n, а затем продолжил. 

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

23
Elisabeth

К сожалению, нет способа сделать это только с помощью :nth-child() или с помощью только CSS-селекторов. Это связано с природой :nth-child(), которая выбирает исключительно на основе элемента, являющегося n-ным потомком своего родителя, а также с отсутствием родительского селектора в CSS (вы не можете выбрать tr, только если он не не содержит td[rowspan], например).


в jQuery есть селектор :has(), которого нет в CSS, однако его можно использовать вместе с :even (не :odd, так как он 0-индексирован, а с 1-индексом :nth-child()) для фильтрации в качестве альтернативы CSS:

$('tr:not(:has(td[rowspan])):even')

Предварительный просмотр jsFiddle

16
BoltClock

То, что, кажется, работает для меня, состоит в том, чтобы поместить td в строку ниже с показом: ни один

<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>
32
Sebastian Forster

У меня была похожая проблема, и я просто переопределил фон строки с фонами на TD внутри них. В зависимости от желаемого результата, это может сработать и для вас?

tr:nth-child(odd) {
    background: #DDE;
}
tr:nth-child(odd) td[rowspan] {
    background: #FFF;
}

Конечно, вы можете переопределить другие строки, такие как заголовки и т.д. С помощью класса или th.

2
Chris

Попробуйте разделить таблицу по tbody, что-то вроде:

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>
    
  

2
vitalii97

Я использовал комбинацию предыдущего ответа, чтобы программно добавить 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 .

0
hadrienj

Вы можете сделать это, используя только 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>

0
Steven Liekens