垂直ヘッダーのあるHTMLテーブルを作成する最も一般的な方法は?


95

こんにちは、私が何かを尋ねてからしばらく経ちました。これはしばらくの間私を悩ませてきたものです。質問自体はタイトルにあります:

垂直方向のヘッダーを持つHTMLテーブルを作成するための好ましい方法は何ですか?

垂直ヘッダーとは、テーブル<th>の左側に(一般的に)ヘッダー()タグがあることを意味します

ヘッダー1データデータデータ
ヘッダー2データデータデータ
ヘッダー3データデータデータ

彼らはこのように見えます、これまでのところ私は2つのオプションを考え出しました

最初のオプション

   
    <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>タグとタグが欠落していることです。 nicellyが要素を一緒に配置したため、2番目のオプションに移動しました。

2番目のオプション

   
        <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テーブルがあることです。欠点は、tbodytheadタグに少しCSSが必要であり、作成時に疑問があったため、ヘッダーとデータの関係があまり明確でないことです。マークアップ。


したがって、どちらの方法でもテーブルを適切にレンダリングします。ここではピットキュアを使用しています。

レンダリング
ヘッダーを左側または右側に配置したい場合、提案、代替案、ブラウザーの問題はありますか?

回答:


45

まず、2番目のオプションは、テーブル内のすべての行(TR)に同じ数の列(TD)が含まれている必要があるという意味で、有効なHTMLではありません。ヘッダーには1があり、本体には3があります。これを修正するには、colspan属性を使用する必要があります。

参照:「THEAD、TFOOT、およびTBODYセクションには、同じ数の列が含まれている必要があります。」- セクション11.2.3の最後の段落

そうは言っても、私がCSSを有効にしているかどうかに関係なく読みやすいので、最初のオプションは私の意見ではより良いアプローチです。一部のブラウザー(または検索エンジンクローラー)はCSSを実行しないため、ヘッダーが行ではなく列を表すため、データが無意味になります。


彼があなたが言及した最初の問題を修正することが本当に必要ですか?セルを1つだけ追加すると、自動的に最初のスペースが使用され、残りは無視されますか?
LouwHopley

こんにちは、無効なマークアップを強調表示していただきありがとうございます。修正します。
Tristian

@Nideo-THEAD、TFOOT、およびTBODYには同じ数の列が含まれている必要があることを明確に示すHTML4ドキュメントからの参照を投稿に追加しました。
Francois Deschenes、2011年

@Triztian-もう1つ。TFOOTはTHEADの真下(およびTBODYの前)にある必要があります。繰り返しになりますが、これはHTML仕様のセクション11.2.3で説明されています。
Francois Deschenes、2011年

1
@prodigitalson- scopeこの場合、属性はそれほど大きな違いはありません。それが何のためにあるかを読めば、あなたは理解するでしょう。これは基本的に、その列が含まれる行または列のヘッダーであることを意味します。問題は、をに置き換えない限り、その使用が意味をなさない<th>こと<td scope="row">です。
Francois Deschenes、2011年



0

データバインドされたコントロール要素(ASPリピーターなど)をテーブルに表示する場合、最初のオプションは使用できません。2番目のオプションは次のように使用できます。

<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
質問で特定された問題に回答がどのように対処するかについての説明を追加してください。
Blufus
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.