Czy mogę pokolorować kolumny tabeli za pomocą CSS bez kolorowania poszczególnych komórek?


121

Czy istnieje sposób na pokolorowanie rozpiętości kolumn w dół? Zobacz przykład początkowy poniżej:

<table border="1">
  <tr>
    <th>Motor</th>
    <th colspan="3">Engine</th>
    <th>Car</th>
    <th colspan="2">Body</th>
  </tr>
  <tr>
    <td>1</td>
    <td>2</td>
    <td>3</td>
    <td>4</td>
    <td>5</td>
    <td>6</td>
    <td>7</td>
  </tr>
  <tr>
    <td>7</td>
    <td>1</td>
    <td>2</td>
    <td>3</td>
    <td>4</td>
    <td>5</td>
    <td>6</td>
  </tr>
</table>

Szukam lepszego sposobu (mniej kodu, nieindywidualne kolorowanie) na kolorowanie, na przykład rozpiętości „silnika” i „ciała”, w tym wszystkie komórki pod nimi w #DDD

<style>
  .color {
    background-color: #DDD
  }
</style>
<table border="1">
  <tr>
    <th>Motor</th>
    <th colspan="3" class="color">Engine</th>
    <th>Car</th>
    <th colspan="2" class="color">Body</th>
  </tr>
  <tr>
    <td>1</td>
    <td class="color">2</td>
    <td class="color">3</td>
    <td class="color">4</td>
    <td>5</td>
    <td class="color">6</td>
    <td class="color">7</td>
  </tr>
  <tr>
    <td>7</td>
    <td class="color">1</td>
    <td class="color">2</td>
    <td class="color">3</td>
    <td>4</td>
    <td class="color">5</td>
    <td class="color">6</td>
  </tr>
</table>


20
@zipzit: Nie ma nic złego w tabelach, jeśli faktycznie potrzebujesz tabeli - tj. jeśli dane mają charakter tabelaryczny (jak tabela produktów z cenami). Krytyka tabel jest przeciwko używaniu ich jako narzędzia do układania.
— sleske

5
Ciekawe, jak to się pojawiło w Hot Network Pytania
— Mr. Alien

zostało zadane wczoraj i od teraz ma 24 głosy za na Q i 43 na A, a zaakceptowana odpowiedź była i nadal jest uznawana za szaloną
— Dennis

2
ludzie lubią uczyć się rzeczy, których nie znali, czy to udokumentowanej osobliwości parsowania liczb jQuery, czy tagu / koncepcji HTML, która robi fajne rzeczy, o których nie wiedzieli :)
— Dennis

1
@canon heh tak, w każdym razie przyzwoita odpowiedź ...
— Mr. Alien

Odpowiedzi:


167

Tak, możesz ... używając <col>elementu:

.grey {
  background-color: rgba(128,128,128,.25);
}
.red {
  background-color: rgba(255,0,0,.25);
}
.blue {
  background-color: rgba(0,0,255,.25);
}
<table>
  <colgroup>
    <col class="grey" />
    <col class="red" span="3" />
    <col class="blue" />
  </colgroup>
  <thead>
    <tr>
      <th>#</th>
      <th colspan="3">color 1</th>
      <th>color 2</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>1</th>
      <td>red</td>
      <td>red</td>
      <td>red</td>
      <td>blue</td>
    </tr>
    <tr>
      <th>2</th>
      <td>red</td>
      <td>red</td>
      <td>red</td>      
      <td>blue</td>
    </tr>
  </tbody>
</table>

Uwaga : Możesz użyć spanatrybutu, aby definicja kolumny miała zastosowanie do więcej niż jednej kolumny.
Zobacz też :<colgroup>


10
Pamiętaj, że będziesz potrzebować <col span="3" />kolumn rozpinających.
— Niet the Dark Absol

Nie ma sensu używać elementu colgroupzawierającego wszystkie kolumny.
— Jukka K. Korpela

14
@ JukkaK.Korpela Jest analizowany w ten sposób, niezależnie od tego, czy go określisz - tak jak <tbody>. Po prostu wolę sprecyzować.
— kanon

Widzę, że użycie coltagu nie jest tak powszechne, ale używam go zawsze dla szerokości kolumn
— Koen.

3
W przypadku gdyby ktoś był ciekawy, dlaczego to działa lub które właściwości CSS mogą być użyte w kolumnach, odpowiednie sekcje specyfikacji CSS 2.1 to 17.3 i 17.5.1 .
— meriton

18

Możesz do tego użyć nth-childselektora:

tr td:nth-child(2),
tr td:nth-child(3) {
  background: #ccc;
}
<table>
  <tr>
    <th colspan="2">headline 1</th>
    <th>headline 2</th>
  </tr>
  <tr>
    <td>column 1</td>
    <td>column 2</td>
    <td>column 3</td>
  </tr>
  <tr>
    <td>column 1</td>
    <td>column 2</td>
    <td>column 3</td>
  </tr>
  <tr>
    <td>column 1</td>
    <td>column 2</td>
    <td>column 3</td>
  </tr>
</table>


1
Sama stylizacja coljest o wiele lepsza niż ta (czystsza i szybsza).
— tomasz86

9

Ogólnie rzecz biorąc, najłatwiej jest stylizować komórki (w razie potrzeby według kolumny), ale kolumny można określać na różne sposoby. Prostym sposobem jest zawijanie kolumn w colgroupelemencie i ustawianie dla niego stylów. Przykład:

<style>
.x {
    background-color: #DDD
}
</style>
<table border="1">
<col>
<colgroup class=x>
  <col>
  <col>
  <col>
</colgroup>
<col>
<colgroup class=x>
  <col>
  <col>
</colgroup>
  <tr>
    <th>Motor</th>
    <th colspan="3" class="color">Engine</th>
    <th>Car</th>
    <th colspan="2" class="color">Body</th>
  </tr>
  <tr>
    <td>1</td>
    <td class="color">2</td>
    <td class="color">3</td>
    <td class="color">4</td>
    <td>5</td>
    <td class="color">6</td>
    <td class="color">7</td>
  </tr>
  <tr>
    <td>7</td>
    <td class="color">1</td>
    <td class="color">2</td>
    <td class="color">3</td>
    <td>4</td>
    <td class="color">5</td>
    <td class="color">6</td>
  </tr>
</table>


1
Jeśli poszczególne colelementy wewnątrz colgroups nie wymagają indywidualnego stylizowania, możesz również ustawić spanatrybut na samym colgroupsobie - <colgroup span="2">- zamiast umieszczać colw nim elementy.
— misterManSam

5

Możesz użyć CSS3: http://jsfiddle.net/snuggles08/bm98g8v8/

<style>
  .table td:nth-of-type(1) {
    background: red;
  }
  .table td:nth-of-type(5) {
    background: blue;
  }
  .table td:nth-of-type(3) {
    background: green;
  }
  .table td:nth-of-type(7) {
    background: lime;
  }
  .table td:nth-of-type(2) {
    background: skyblue;
  }
  .table td:nth-of-type(4) {
    background: darkred;
  }
  .table td:nth-of-type(6) {
    background: navy;
  }
</style>
Styled table:
<table border="1" class="table">
  <tbody>
    <tr>
      <td>1</td>
      <td>2</td>
      <td>3</td>
      <td>4</td>
      <td>5</td>
      <td>6</td>
      <td>7</td>
    </tr>
    <tr>
      <td>7</td>
      <td>1</td>
      <td>2</td>
      <td>3</td>
      <td>4</td>
      <td>5</td>
      <td>6</td>
    </tr>
  </tbody>
</table>
<hr>Unstyled table:
<table border="1" class="table2">
  <tbody>
    <tr>
      <td>1</td>
      <td>2</td>
      <td>3</td>
      <td>4</td>
      <td>5</td>
      <td>6</td>
      <td>7</td>
    </tr>
    <tr>
      <td>7</td>
      <td>1</td>
      <td>2</td>
      <td>3</td>
      <td>4</td>
      <td>5</td>
      <td>6</td>
    </tr>
  </tbody>
</table>


5

Chciałbym użyć nth-childCSS pseudo-klasy do tego:

tr td:nth-child(2), tr th:nth-child(2), tr td:nth-child(3), tr td:nth-child(4), tr th:nth-child(4), tr td:nth-child(6), tr td:nth-child(7){
    background-color: #DDD;
}


5

Poniższe narzędzie jest selektorem n-tego dziecka i powinno działać ...

<style type="text/css">
    th:nth-child(2),
    th:nth-child(4)
    {
        background-color: rgba(255, 0, 0, 1.0);
    }

    td:nth-child(2), 
    td:nth-child(3),
    td:nth-child(4),
    td:nth-child(6),
    td:nth-child(7)
    {
        background-color: rgba(255, 0, 0, 0.5);
    }
</style>

Prawdopodobnie chcesz mieć wartość >między tr a td, ponieważ zadałeś sobie trud wybierając tds tylko wewnątrz trs tylko w tabelach ... (uwaga na grupy tabel).
— ANeves

Dzięki za odpowiedź, to jest inne rozwiązanie
— Mohammad Kermani,

To przesada. Nadmierne specyfikowanie jest niekorzystne dla wydajności. table tr tdjest zbędne, ponieważ tdsą zawsze w środku tri table.
— tomasz86

4

Moja wersja używająca wyrażeń nth-child:

Korzystanie z koncepcji CSS reguł kaskadowych, aby najpierw pokolorować komórki, a następnie odbarwić te, które chcę, aby były przezroczyste. Pierwszy selektor wybiera wszystkie komórki po pierwszej, a drugi wybiera piątą komórkę jako przezroczystą.

<style type="text/css">
  /* colored */
  td:nth-child(n+2) { background-color: #ddd }
  /* uncolored */
  td:nth-child(5) { background-color: transparent }
</style>

<table border="1">
  <tr>
    <th>Motor</th>
    <th colspan="3">Engine</th>
    <th>Car</th>
    <th colspan="2">Body</th>
  </tr>
  <tr>
    <td>1</td>
    <td>2</td>
    <td>3</td>
    <td>4</td>
    <td>5</td>
    <td>6</td>
    <td>7</td>
  </tr>
  <tr>
    <td>7</td>
    <td>1</td>
    <td>2</td>
    <td>3</td>
    <td>4</td>
    <td>5</td>
    <td>6</td>
  </tr>
</table>

Sprawdź tę interesującą referencję: http://learn.shayhowe.com/advanced-html-css/complex-selectors/


1

To stare pytanie z wieloma świetnymi odpowiedziami. Chciałem tylko dodać selektory -ni nth-last-child, które nie zostały jeszcze wymienione. Są pomocne przy stosowaniu CSS do wielu kolumn, ale mogą nie znać liczby kolumn przed stylizacją lub mieć wiele tabel o różnych szerokościach.

/* Select the first two */
table tr td:nth-child(-n + 2) {
  background-color: lightblue;
}

/* Select all but the first two */
table tr td:not(:nth-child(-n + 2)) {
    background-color:lightgreen;
}

/* Select last two only */
table tr td:nth-last-child(-n + 2) {
  background-color:mistyrose;
}

/* Select all but the last two */
table tr td:not(:nth-last-child(-n + 2)) {
    background-color:yellow;
}

jsFiddle: https://jsfiddle.net/3rpf5oht/2/

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.