Чи можна фарбувати стовпці таблиці за допомогою CSS, не фарбуючи окремі комірки?


121

Чи є спосіб фарбувати проміжки стовпців аж донизу. Дивіться, починаючи приклад нижче:

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

І я шукаю кращий спосіб (менше коду, не індивідуальне забарвлення) для фарбування, наприклад, проміжки "Двигун" та "Кузов", включаючи всі комірки під ними в #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: Немає нічого поганого з таблицями, якщо вам насправді потрібна таблиця - тобто, якщо дані мають табличний характер (як таблиця товарів із цінами). Критика таблиць проти використання їх як інструменту компонування.
— sleske

5
Цікаво, як це увійшло до питань гарячої мережі
— містер Чужор

його запитали вчора і станом на даний момент, він має 24 оновлених запитань на Q та 43 на A, і прийнятий відповідь був і все ще проголошується як божевільний
— Dennis

2
людям подобається дізнаватися те, чого вони не знали, будь то документована особливість розбору номерів jQuery або HTML-тег / концепція, яка робить акуратні речі, про них вони не знали :)
— Dennis

1
@canon хе так, будь-коли гідна відповідь ...
— Містер

Відповіді:


167

Так, ви можете ... використовуючи <col>елемент:

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

Примітка . Ви можете використовувати цей spanатрибут, щоб заставити визначення колу застосовуватися до більш ніж одного стовпця.
Дивіться також :<colgroup>


10
Зауважте, що вам знадобляться <col span="3" />колони, що охоплюють
— Niet the Dark Absol

Використовувати файл, colgroupщо містить усі стовпці , досить безглуздо .
— Юкка К. Корпела

14
@ JukkaK.Korpela Він аналізується таким чином незалежно від того, вказуєте ви його чи ні - просто так <tbody>. Я просто вважаю за краще вказати.
— canon

Я бачу, що використання colтегу є не такою поширеною, але я використовую його завжди для ширини стовпців
— Koen.

3
Якщо комусь іншому цікаво, чому це працює, або які властивості CSS можна використовувати у стовпцях, відповідними розділами специфікацій CSS 2.1 є 17.3 та 17.5.1 .
— Мерітон

18

Ви можете використовувати nth-childселектор для цього:

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
Сам стиль col- це набагато краще, ніж це (чистіше та швидше).
— tomasz86

9

Це, як правило, найпростіше в стилі клітинок (за бажанням стовпця), але стовпці можуть бути стилізовані різними способами. Один простий спосіб - обернути стовпчики в colgroupелемент і встановити на ньому стилі. Приклад:

<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
Якщо окремі colелементи всередині colgroups не потребують стилізації окремо, ви також можете встановити spanатрибут на colgroupсебе - <colgroup span="2">- замість того, щоб розміщувати colелементи всередині нього.
— misterManSam

5

Ви можете використовувати 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

Я б використав для цього nth-childпсевдокласс 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

Наступний реалізатор - це селектор-дочірка і повинен працювати ...

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

Ви, мабуть, хочете >між tr і td, оскільки ви вирішили вибрати tds лише всередині trs лише всередині таблиць ... (пам’ятайте про настільні групи.)
— ANeves

Дякую за відповідь, це інше рішення
— Мохаммед Кермані

Це надмірність. Перевизначення погано для продуктивності. table tr tdє зайвим, оскільки tds завжди всередині trі table.
— tomasz86

4

Моя версія з використанням виразів nth-child:

Використовуючи CSS-концепцію правил каскаду, спочатку фарбуйте осередки, а потім розфарбуйте ті, які я хочу бути прозорими. Перший селектор вибирає всі комірки після першої, а другий вибирає п'яту клітинку для прозорості.

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

Ознайомтесь із цією цікавою посиланням: http://learn.shayhowe.com/advanced-html-css/complex-selectors/


1

Це старе питання з великою кількістю чудових відповідей. Просто хотілося додати -nта nth-last-childселектори, які ще не були згадані. Вони корисні при застосуванні CSS до кількох стовпців, але, можливо, не знають кількість стовпців до стилювання або мають кілька таблиць із різною шириною.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.