Могу ли я раскрасить столбцы таблицы с помощью 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>

И я ищу лучший способ (меньше кода, неиндивидуальная окраска) раскрасить, например, промежутки "Engine" и "Body", включая все ячейки под ними в #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, а принятый ответ был и все еще набирается как сумасшедший
Деннис

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

1
@canon хе да, в любом случае достойный ответ ...
Mr. Alien

Ответы:


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 01

Бессмысленно использовать 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

Следующий реализует селектор nth-child и должен работать ...

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

Спасибо за ответ, это другое решение
Мохаммад Кермани

Это перебор. Чрезмерное определение плохо сказывается на производительности. 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.