안녕하세요, 제가 무언가를 물어 본 지 오래되었습니다. 이것은 한동안 저를 괴롭 혔습니다. 질문 자체는 제목에 있습니다.
세로 헤더가있는 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 테이블이 있다는 것입니다. 단점은 적절한 표현에 tbody
및 thead
태그에 대해 약간의 CSS가 필요하고 생성 할 때 의심 스러웠 기 때문에 헤더와 데이터 간의 관계가 명확하지 않다는 것입니다. 마크 업.
따라서 두 가지 방법 모두 테이블을 렌더링해야합니다.
원하는 경우 왼쪽 또는 오른쪽에 헤더가 있으므로 제안, 대안, 브라우저 문제가 있습니까?
답변
첫째, 두 번째 옵션은 테이블의 모든 행 (TR)이 동일한 수의 열 (TD)을 포함해야한다는 점에서 유효한 HTML이 아닙니다. 헤더에는 1이 있고 본문에는 3이 있습니다.이를 수정하려면 colspan 속성을 사용해야합니다.
참조 : “THEAD, TFOOT 및 TBODY 섹션은 동일한 수의 열을 포함해야합니다.” – 섹션 11.2.3의 마지막 단락 .
그 말 을 듣고 첫 번째 옵션은 CSS를 활성화했는지 여부에 관계없이 읽을 수 있기 때문에 내 생각에 더 나은 접근 방식입니다. 일부 브라우저 (또는 검색 엔진 크롤러)는 CSS를 수행하지 않으므로 헤더가 행 대신 열을 나타내므로 데이터가 의미가 없습니다.
답변
첫 번째 옵션 … 더 좋고 간단한 방법이라고 생각합니다 ..
답변
솔직히 1 번입니다. W3.org (아래 링크)에서이 예제를 보시길 권합니다. 이 방법이 가장 좋다고 생각합니다. 이렇게하면 제목이 화면 판독기에서도 바로 해석되기 때문입니다.
https://www.w3.org/WAI/tutorials/tables/one-header/#table-with-header-cells-in-the-first-column-only
답변
테이블에 데이터 바인딩 된 제어 요소 (예 : 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>
답변
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>