Найпоширеніший спосіб написання таблиці HTML з вертикальними заголовками?


95

Привіт всім, минув якийсь час з того часу, як я щось запитав, це щось мене турбує якийсь час, саме питання в заголовку:

Який улюблений спосіб написання таблиць HTML із вертикальними заголовками?

Під вертикальним заголовком я маю на увазі, що таблиця має <th>тег header ( ) з лівого боку (загалом)

Заголовок 1 даних даних даних
Заголовок 2 даних даних даних
Заголовок 3 даних даних даних

Вони виглядають так, поки що я придумав два варіанти

Перший варіант

   
    <table id="vertical-1">
            <caption>First Way</caption>
            <tr>
                <th>Header 1</th>
                <td>data</td><td>data</td><td>data</td>
            </tr>
            <tr>
                <th>Header 2</th>
                <td>data</td><td>data</td><td>data</td>
            </tr>
            <tr>
                <th>Header 2</th>
                <td>data</td><td>data</td><td>data</td>
            </tr>
        </table>
   

Головна перевага цього способу є те, що у вас є заголовки вправо ( на насправді зліва) поряд з даними , які вона представляє, що мені не подобається , однак, що <thead>, <tbody>і <tfoot>мітки відсутні, і немає ніякого способу , щоб включити їх , не порушуючи красиво розміщені разом елементи, які ведуть мене до другого варіанту.

Другий варіант

   
        <style type="text/css">
            #vertical-2 thead,#vertical-2 tbody{
                display:inline-block;
            }

        </style>
        <table id="vertical-2">
            <caption>Second Way</caption>
            <thead>
                <tr>
                    <th colspan="3">Header 1</th>
                </tr>
                <tr>
                    <th colspan="3">Header 2</th>
                </tr>
                <tr>
                    <th colspan="3">Header 3</th>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <td>row 1</td>
                    <td>row 1</td>
                    <td>row 1</td>
                </tr>
                <tr>
                    <td>data</td>
                    <td>data</td>
                    <td>data</td>
                </tr>
                <tr>
                    <td>data</td>
                    <td>data</td>
                    <td>data</td>
                </tr>
            </tbody>
            <tfoot>
                <tr>
                    <td colspan="4">Footer</td>
                </tr>
            </tfoot>
        </table>
   

Головною перевагою є те , що у вас є повністю описовий HTML таблицю, недоліки в тому , що правильне уявлення потрібно трохи CSS для tbodyі theadтегів і що зв'язок між заголовками і даними не дуже ясно , як у мене були сумніви при створенні розмітка.


Отже, обидва шляхи роблять таблицю як слід, тут pitcure:

візуалізувати
Якщо ви віддасте перевагу заголовкам ліворуч або праворуч, отже, будь-які пропозиції, альтернативи, проблеми з браузером?

Відповіді:


45

По-перше, ваш другий варіант не є цілком допустимим HTML у тому сенсі, що всі рядки (TR) у таблиці повинні містити однакову кількість стовпців (TD). Ваш заголовок має 1, а тіло - 3. Ви повинні використати атрибут colspan, щоб це виправити.

Посилання: "Розділи THEAD, TFOOT і TBODY повинні містити однакову кількість стовпців." - Останній абзац розділу 11.2.3 .

З огляду на це , першим варіантом є кращий підхід, на мій погляд, оскільки він читається незалежно від того, увімкнено CSS чи ні. Деякі браузери (або сканери пошукових систем) не роблять CSS, і як такий, ваші дані не матимуть сенсу, оскільки заголовок буде представляти стовпці замість рядків.


Чи справді йому потрібно вирішити першу проблему, про яку ви згадали? Оскільки якщо ви додаєте лише одну комірку, вона автоматично займає перший пробіл, а решта ігнорується?
LouwHopley

привіт, дякую, що виділили недійсну розмітку, я її виправлю.
Трістіан,

@Nideo - Я додав посилання з документації HTML4 у своєму дописі, де чітко зазначено, що THEAD, TFOOT і TBODY повинні містити однакову кількість стовпців.
Франсуа Дешен

@Triztian - Ще одна річ. TFOOT повинен знаходитись безпосередньо під THEAD (і перед TBODY). Знову ж, це висвітлено у розділі 11.2.3 специфікації HTML.
Франсуа Дешен

1
@prodigitalson - scopeАтрибут насправді не сильно змінив би в цьому випадку. Якщо ви прочитаєте для чого це, ви зрозумієте. Це в основному означає, що те стовпці є заголовком або рядка, або стовпця, який він містить. Проблема полягає в тому, що це використання не має сенсу , якщо , якщо не було замінити <th>з <td scope="row">.
Франсуа Дешен


2

Чесно кажучи, варіант 1. Я б запропонував вам поглянути на цей приклад із W3.org (посилання нижче). Я вважаю, що цей метод є найкращим, оскільки таким чином ваші заголовки також будуть інтерпретовані прямо на екранах.

https://www.w3.org/WAI/tutorials/tables/one-header/#table-with-header-cells-in-the-first-column-only


0

Якщо ви хочете показати елемент керування з обмеженими даними (наприклад, повторювач asp) у вашій таблиці, тоді перший варіант буде неможливим. Другий варіант можна використовувати наступним чином.

<asp:Repeater ID="hours" runat="server">
    <HeaderTemplate>
    <table id="vertical-table">
        <thead>
            <tr><th colspan="0">hours:</th></tr>
            <tr><th colspan="1">Monday</th></tr>
            <tr><th colspan="1">Tuesday</th></tr>
            <tr><th colspan="1">Wednesday</th></tr>
            <tr><th colspan="1">Thursday</th></tr>
            <tr><th colspan="1">Friday</th></tr>
            <tr><th colspan="1">Saturday</th></tr>
            <tr><th colspan="1">Sunday</th></tr>
        </thead>
        <tbody>
    </HeaderTemplate>
    <ItemTemplate>
            <tr><td><%# Container.DataItem %></td></tr>
    </ItemTemplate>
    <FooterTemplate>
        </tbody>
    </table>
    </FooterTemplate>
</asp:Repeater>

-3

div.vertical {
  margin-left: -85px;
  position: absolute;
  width: 215px;
  transform: rotate(-90deg);
  -webkit-transform: rotate(-90deg);
  /* Safari/Chrome */
  -moz-transform: rotate(-90deg);
  /* Firefox */
  -o-transform: rotate(-90deg);
  /* Opera */
  -ms-transform: rotate(-90deg);
  /* IE 9 */
}

th.vertical {
  height: 220px;
  line-height: 14px;
  padding-bottom: 20px;
  text-align: left;
}
<table>
  <thead>
    <tr>
      <th class="vertical">
        <div class="vertical">Really long and complex title 1</div>
      </th>
      <th class="vertical">
        <div class="vertical">Really long and complex title 2</div>
      </th>
      <th class="vertical">
        <div class="vertical">Really long and complex title 3</div>
      </th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Example</td>
      <td>a, b, c</td>
      <td>1, 2, 3</td>
    </tr>
  </tbody>
</table>


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