Posso colorare le colonne della tabella usando i CSS senza colorare le singole celle?


121

C'è un modo per colorare le campate delle colonne fino in fondo. Vedere l'esempio di partenza di seguito:

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

E sto cercando un modo migliore (meno codice, colorazione non individuale) per colorare, ad esempio, le sezioni "Motore" e "Corpo", comprese tutte le celle sottostanti in #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: non c'è niente di sbagliato nelle tabelle se hai effettivamente bisogno di una tabella, cioè se i dati sono di natura tabulare (come una tabella di prodotti con i prezzi). La critica alle tabelle è contro il loro utilizzo come strumento di layout.
— sleske

5
Mi chiedo come sia entrato in Hot Network Questions
— Mr. Alien

è stato chiesto ieri e al momento, ha 24 voti positivi su Q e 43 su A, e la risposta accettata era ed è ancora votata come un matto
— Dennis

2
alle persone piace imparare cose che non sapevano, sia che si tratti di una peculiarità documentata dell'analisi dei numeri jQuery, o di un tag / concetto HTML che fa cose pulite, non sapevano :)
— Dennis

1
@canon eh sì, comunque risposta decente ...
— Mr. Alien

Risposte:


167

Sì, puoi ... utilizzando l' <col>elemento:

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

Nota : è possibile utilizzare l' spanattributo per applicare la definizione di colonna a più di una colonna.
Vedi anche :<colgroup>


10
Nota che avrai bisogno <col span="3" />per le colonne spanning.
— Niet the Dark Absol

È piuttosto inutile usare un colgroupche contiene tutte le colonne.
— Jukka K. Korpela

14
@ JukkaK.Korpela Viene analizzato in questo modo indipendentemente dal fatto che tu lo specifichi o meno, proprio come <tbody>. Preferisco semplicemente specificare.
— canonico

Vedo che l'uso del coltag non è così comune, ma lo uso sempre per le larghezze delle colonne
— Koen.

3
Nel caso in cui qualcun altro sia curioso del motivo per cui funziona o quali proprietà CSS possono essere utilizzate sulle colonne, le sezioni pertinenti delle specifiche CSS 2.1 sono 17.3 e 17.5.1 .
— Meriton

18

Puoi usare il nth-childselettore per questo:

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
Lo styling da colsoli è molto meglio di così (più pulito e più veloce).
— tomasz86

9

In genere è più semplice applicare uno stile alle celle (per colonna se lo si desidera), ma è possibile applicare stili alle colonne in modi diversi. Un modo semplice è avvolgere le colonne in un colgroupelemento e impostare gli stili su di esso. Esempio:

<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
Se i singoli colelementi all'interno delle colgroups non hanno bisogno di essere stilizzati individualmente, puoi anche impostare l' spanattributo su colgroupse stesso - <colgroup span="2">- invece di posizionare colelementi al suo interno.
— misterManSam

5

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

Per questo nth-childuserei la pseudo-classe css:

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

Il seguente attrezzo è il selettore dell'ennesimo figlio e dovrebbe funzionare ...

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

Probabilmente vuoi un >tra tr e td, dal momento che ti sei preso la briga di selezionare tds solo all'interno di trs solo all'interno delle tabelle ... (attenzione ai gruppi di tabelle.)
— ANeves

Grazie per la risposta, questa è una soluzione diversa
— Mohammad Kermani

Questo è un eccesso. Specificare eccessivamente è dannoso per le prestazioni. table tr tdè ridondante in quanto tds sono sempre dentro tre table.
— tomasz86

4

La mia versione che utilizza espressioni nth-child:

Utilizzando il concetto CSS delle regole a cascata per prima cosa colorare le celle e poi per scolorire quelle voglio che siano trasparenti. Il primo selettore seleziona tutte le celle dopo la prima e il secondo seleziona la quinta cella in modo che sia trasparente.

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

Controlla questo interessante riferimento: http://learn.shayhowe.com/advanced-html-css/complex-selectors/


1

Questa è una vecchia domanda con molte ottime risposte. Volevo solo aggiungere i selettori -ne nth-last-childche non sono ancora stati menzionati. Sono utili quando si applicano CSS a più colonne ma potrebbero non conoscere il numero di colonne prima dello stile o avere più tabelle con larghezze variabili.

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.