2013-09-12 3 views
4

У меня есть таблица, где элементы могут иметь дочерние элементы с теми же самыми признаками, как:Семантический вложенных таблиц и заголовок таблицы

ITEM ATTRIBUTE 1 ATTRIBUTE 2 
item value   value 
sub value   value 
sub value   value 
item value   value 

Из этого я создал разметку, как это:

<table> 
    <thead> 
     <tr> 
      <th>ITEM</th> 
      <th>ATTRIBUTE 1</th> 
      <th>ATTRIBUTE 2</th> 
     </tr> 
    </thead> 
    <tbody> 
     <tr> 
      <td>item</td> 
      <td>value</td> 
      <td>value</td> 
     </tr> 
     <tr> 
      <td colspan=3> 
       <table> 
        <tbody> 
         <tr> 
          <td>sub</td> 
          <td>value</td> 
          <td>value</td> 
         </tr> 
        </tbody> 
       </table> 
      </td> 
     </tr> 
     <tr> 
      <td>item</td> 
      <td>value</td> 
      <td>value</td> 
     </tr> 
    </tbody> 
</table> 

Мои вопросы сейчас:

  • это лучшее семантическое решение?
  • Является ли другой подход более подходящим? Если да, то какой из них рекомендуется?
  • ли заголовок таблицы, отвечающий за обе таблицы или я должен создать новый (возможно, с visibility: hidden для вложенной таблицы?
+0

Да, наконец, 75 репутации, чтобы начать так называемую щедрость. О, и я потерял возможность прокомментировать всюду. Гектометр – lampshade

+0

Я бы избегал вложенных таблиц, он вставляет новую ячейку в ячейку, которая не является тем, что вам нужно. Если у вас только 1 уровень отношений, почему бы не оставить таблицу плоской и использовать css для определения элемента vs subitem. ' ... ...' – kalhartt

+0

@kalhartt Да, но это не отражает семантическое значение подэлемента или не так ли? Я тоже об этом думал, но это будет только визуально. – lampshade

ответ

4

Это лучшее семантическое решение?

Не Действительно, в то время как действие вложения элемента A внутри другого элемента B может быть использовано для указания того, что A является дочерним элементом B, это не то, что вы здесь делаете: вы вставляете таблицу в совершенно другую строку, поэтому нет никакого отношения отношения между родителем и ребенком между A и B.

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

Вы можете увидеть предполагаемую (нехватка) отношения между столбцами путем добавления границы к клеткам в вашем примере выше:

Rendered table

Очевидно, что вы можете исправить это с помощью CSS, но без стилей рендеринга фрагмента HTML часто является хорошим руководством к его семантике.

Является ли другой подход более подходящим? Если да, то какой из них рекомендуется?

Нет стандартного способа представления иерархических связей между строками таблицы в HTML. Списывание из an answer I gave to a similar question, хотя, вы можете сделать это с дополнительными классами, идентификаторами и data- атрибуты:

<table> 
    <thead> 
     <tr> 
      <th>ITEM</th> 
      <th>ATTRIBUTE 1</th> 
      <th>ATTRIBUTE 2</th> 
     </tr> 
    </thead> 
    <tbody> 
     <tr id=100> 
      <td>item</td> 
      <td>value</td> 
      <td>value</td> 
     </tr> 
     <tr id=110 data-parent=100 class=level-1> 
      <td>sub</td> 
      <td>value</td> 
      <td>value</td> 
     </tr> 
     <tr id=200> 
      <td>item</td> 
      <td>value</td> 
      <td>value</td> 
     </tr> 
    </tbody> 
</table> 

Отношения родитель-ребенок не будет виден в без стилей рендеринга (нет другого пути, вы могли бы сделать это так, без добавления дополнительного контента, насколько я могу судить), но есть достаточно крючки, чтобы добавить CSS необходимый:

.level-1 > td:first-child { 
    padding-left: 1em; 
} 

... что приводит к следующим образом:

Rendered table

С помощью небольшого javascript вы также можете использовать атрибуты id и data-parent, чтобы установить настройки таким образом, чтобы, например, зависание над строкой вызывает выделение родителя.

Является ли заголовок таблицы ответственным за обе таблицы, или мне нужно создать новый?

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

+0

Ваши два абзаца вначале точно описывают мою озабоченность, и мой (косвенный) вопрос, кажется, отвечает этим, к сожалению: * «Нет стандартного способа представления иерархических отношений между строками таблицы в HTML». * – lampshade

+0

Хорошее решение, но не будет ли это решение создавать проблему, если я хочу отобразить таблицу с помощью шаблона? –

+0

@DigvijayYadav Как так? Строка должна знать свою глубину в иерархии, если было более двух уровней, но это не сложно для того, что бы обеспечить, чтобы данные отслеживали, если необходимо (и если есть только два уровня, просто зная, что есть родитель достаточно). На любом разумном языке шаблонов остальное тривиально. –

1

Это рекомендация W3C,:

В текущее время, те, кто хочет, чтобы обеспечить постоянную поддержку через РЕАБИЛИТАЦИОННЫЕ технологий для таблиц, где заголовки не в первой строке/столбцу может понадобиться использовать метод для сложных таблиц H43: использование атрибутов id и заголовков для ассоциированных ячеек данных с ячейками заголовка в таблицах данных. Для простых таблиц с заголовками в первом столбце или строке мы рекомендуем использовать элементы th и td.

вы можете заблокировать на этом посту: Best way to construct a semantic html table

надежду, что поможет вам получить ответ

+0

Спасибо за это. (+1). – lampshade

0

Говоря о семантике требует от нас, чтобы иметь больше времени, чем найти ответ на свой вопрос.

Но на весь срок, this link должен вам помочь. Эта страница содержит всю интересующую вас информацию. Интересно, что в отличие от обычной «декларативной» спецификации w3c, она имеет «наводящий» написание вопроса в этом контексте. Вы можете прочитать это с самого начала.

0

Я думаю, что положить детей в отдельный стол - неправильный путь. Вложенные таблицы не похожи на вложенные списки; они не несут ту же семантическую иерархию. Кажется, что все должно быть в одной таблице, если все содержит одну и ту же информацию.

Например, если таблица была заголовки

REGION POPULATION  AREA 

тогда вы могли бы иметь item1 = Землю, item2 = Франция, item3 = Париж ... и это не имеет никакого значения, если бы Франция была ребенком Земли, или если Париж был ребенком Франции; вам все равно лучше хранить все в одной таблице и не пытаться сделать отношения между родителями и дочерними элементами, отличными от стиля CSS.

Если ваша таблица действительно не понятна, если кто-то не знает, что отношения между родителем и ребенком, не могли бы вы привести пример данных таблицы, чтобы я мог лучше понять, как ее структурировать?

Смежные вопросы