Tablo sütun genişliğini ayarlama


205

Aşağıdaki gibi bir gelen kutusu için kullanılan basit bir tablo var:

<table border="1">
        <tr>
            <th>From</th>
            <th>Subject</th>
            <th>Date</th>
        </tr>

Genişliği, Başlangıç ​​ve Tarih sayfa genişliğinin% 15'i ve Konu% 70 olacak şekilde nasıl ayarlarım. Tablonun tüm sayfa genişliğini kaplamasını da istiyorum.

Yanıtlar:


318

<table style="width: 100%">
    <colgroup>
       <col span="1" style="width: 15%;">
       <col span="1" style="width: 70%;">
       <col span="1" style="width: 15%;">
    </colgroup>
    
    
    
    <!-- Put <thead>, <tbody>, and <tr>'s here! -->
    <tbody>
        <tr>
            <td style="background-color: #777">15%</td>
            <td style="background-color: #aaa">70%</td>
            <td style="background-color: #777">15%</td>
        </tr>
    </tbody>
</table>


5
Bu çözümün temizliği gibi. Ancak, lütfen sütunu kapatın örn. <Col span = "1" style = "width: 15%;" /> veya <col span = "1" style = "width: 15%;"> </col>
lsu_guy

23
@Isu_guy <HT> sadece XHTML kullanırken kapatırsınız - HTML'de <col> etiketi kapanmaz ... daha fazla bilgi için bağlantıya bakın . HTML5'de <col> o anlam bir boşluk unsurdur kapalı ZORUNLU
Matija Nalis

4
@Zulu göre w3schools.com/tags/att_col_width.asp "<col> genişliği özniteliği HTML5'teki desteklenmez."
Caltor

30
@Caltor: Kod edilir değil kullanarak <col> width attribute; Bir kullanıyor CSS *style* width<col> genişlik özelliğini yerini budur. (bu yorumu oy kullanan birden fazla kişiye rağmen !!)
ToolmakerSteve

4
span="1"1 varsayılan olduğundan gereksizdir.
Madbreaks

128

table {
  width: 100%;
  border: 1px solid #000;
}
th.from, th.date {
  width: 15%
}
th.subject {
  width: 70%; /* Not necessary, since only 70% width remains */
}
<table>
  <thead>
    <tr>
      <th class="from">From</th>
      <th class="subject">Subject</th>
      <th class="date">Date</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>[from]</td>
      <td>[subject]</td>
      <td>[date]</td>
    </tr>
  </tbody>
</table>

En iyi uygulama, daha az kod çoğaltma ve endişelerin ayrılması ( yapı ve anlambilim için ve sunum için) için HTMLve CSSayrı tutmaktır .HTMLCSS

Bunun Internet Explorer'ın eski sürümlerinde çalışması için tablonuza belirli bir genişlik (ör. 900 piksel) vermeniz gerekebileceğini unutmayın. Bu tarayıcı, sarmalayıcısının tam boyutları yoksa, yüzde boyutları olan bir öğeyi oluştururken bazı sorunlar yaşıyor.


ilk sırada colspans varsa bu çözüm başarısız olur
mark1234 13:15

3
İyi çünkü <col width = ""> HTML5'te eski: developer.mozilla.org/en/docs/Web/HTML/Element/col
Richard

30

Aşağıdaki CSS'yi kullanın, ilk bildirim tablonuzun sağladığınız genişliklere yapışmasını sağlayacaktır (sınıfları HTML'nize eklemeniz gerekir):

table{
  table-layout:fixed;
}
th.from, th.date {
  width: 15%;
}
th.subject{
  width: 70%;
}

Aslında sadece iki sütunun genişliğini belirtmeniz gerekir. Üçüncüsü otomatik olarak hesaplanacaktır, bu yüzden table{table-layout:fixed};.from,.date{width:15%}yeterlidir. Sınıflar başka öğelerde de kullanılmadıkça, yazma th.fromgereksizdir ve sadece kısaltılabilir .from.
tomasz86

14

IE7'de çalışan bir CSS dosyasında stillerinizi korurken tek bir sınıfla alternatif yol:

<table class="mytable">
    <tr>
        <th>From</th>
        <th>Subject</th>
        <th>Date</th>
    </tr>
</table>
<style>
    .mytable td, .mytable th { width:15%; }
    .mytable td + td, .mytable th + th { width:70%; }
    .mytable td + td + td, .mytable th + th + th { width:15%; }
</style>

Daha yakın zamanda, nth-child()sadece nr'yi koyacağınız CSS3 (IE9 +) 'dan seçici de kullanabilirsiniz . ilgili sütunun, bitişik seçiciyle birlikte dizmek yerine parantezin içine yerleştirin. Bunun gibi, örneğin:

<style>
    .mytable tr > *:nth-child(1) { width:15%; }
    .mytable tr > *:nth-child(2) { width:70%; }
    .mytable tr > *:nth-child(3) { width:15%; }
</style>

Önerilen :nth-childçözüm performans açısından korkunç. Biçimlendirilecek yalnızca üç öğenin ( thveya col) bulunduğu bu örnekte (özellikle evrensel seçiciyle) kullanmak için geçerli bir neden yoktur . Ayrıca, yalnızca thilk satıra genişliği ayarlamanız gerekir . .mytable tdİlk örnekte gereksizdir.
tomasz86

"Önerilen: n'inci çocuk çözümü performans açısından korkunç." - kaynak belirtilmeli.
DanMan

Bu yeterli olmalı: CSS'yi Etkin Bir Şekilde Oluşturma . Evrensel seçiciyi kullandığınızda, tarayıcı TÜM öğeleri başka bir öğenin nci çocuğu olup olmadığını, sonra doğrudan ebeveynlerinin trolup olmadığını ve sonra ait olup olmadıklarını kontrol edecektir .mytable. Eğer gerçekten "n'inci" kullanmak istiyorsanız o zaman böyle bir şey muhtemelen çok daha iyi olacak: .mytable th:nth-of-type(1) {width: 15%}; .mytable th:nth-of-type(2) {width: 70%};. Bu durumda üçüncü sütun genişliğini belirtmeye de gerek yoktur.
tomasz86

Şahsen ben sınıfları ya da sadece kullanırdım .mytable th+th{width: 70%}.mytable th+th+th{width:15%}. "N." Seçicilerin kendileri çok yararlı olabilir, ancak bu özel durumda (sadece 3 sütunlu küçük bir tablo) gerçekten gerekli değildir. Kullanırken table-layout: fixedbile sadece bunu yapabilirsiniz: table{table-layout:fixed}th:first-child+th{width:70%}.
tomasz86

Farkındayım. Ancak bu makaleler yıllardan beri ve bugün CSS seçicilerinin büyük miktarlarda görüntü ve JS kodu gibi daha büyük sorunları var.
DanMan

8

Bunlar benim iki önerim.

  1. Sınıfları kullanma. Tarayıcı tarafından her biri otomatik olarak% 15 olarak ayarlanacağı için diğer iki sütunun genişliğini belirtmeye gerek yoktur.

        table { table-layout: fixed; }
        .subject { width: 70%; }
        <table>
          <tr>
            <th>From</th>
            <th class="subject">Subject</th>
            <th>Date</th>
          </tr>
        </table>

  2. Sınıfları kullanmadan. Üç farklı yöntem ama sonuç aynı.

    a)

        table { table-layout: fixed; }
        th+th { width: 70%; }
        th+th+th { width: 15%; }
        <table>
          <tr>
            <th>From</th>
            <th>Subject</th>
            <th>Date</th>
          </tr>
        </table>

    b)

        table { table-layout: fixed; }
        th:nth-of-type(2) { width: 70%; }
        <table>
          <tr>
            <th>From</th>
            <th>Subject</th>
            <th>Date</th>
          </tr>
        </table>

    c) Bu benim favorim. B) ile aynıdır ancak daha iyi tarayıcı desteğine sahiptir.

        table { table-layout: fixed; }
        th:first-child+th { width: 70%; }
        <table>
          <tr>
            <th>From</th>
            <th>Subject</th>
            <th>Date</th>
          </tr>
        </table>


5

Vücudunuza (veya tablonuzu saran div'a) 'ayarlar' bağlı olarak bunu yapabilmeniz gerekir:

body {
  width: 98%;
}

table {
  width: 100%;
}


th {
  border: 1px solid black;
}


th.From, th.Date {
  width: 15%;
}

th.Date {
  width: 70%;
}


<table>
  <thead>
    <tr>
      <th class="From">From</th>
      <th class="Subject">Subject</th>
      <th class="Date">Date</th>
    </tr>
   </thead>
   <tbody>
     <tr>
       <td>Me</td>
       <td>Your question</td>
       <td>5/30/2009 2:41:40 AM UTC</td>
     </tr>
   </tbody>
</table>

gösteri


5

    table { table-layout: fixed; }
    .subject { width: 70%; }
    <table>
      <tr>
        <th>From</th>
        <th class="subject">Subject</th>
        <th>Date</th>
      </tr>
    </table>


4
<table>
  <col width="130">
  <col width="80">
  <tr>
    <th>Month</th>
    <th>Savings</th>
  </tr>
  <tr>
    <td>January</td>
    <td>$100</td>
  </tr>
  <tr>
    <td>February</td>
    <td>$80</td>
  </tr>
</table>

gösteri


8
Col width özelliği, HTML5'te desteklenmez.
Rune

4

Bunun yerine bunu deneyin.

<table style="width: 100%">
    <tr>
        <th style="width: 20%">
           column 1
        </th>
        <th style="width: 40%">
           column 2
        </th>
        <th style="width: 40%">
           column 3
        </th>
    </tr>
    <tr>
        <td style="width: 20%">
           value 1
        </td>
        <td style="width: 40%">
           value 2
        </td>
        <td style="width: 40%">
           value 3
        </td>
    </tr>
</table>

3

Border niteliğini kullanmayın, tüm stil ihtiyaçlarınız için CSS kullanın.

<table style="border:1px; width:100%;">
    <tr>
            <th style="width:15%;">From</th>
            <th style="width:70%;">Subject</th>
            <th style="width:15%;">Date</th>
    </tr>
... rest of the table code...
</table>

Ancak CSS'yi bu şekilde yerleştirmek zayıf bir uygulamadır - bunun yerine CSS sınıflarını kullanmalı ve CSS kurallarını harici bir CSS dosyasına koymalıdır.


1
Gönderilen örnek kodun ve yararlı yığın aktarma akışlılarının okunaklılık ve basitlik uğruna, satır içi stiller için bir teşvik olmadığından şüphelenirim.
Tass

2

Desteklemeyen eski tarayıcılarda :nth-childve benzeri seçicilerde bile çalışan CSS'de yapmanın başka bir minimum yolu : http://jsfiddle.net/3wZWt/ .

HTML:

<table>
    <tr>
        <th>From</th>
        <th>Subject</th>
        <th>Date</th>
    </tr>
    <tr>
        <td>Dmitriy</td>
        <td>Learning CSS</td>
        <td>7/5/2014</td>
    </tr>
</table>

CSS:

table {
    border-collapse: collapse;
    width: 100%;
}

tr > * {
    border: 1px solid #000;
}

tr > th + th {
    width: 70%;
}

tr > th + th + th {
    width: 15%;
}

2

Tablo etiketinizden sonra colgroup ekleyin. Sütun genişliğini ve sayısını burada tanımlayın. ve tbody etiketini ekleyin. Tr tbody içine koymak.

<table>
    <colgroup>
       <col span="1" style="width: 30%;">
       <col span="1" style="width: 70%;">
    </colgroup>


    <tbody>
        <tr>
            <td>First column</td>
            <td>Second column</td>
        </tr>
    </tbody>
</table>

-1
style="column-width:300px;white-space: normal;"

Merhaba - Stack Overflow'a hoş geldiniz. Genel olarak, metinle yanıtlar (sadece kod yerine) ve bazı açıklamalar yalnızca kodlu yanıtlardan daha iyi olarak görüntülenir. Bu soru daha eski olduğu ve başka birçok yanıtı olduğu için, gelecekteki cevaplarda size yol gösterebilir.
jwheron
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.