Cách phổ biến nhất để viết một bảng HTML với tiêu đề dọc?


95

Xin chào tất cả đã lâu rồi tôi chưa hỏi một điều gì đó, đây là điều đã làm tôi bận tâm một thời gian, câu hỏi chính nó nằm trong tiêu đề:

Cách ưa thích của bạn để viết bảng HTML có tiêu đề dọc là gì?

Theo tiêu đề dọc, ý tôi là bảng có thẻ header ( <th>) ở phía bên trái (nói chung)

Tiêu đề 1 dữ liệu dữ liệu dữ liệu
Tiêu đề 2 dữ liệu dữ liệu
Tiêu đề 3 dữ liệu dữ liệu dữ liệu

Chúng trông như thế này, cho đến nay tôi đã đưa ra hai lựa chọn

Lựa chọn đầu tiên

   
    <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>
   

Ưu điểm chính của cách này là bạn có tiêu đề đúng (trên thực tế trái) bên cạnh các dữ liệu mà nó đại diện, những gì tôi không thích tuy nhiên đó là <thead>, <tbody><tfoot>thẻ bị thiếu, và không có cách nào để đưa chúng mà không phá vỡ các yếu tố được đặt cùng nhau một cách khéo léo, dẫn tôi đến lựa chọn thứ hai.

Sự lựa chọn thứ hai

   
        <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>
   

Ưu điểm chính ở đây là bạn có một bảng html đầy đủ mô tả, những hạn chế đang là đại diện thích hợp cần một chút CSS cho tbodytheadthẻ và rằng mối quan hệ giữa các tiêu đề và dữ liệu không phải là rất rõ ràng như tôi đã nghi ngờ của tôi khi tạo đánh dấu.


Vì vậy, cả hai cách đều hiển thị bảng như thế nào, đây là một quảng cáo chiêu hàng:

kết xuất
Với các tiêu đề ở bên trái hoặc bên phải nếu bạn muốn, vì vậy, bất kỳ đề xuất, lựa chọn thay thế, vấn đề trình duyệt nào?

Câu trả lời:


45

Đầu tiên, tùy chọn thứ hai của bạn không phải là HTML hoàn toàn hợp lệ theo nghĩa là tất cả các hàng (TR) trong bảng phải chứa một số cột bằng nhau (TD). Tiêu đề của bạn có 1 trong khi nội dung có 3. Bạn nên sử dụng thuộc tính colspan để khắc phục điều đó.

Tham khảo: "Các phần THEAD, TFOOT và TBODY phải chứa cùng một số cột." - Đoạn cuối mục 11.2.3 .

Với con người mà nói , tùy chọn đầu tiên là cách tiếp cận tốt hơn trong quan điểm của tôi bởi vì nó có thể đọc được bất kể có hay không tôi có CSS kích hoạt. Một số trình duyệt (hoặc trình thu thập thông tin của công cụ tìm kiếm) không thực hiện CSS và như vậy, nó sẽ khiến dữ liệu của bạn không có ý nghĩa gì vì khi đó tiêu đề sẽ đại diện cho các cột thay vì hàng.


Có thực sự cần thiết để anh ấy khắc phục vấn đề đầu tiên mà bạn đề cập không? Vì nếu bạn chỉ thêm một ô, nó sẽ tự động chiếm khoảng trống đầu tiên và phần còn lại bị bỏ qua?
LouwHopley

xin chào, cảm ơn bạn đã đánh dấu đánh dấu không hợp lệ, tôi sẽ sửa nó.
Tristian

@Nideo - Tôi đã thêm một tham chiếu từ tài liệu HTML4 trong bài đăng của mình, trong đó nêu rõ rằng THEAD, TFOOT và TBODY phải chứa cùng một số cột.
Francois Deschenes

@Triztian - Một điều nữa. TFOOT phải nằm ngay dưới THEAD (và trước TBODY). Một lần nữa, điều này được đề cập trong phần 11.2.3 của đặc tả HTML.
Francois Deschenes

1
@prodigitalson - scopeThuộc tính sẽ không thực sự tạo ra nhiều khác biệt trong trường hợp này. Nếu bạn đọc nó để làm gì, bạn sẽ hiểu. Về cơ bản, nó có nghĩa là các cột đó là tiêu đề cho hàng hoặc cột mà nó chứa. Vấn đề là việc sử dụng nó không có ý nghĩa gì trừ khi nếu được thay thế <th>bằng a <td scope="row">.
Francois Deschenes



0

Nếu bạn muốn hiển thị phần tử điều khiển có giới hạn dữ liệu (như bộ lặp asp) trong bảng của mình, thì tùy chọn đầu tiên sẽ không thể thực hiện được. Tùy chọn thứ hai có thể được sử dụng như sau.

<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
Vui lòng thêm giải thích về cách câu trả lời của bạn giải quyết vấn đề được xác định trong câu hỏi.
blurfus, 14/07/17
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.