Dikey başlıklara sahip bir HTML tablosu yazmanın en yaygın yolu?


97

Merhabalar, bir şey sormayalı epey oldu, bu beni bir süredir rahatsız eden bir şey, sorunun kendisi başlıkta:

Dikey başlıklara sahip HTML tabloları yazmak için tercih ettiğiniz yol nedir?

Dikey başlık ile tablonun <th>sol tarafında başlık ( ) etiketi olduğunu kastediyorum (genellikle)

Başlık 1 veri veri verileri
Başlık 2 veri veri verileri
Başlık 3 veri veri verileri

Şuna benziyorlar, şimdiye kadar iki seçenek buldum

İlk seçenek

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

Bu yolun ana avantajı, temsil ettiği verilerin yanında sağda (aslında solda) başlıklara sahip olmanızdır, ancak hoşlanmadığım şey <thead>, <tbody>ve <tfoot>etiketlerinin eksik olması ve bunları bozmadan dahil etmenin bir yolu yoktur. Öğeleri güzelce bir araya getirerek beni ikinci seçeneğe götürüyor.

İkinci seçenek

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

Buradaki ana avantaj, tamamen açıklayıcı bir html tablonuzun olmasıdır, dezavantajları, uygun temsilin tbodyve theadetiketleri için biraz CSS'ye ihtiyaç duyması ve başlıklar ile veriler arasındaki ilişkinin çok net olmamasıdır, çünkü oluştururken şüphelerim vardı. işaretleme.


Yani, her iki yol da tabloyu olması gerektiği gibi işler, işte bir pitcure:

vermek
İsterseniz sol veya sağdaki başlıklarla, herhangi bir öneri, alternatif, tarayıcı sorunu var mı?

Yanıtlar:


47

İlk olarak, bir tablodaki tüm satırların (TR) eşit sayıda sütun (TD) içermesi gerektiği için ikinci seçeneğiniz oldukça geçerli HTML değildir. Başlığınızda 1, gövdede ise 3 bulunur. Bunu düzeltmek için colspan özelliğini kullanmalısınız.

Referans: "THEAD, TFOOT ve TBODY bölümleri aynı sayıda sütun içermelidir." - 11.2.3 bölümünün son paragrafı .

Bununla birlikte, benim görüşüme göre ilk seçenek daha iyi bir yaklaşımdır çünkü CSS'nin etkinleştirilip etkinleştirilmemesine bakılmaksızın okunabilir. Bazı tarayıcılar (veya arama motoru tarayıcıları) CSS yapmaz ve bu nedenle, başlık satırlar yerine sütunları temsil edeceğinden verilerinizin hiçbir anlamı olmaz.


Bahsettiğiniz ilk sorunu çözmesi gerçekten gerekli mi? Yalnızca bir hücre eklerseniz, otomatik olarak ilk boşluğu kaplar ve geri kalanı yok sayılır?
LouwHopley

merhaba geçersiz işaretlemeyi vurguladığınız için teşekkürler, düzelteceğim.
Tristian

@Nideo - Gönderime, THEAD, TFOOT ve TBODY'nin aynı sayıda sütun içermesi gerektiğini açıkça belirten HTML4 belgelerinden bir referans ekledim.
Francois Deschenes

@Triztian - Bir şey daha. TFOOT, doğrudan THEAD'nin altında (ve TBODY'lerden önce) olmalıdır. Yine, bu, HTML spesifikasyonunun 11.2.3 bölümünde ele alınmıştır.
Francois Deschenes

1
@prodigitalson - scopeÖznitelik bu durumda pek bir fark yaratmaz . Ne için olduğunu okursanız, anlayacaksınız. Temel olarak, bu sütunların, içerdiği satır veya sütunun başlığı olduğu anlamına gelir. Sorun şu ki <th>, a ile değiştirilmedikçe kullanımının bir anlamı yok <td scope="row">.
Francois Deschenes



0

Tablonuzda veriye bağlı bir kontrol öğesi (asp tekrarlayıcı gibi) göstermek istiyorsanız, ilk seçenek mümkün olmayacaktır. İkinci seçenek aşağıdaki şekilde kullanılabilir.

<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
Lütfen yanıtınızın soruda tanımlanan sorunu nasıl ele aldığına dair bir açıklama ekleyin.
blurfus
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.