Установка rowspan для colgroup?

Простой (надеюсь) HTML-вопрос.

Допустим, у меня есть группа столбцов, которая охватывает 3 столбца. Но он также охватывает 9 рядов. Но на самом деле я хочу, чтобы было 3 уровня столбцов (по сути, 3 столбца, разделенных на 9 строк). Единственными целями на самом деле являются:

а) избегайте встраивания таблиц (по разным причинам) б) сохраняйте модульность разделов. c) позволяют стилизовать семантически модульные области.

Итак, в конце концов, у меня было бы что-то визуально похожее на:

   | col 1  | col 2 | col 3 |
   | row 1  | row 1 | row 1 |
   | row 2  | row 2 | row 2 |
   | row 3  | row 3 | row 3 |

   | col 4  | col 5 | col 6 |
   | row 4  | row 4 | row 4 |
   | row 5  | row 5 | row 5 |
   | row 6  | row 6 | row 6 |

   | col 7  | col 2 | col 3 |
   | row 7  | row 7 | row 7 |
   | row 8  | row 8 | row 8 |
   | row 9  | row 9 | row 9 |

Мне удалось заставить группы столбцов работать так, чтобы 3 столбца были вместе, но попытка добавить «rowspan» не удалась. Попытка обернуть группы строк в теги tr была бесполезна. и, насколько я знаю, настоящего тега «rowgroup» не существует.

Обновлять:

Получив обратную связь, я понял, что должен дать более подробную информацию о том, что я имею в виду.

Я буду использовать термины «квадрат», «суперстолбец», «суперстрока» для обозначения групп данных. Итак, возьмите этот пример:

               Quad 1       Quad 2
super-row1 | a | b | c || d | e | f |
super-row2 | 1 | 2 | 3 || 4 | 5 | 6 |
super-row3 | A | B | C || D | E | F |

               Quad 3       Quad 4
super-row4 | g | h | i || j | k | l |
super-row5 | 7 | 8 | 9 || 0 | 1 | 2 |
super-row6 | G | H | I || J | K | L |

Для простоты представьте, что сверху я написал суперстолбец 1–6.

Таким образом, все данные в quad 1 связаны, и данные в суперстроке 1 все связаны, и данные в суперстолбце 1 все связаны. Итак, используя приведенные выше данные,

«a» имеет прямое отношение к «f», «C» и «G», но «f», «C» и «G» не имеют прямого отношения друг к другу.

Другой способ представить это — судоку, где каждая четверка, столбец и строка содержат набор от 1 до 9, что делает любую из 81 точки данных напрямую связанной с любыми другими точками данных, с которыми она делит строку, столбец или четверку. но не к любым точкам данных.

Быстрое обновление:

И последнее, извините. Важно, чтобы эти отношения были семантически сгруппированы в HTML, чтобы, если кто-то использует программу чтения с экрана или нетрадиционный браузер, они могли знать, где они находятся в таблице в любой момент, например: «Вы находитесь в Quad 1, Super Col 1, Column 4, Super Row 1, Row 1. Данные: «Огайо».

Это значительно упрощает стилизацию, кросс-браузерную совместимость, доступность, а также перемещение, такое как AccessKeys, Scope и т. д.


person Anthony    schedule 17.06.2009    source источник
comment
Я действительно не понимаю намерения. У вас есть пример данных, чтобы я мог предложить соответствующее предложение, абстрактная концепция, которую вы, кажется, представляете, сбивает меня с толку. И я подозреваю, что я просто не понимаю. Извините, я не могу быть более полезным для вас в данный момент. =/ Однако в данный момент я бы согласился с ответом Рори.   -  person David says reinstate Monica    schedule 27.06.2009


Ответы (5)


Учитывая, что <colgroup> — единственный семантический метод группировки столбцов, а <tbody> — единственный семантический способ группировки строк, я бы рекомендовал придерживаться чего-то простого:

<table>
    <colgroup id="colgroup1">
        <col id="colA" />
        <col id="colB" />
    </colgroup>
    <colgroup id="colgroup2">
        <col id="colC" />
        <col id="colD" />
    </colgroup>
    <tbody id="rowgroup1">
        <tr>
            <th>A</th>
            <th>B</th>
            <th>C</th>
            <th>D</th>
        </tr>
        <tr id="row1">
            <td>A1</td>
            <td>B1</td>
            <td>C1</td>
            <td>D1</td>
        </tr>
        <tr id="row2">
            <td>A2</td>
            <td>B2</td>
            <td>C2</td>
            <td>D2</td>
        </tr>
    </tbody>
    <tbody id="rowgroup2">
        <tr>
            <th>A</th>
            <th>B</th>
            <th>C</th>
            <th>D</th>
        </tr>
        <tr id="row3">
            <td>A3</td>
            <td>B3</td>
            <td>C3</td>
            <td>D3</td>
        </tr>
        <tr id="row4">
            <td>A4</td>
            <td>B4</td>
            <td>C4</td>
            <td>D4</td>
        </tr>
    </tbody>
</table>

Это позволит вам стилизовать четырехугольники, сохраняя при этом чистую семантическую структуру. Я не уверен, насколько у вас будет гибкость в стилях, но у вас есть несколько вариантов:

<style type="text/css">
    table { border-collapse:collapse; font-family:sans-serif; font-size:small; }
    td, th { border:solid 1px #000; padding:2px 10px; text-align:center; }
    th { background-color:#000; color:#fff; font-size:x-small; }
    colgroup { border:solid 3px #000; }
    tbody { border:solid 3px #000; }
</style>

table {
  border-collapse: collapse;
  font-family: sans-serif;
  font-size: small;
}
td,
th {
  border: solid 1px #000;
  padding: 2px 10px;
  text-align: center;
}
th {
  background-color: #000;
  color: #fff;
  font-size: x-small;
}
colgroup {
  border: solid 3px #000;
}
tbody {
  border: solid 3px #000;
}
<table>
  <colgroup id="colgroup1">
    <col id="colA" />
    <col id="colB" />
  </colgroup>
  <colgroup id="colgroup2">
    <col id="colC" />
    <col id="colD" />
  </colgroup>
  <tbody id="rowgroup1">
    <tr>
      <th>A</th>
      <th>B</th>
      <th>C</th>
      <th>D</th>
    </tr>
    <tr id="row1">
      <td>A1</td>
      <td>B1</td>
      <td>C1</td>
      <td>D1</td>
    </tr>
    <tr id="row2">
      <td>A2</td>
      <td>B2</td>
      <td>C2</td>
      <td>D2</td>
    </tr>
  </tbody>
  <tbody id="rowgroup2">
    <tr>
      <th>A</th>
      <th>B</th>
      <th>C</th>
      <th>D</th>
    </tr>
    <tr id="row3">
      <td>A3</td>
      <td>B3</td>
      <td>C3</td>
      <td>D3</td>
    </tr>
    <tr id="row4">
      <td>A4</td>
      <td>B4</td>
      <td>C4</td>
      <td>D4</td>
    </tr>
  </tbody>
</table>

person Brandon Gano    schedule 26.06.2009
comment
Я второй этот ответ. Тег tbody эквивалентен группе строк. Так уж получилось, что существует три типа групп строк (thead, tbody и tfoot). Кроме того, к ячейкам можно добавить атрибут заниженной оси, чтобы пометить ячейки одного квадранта вместе. ‹td axis=quad1›. Затем они могут быть выбраны CSS с помощью таблицы td[axis=quad1]. - person Borgar; 01.07.2009

<table> может иметь несколько дочерних элементов <tbody>, которые представляют группы строк. Я раньше не использовал элемент <colgroup>, поэтому я оставлю это для добавления кем-то другим, но вот решение, которое позволит вам удовлетворить ваши потребности в стиле, сохраняя при этом семантику:

<table>
    <tbody>
        <tr>
            <th scope="col">col 1</th>
            <th scope="col">col 2</th>
            <th scope="col">col 3</th>
        </tr>
        <tr>
            <td>row 1</td>
            <td>row 1</td>
            <td>row 1</td>
        </tr>
        <tr>
            <td>row 2</td>
            <td>row 2</td>
            <td>row 2</td>
        </tr>
        <tr>
            <td>row 3</td>
            <td>row 3</td>
            <td>row 3</td>
        </tr>
    </tbody>
    <tbody>
        <tr>
            <th scope="col">col 4</th>
            <th scope="col">col 5</th>
            <th scope="col">col 6</th>
        </tr>
        <tr>
            <td>row 4</td>
            <td>row 4</td>
            <td>row 4</td>
        </tr>
        <tr>
            <td>row 5</td>
            <td>row 5</td>
            <td>row 5</td>
        </tr>
        <tr>
            <td>row 6</td>
            <td>row 6</td>
            <td>row 6</td>
        </tr>
    </tbody>
    <tbody>
        <tr>
            <th scope="col">col 7</th>
            <th scope="col">col 8</th>
            <th scope="col">col 9</th>
        </tr>
        <tr>
            <td>row 7</td>
            <td>row 7</td>
            <td>row 7</td>
        </tr>
        <tr>
            <td>row 8</td>
            <td>row 8</td>
            <td>row 8</td>
        </tr>
        <tr>
            <td>row 9</td>
            <td>row 9</td>
            <td>row 9</td>
        </tr>
    </tbody>
</table>

Я основывался на информации из спецификации HTML 5, но он также должен быть действительным HTML 4.

person roryf    schedule 17.06.2009
comment
Я думал сделать несколько тел, но не был уверен, что это семантически самый правильный подход из-за отношений между различными группами данных. Я полностью согласен с тем, что это простой и эффективный метод, не прибегающий к взлому вложенных таблиц, но... данные в каждом суперстолбце на самом деле все связаны, поэтому я не хочу отделять их от окружающих (выше или ниже) столбцы таким образом, что я теряю эту связь. Данные в столбце 1, строка 1, относятся к данным в столбце 7, строке 9, они просто БОЛЕЕ релевантны данным в столбце 1, строке 4 и строке 5. - person Anthony; 18.06.2009

Если я правильно помню, тег <colgroup> не работает должным образом ни в одном браузере (ну, может быть, в Opera). Я бы избегал этого любой ценой.

На вашем месте я бы просто сделал простую таблицу, где каждый <td> представляет собой «четверку», а затем создал таблицу в этой ячейке для остальных данных.

person priestc    schedule 30.06.2009

На самом деле семантически правильный способ - это вложенные таблицы. В вашем примере есть таблица четырехугольников 2x2, и каждый четырехугольник представляет собой таблицу значений 3x3. Нет ничего семантически неправильного в использовании для этого вложенной таблицы. Не запутайтесь в толпе анти-вложенных-html-таблиц. Это связано с использованием вложенных таблиц для макета страницы.

Использование вложенных таблиц также дает вам больший контроль над стилями CSS. Использование cols и colgroups дает вам очень ограниченный контроль над стилями. Единственные свойства CSS, которые вы можете установить для столбца или группы столбцов, — это граница, фон, с и видимость.

person Sander Marechal    schedule 01.07.2009

Я думаю, что проще всего вообще пропустить элемент colgroup и вместо этого использовать простой стиль класса:

<table>
    <tr class="colgroup1">
        <th>col1</th><th>col2</th><th>col3</th>
    </tr>
    <tr class="colgroup1">
        <td>row1</td><td>row1</td><td>row1</td>
    </tr>
    <tr class="colgroup1">
        <td>row2</td><td>row2</td><tr>row2</td>
    </tr>
    <tr class="colgroup2">
        <th>col4</th><th>col5</th><th>col6</th>
    </tr>
    <tr class="colgroup2">
        <td>row3</td><td>row3</td><td>row3</td>
    </tr>
    <tr class="colgroup2">
        <td>row4</td><td>row4</td><td>row4</td>
    </tr>
    <tr class="colgroup3">
        <th>col7</th><th>col8</th><th>col9</th>
    </tr>
    <tr class="colgroup3">
        <td>row5</td><td>row5</td><td>row5</td>
    </tr>
    <tr class="colgroup3">
        <td>row6</td><td>row6</td><td>row6</td>
    </tr>
</table>

Затем вы можете легко настроить таргетинг на различные colgroups в CSS:

.colgroup1 th {
   // Styles here
}

.colgroup2 th {
   // Styles here
}


.colgroup3 th {
   // Styles here
}

// Same for tds.

Изменить: мне нравится, как Рори Фицпатрик использует несколько корпуса столов. Если это действительно так, то я бы выбрал это решение и просто поместил имя класса в каждый тег тела таблицы. CSS останется прежним

person PatrikAkerstrand    schedule 17.06.2009
comment
Тоже думал пойти по этому пути. Проблема, как я упомянул в своем комментарии к Рори, заключается в том, что я хочу сгруппировать их не только для целей стиля, но и для реляционных целей. Чтобы быть более конкретным: данные в основном представляют собой своего рода матрицу. Пример, который я использовал, был для простоты, но на самом деле он сложнее. Представьте пример, умноженный на 5, где в каждой группе будет 3 столбца и 5 групп столбцов. В этом случае у каждого квадроцикла будут данные, и эти данные относятся к любым другим данным в суперстолбце или суперстроке и к его квадроциклу. Данные на одну строку вниз и на одну четверку вверх не связаны. - person Anthony; 18.06.2009