Как сделать несколько групп данных внутри table html?

216
12 апреля 2022, 10:20

Мне нужно сверстать семантически правильно таблицу. В ней внутри есть основной заголовок (это thead) и несколько групп данных.

  1. Как-то группируют данные внутри таблицы (чем выделить несколько tr)?
  2. Как реализовать подзаголовок для группы данных внутри таблицы? (для заголовка уже использую thead)

Так?:

<tr>
  <th>Ячейка подзаголовка 1</th>
  <th>Ячейка подзаголовка 2</th>
  <th>Ячейка подзаголовка 3</th>
</tr>
<tr>
  <td>Обычная ячейка</td>
  <td>Обычная ячейка</td>
  <td>Обычная ячейка</td>
</tr>
<tr>
  <td>Обычная ячейка</td>
  <td>Обычная ячейка</td>
  <td>Обычная ячейка</td>
</tr>

Может вариант вкладывать мини-таблицу внутрь основной таблицы? (в этом примере внутри таблицы есть свои таблицы, и валидатор не ругается, но внешний вид мне нужен как беспрерывная таблица с потоком строк). Я не уверен, что смогу стилизовать такое дерево таблиц так, чтобы оно выглядело как одна таблица без внутренних отступов (+ не смогу хорошо связать между собой ширины ячеек внешней и внутренней таблицы).

Видел еще, как это реализовал microsoft у себя на сайте. Но у них просто идет поток tr, семантически группы не выделены и aria атрибутов нет.

Answer 1

Можно группировать строки с помощью тега <tbody> и обрабатывать нажатие на первую строку каждого такого элемента:

document.querySelector('.table').addEventListener('click', function(ev) {
  let oTarget = ev.target.closest('tr');
  if (oTarget.parentNode.firstElementChild == oTarget) {
    oTarget.classList.toggle('show');
  }
});
th {
  box-shadow: inset 0 0 10px #a00;
}
tbody tr:first-of-type td {
  cursor: pointer;
  box-shadow: inset 0 0 5px #080;
}
tbody tr:not(:first-of-type) {
  display: none;
}
tbody tr.show~tr {
  display: table-row;
}
<table class="table">
  <thead>
    <tr>
      <th>Ячейка заголовка 1</th>
      <th>Ячейка заголовка 2</th>
      <th>Ячейка заголовка 3</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Ячейка подзаголовка 1</td>
      <td>Ячейка подзаголовка 2</td>
      <td>Ячейка подзаголовка 3</td>
    </tr>
    <tr>
      <td>Обычная ячейка</td>
      <td>Обычная ячейка</td>
      <td>Обычная ячейка</td>
    </tr>
    <tr>
      <td>Обычная ячейка</td>
      <td>Обычная ячейка</td>
      <td>Обычная ячейка</td>
    </tr>
  </tbody>
  <tbody>
    <tr>
      <td>Ячейка подзаголовка 1</td>
      <td>Ячейка подзаголовка 2</td>
      <td>Ячейка подзаголовка 3</td>
    </tr>
    <tr>
      <td>Обычная ячейка</td>
      <td>Обычная ячейка</td>
      <td>Обычная ячейка</td>
    </tr>
    <tr>
      <td>Обычная ячейка</td>
      <td>Обычная ячейка</td>
      <td>Обычная ячейка</td>
    </tr>
  </tbody>
</table>

READ ALSO
object Object вместо html тега br

object Object вместо html тега br

Ситуация следующая, пишу приложение на функциональном компоненте Reactjs, в стейт забиваю значение текстового инпута, а после беру в этом стейте...

124
Обрезается строка при вставке

Обрезается строка при вставке

Хорошо, у меня есть следующая строка

145
Навигация по сайту, как правильно?

Навигация по сайту, как правильно?

возникли проблемы с созданием навигационного менюКак правильно это сделать? Можно ли для вставки контента в "body" использовать iframe>,...

194
Как сделать бургер меню по диагонали?

Как сделать бургер меню по диагонали?

Нужно сделать бургер меню как в этом примере по диагонали https://wwwschindele-handel

113