Definindo a largura da coluna da tabela

204

Eu tenho uma tabela simples que é usada para uma caixa de entrada da seguinte maneira:

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

Como defino a largura para que De e Data sejam 15% da largura da página e o Assunto seja 70%. Também quero que a tabela ocupe toda a largura da página.

alamodey
fonte

Respostas:

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>

Gordon Gustafson
fonte
5
Como a limpeza desta solução. No entanto, feche a coluna, por exemplo, <col span = "1" style = "width: 15%;" /> ou <col span = "1" style = "width: 15%;"> </col>
lsu_guy
23
@Isu_guy você fecha apenas <col> ao usar XHTML - em HTML, a tag <col> não tem fechamento ... veja o link para obter mais informações. Em HTML5, <col> é um elemento vazio, o que significa que não devem ser fechadas
Matija Nalis
4
@Zulu de acordo com w3schools.com/tags/att_col_width.asp "O atributo <col> width não é suportado no HTML5."
Caltor
30
@Caltor: o código não está usando o <col> width attribute; está usando a CSS *style* width, que foi o que substituiu o atributo <col> width. (apesar das várias pessoas up-voto que o comentário !!)
ToolmakerSteve
4
span="1"é supérfluo, pois 1 é o padrão.
precisa saber é o seguinte
128

HTML:

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

CSS:

table {
  width: 100%;
  border: 1px solid #000;
}
th.from, th.date {
  width: 15%
}
th.subject {
  width: 70%; /* Not necessary, since only 70% width remains */
}

A melhor prática é manter seu HTML e CSS separados para menos duplicação de código e para separação de preocupações (HTML para estrutura e semântica e CSS para apresentação).

Observe que, para que isso funcione em versões mais antigas do Internet Explorer, você pode precisar fornecer uma largura específica à sua tabela (por exemplo, 900px). Esse navegador tem alguns problemas ao renderizar um elemento com dimensões percentuais se o seu invólucro não tiver dimensões exatas.

Ron DeVera
fonte
esta solução falhar se você tiver colspans na primeira linha
mark1234
3
Bom porque <col width = ""> está obsoleto no HTML5: developer.mozilla.org/en/docs/Web/HTML/Element/col
Richard
30

Use o CSS abaixo; a primeira declaração garantirá que sua tabela adere às larguras fornecidas (você precisará adicionar as classes em seu HTML):

table{
  table-layout:fixed;
}
th.from, th.date {
  width: 15%;
}
th.subject{
  width: 70%;
}
Pete
fonte
Na verdade, você só precisa especificar a largura das duas colunas. O terceiro será calculado automaticamente, o que table{table-layout:fixed};.from,.date{width:15%}é suficiente. A menos que as classes também sejam usadas em outros elementos, a escrita th.fromé redundante e pode ser reduzida para apenas .from.
tomasz86
14

Maneira alternativa com apenas uma classe, mantendo seus estilos em um arquivo CSS, que até funciona no IE7:

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

Mais recentemente, você também pode usar o nth-child()seletor de CSS3 (IE9 +), onde você colocaria o nr. da respectiva coluna entre parênteses, em vez de juntá-las ao seletor adjacente. Assim, por exemplo:

<style>
    .mytable tr > *:nth-child(1) { width:15%; }
    .mytable tr > *:nth-child(2) { width:70%; }
    .mytable tr > *:nth-child(3) { width:15%; }
</style>
DanMan
fonte
A :nth-childsolução proposta é horrível em termos de desempenho. Não há motivo válido para usá-lo (especialmente com o seletor universal) neste exemplo, onde há apenas três elementos ( thou col) para estilizar. Além disso, você só precisa definir a largura como thna primeira linha. O .mytable tdprimeiro exemplo é redundante.
tomasz86
"A solução proposta: enésimo filho é horrível em termos de desempenho". - citação necessária.
DanMan
Isso deve ser suficiente: Renderização eficiente de CSS . Com o uso do seletor universal, o navegador primeiro verifica TODOS os elementos se eles são o enésimo filho de outro elemento, se o pai direto é tre se pertencem .mytable. Se você realmente quiser usar "enésimo", então algo como isto provavelmente será muito melhor: .mytable th:nth-of-type(1) {width: 15%}; .mytable th:nth-of-type(2) {width: 70%};. Também não há necessidade de especificar a largura da terceira coluna neste caso.
tomasz86
Pessoalmente, eu usaria aulas ou apenas .mytable th+th{width: 70%}.mytable th+th+th{width:15%}. Os próprios "enésimos" seletores podem ser muito úteis, mas nesse caso em particular (uma pequena tabela com apenas 3 colunas) não é realmente necessária. Ao usar table-layout: fixedvocê mesmo pode fazer exatamente isso: table{table-layout:fixed}th:first-child+th{width:70%}.
tomasz86
Eu estou ciente disso. Mas esses artigos são de anos atrás e hoje existem problemas maiores que os seletores de CSS, como grandes quantidades de imagens e código JS.
DanMan
8

Estas são minhas duas sugestões.

  1. Usando classes. Não há necessidade de especificar a largura das outras duas colunas, pois elas serão definidas para 15% cada uma automaticamente pelo navegador.

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

  2. Sem usar classes. Três métodos diferentes, mas o resultado é idêntico.

    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) Este é o meu favorito. O mesmo que b), mas com melhor suporte ao navegador.

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

tomasz86
fonte
5

Dependendo das configurações do seu corpo (ou da div que está envolvendo sua mesa), você poderá fazer isso:

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>

Demo

Boris Guéry
fonte
5

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

Hector David
fonte
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>

Demo

Srinivas Erukulla
fonte
8
O atributo de largura da coluna não é suportado no HTML5.
Rune
4

Tente isso em vez disso.

<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>
Milão
fonte
3

Não use o atributo border, use CSS para todas as suas necessidades de estilo.

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

Mas incorporar CSS dessa maneira é uma prática inadequada - deve-se usar classes CSS e colocar as regras CSS em um arquivo CSS externo.

Etienne Perot
fonte
1
Eu suspeitaria que o código de exemplo que o OP e os stackoverflowians úteis postaram foi por questão de legibilidade e simplicidade, de modo algum um incentivo para estilos inline.
Tass
2

Aqui está outra maneira mínima de fazer isso em CSS que funciona mesmo em navegadores mais antigos que não suportam :nth-childe seletores similares: 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%;
}
DRD
fonte
2

Adicione colgroup após a tag da tabela. Defina a largura e o número da coluna aqui. e adicione a tag tbody. Coloque seu tr dentro de tbody.

<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>
Abdus Salam Azad
fonte
0
style="column-width:300px;white-space: normal;"
Wut Worawit
fonte
Olá - bem-vindo ao Stack Overflow. Em geral, respostas com texto (em vez de apenas código) e alguma explicação são vistas como melhores do que apenas respostas apenas com código. Como essa pergunta é mais antiga e tem muitas outras respostas, elas podem ajudar a guiá-lo em respostas futuras.
jwheron