세로 헤더가있는 HTML 테이블을 작성하는 가장 일반적인 방법은 무엇입니까?


95

안녕하세요, 제가 무언가를 물어 본 지 오래되었습니다. 이것은 한동안 저를 괴롭 혔습니다. 질문 자체는 제목에 있습니다.

세로 헤더가있는 HTML 표를 작성하는 데 선호하는 방법은 무엇입니까?

수직 머리글이란 테이블 <th>의 왼쪽에 (일반적으로) 머리글 ( ) 태그 가 있음을 의미합니다.

헤더 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 테이블이 있다는 것입니다. 단점은 적절한 표현에 tbodythead태그에 대해 약간의 CSS가 필요하고 생성 할 때 의심 스러웠 기 때문에 헤더와 데이터 간의 관계가 명확하지 않다는 것입니다. 마크 업.


따라서 두 가지 방법 모두 테이블을 렌더링해야합니다.

세우다
원하는 경우 왼쪽 또는 오른쪽에 헤더가 있으므로 제안, 대안, 브라우저 문제가 있습니까?

답변:


45

첫째, 두 번째 옵션은 테이블의 모든 행 (TR)이 동일한 수의 열 (TD)을 포함해야한다는 점에서 유효한 HTML이 아닙니다. 헤더에는 1이 있고 본문에는 3이 있습니다.이를 수정하려면 colspan 속성을 사용해야합니다.

참조 : "THEAD, TFOOT 및 TBODY 섹션은 동일한 수의 열을 포함해야합니다." - 섹션 11.2.3의 마지막 단락 .

그 말 을 듣고 첫 번째 옵션은 CSS를 활성화했는지 여부에 관계없이 읽을 수 있기 때문에 내 생각에 더 나은 접근 방식입니다. 일부 브라우저 (또는 검색 엔진 크롤러)는 CSS를 수행하지 않으므로 헤더가 행 대신 열을 나타내므로 데이터가 의미가 없습니다.


당신이 언급 한 첫 번째 문제를 그가 정말로 고쳐야하나요? 셀을 하나만 추가하면 자동으로 첫 번째 공간을 차지하고 나머지는 무시되므로?
LouwHopley

안녕하세요 잘못된 마크 업을 강조해 주셔서 감사합니다. 수정하겠습니다.
Tristian

@Nideo-THEAD, TFOOT 및 TBODY가 동일한 수의 열을 포함해야 함을 명확하게 설명하는 HTML4 문서의 참조를 게시물에 추가했습니다.
프랑소와 Deschenes

@Triztian-한 가지 더. TFOOT은 THEAD 바로 아래 (그리고 TBODY 앞)에 있어야합니다. 다시 말하지만 이것은 HTML 사양의 섹션 11.2.3에서 다룹니다.
프랑소와 Deschenes

1
@prodigitalson-이 경우 scope속성은 실제로 큰 차이를 만들지 않습니다. 그것이 무엇인지 읽으면 이해할 것입니다. 기본적으로 해당 열은 포함 된 행 또는 열의 헤더입니다. 문제는 교체하는 경우를 제외 이해가되지 않습니다 그것의 사용이다 <th>로모그래퍼 <td scope="row">.
프랑소와 Deschenes



0

테이블에 데이터 바인딩 된 제어 요소 (예 : asp repeater)를 표시하려면 첫 번째 옵션이 불가능합니다. 두 번째 옵션은 다음과 같이 사용할 수 있습니다.

<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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.