Largura igual da célula da tabela CSS

147

Eu tenho um número indeterminado de elementos de célula de tabela dentro de um contêiner de tabela.

<div style="display:table;">
  <div style="display:table-cell;"></div>
  <div style="display:table-cell;"></div>
</div>

Existe uma maneira CSS pura de obter que as células da tabela tenham largura igual, mesmo que tenham conteúdo de tamanho diferente?

Obrigado.

Edit: Ter uma largura máxima implicaria saber quantas células você tem, eu acho?

atormentar
fonte
Como é determinado o número de colunas: lado do cliente ou servidor?
Iambriansreed
Depois eu tentei alguns métodos, eu acho que se você quiser ter várias linhas e quero que eles de igual largura, flexbox uso em vez de mesa
Eric

Respostas:

298

Aqui está um violino que funciona com número indeterminado de células: http://jsfiddle.net/r9yrM/1/

Você pode fixar uma largura para cada pai div(a tabela ), caso contrário, será 100% como de costume.

O truque é usar table-layout: fixed;e alguma largura em cada célula para acioná-lo, aqui 2%. Isso acionará o outro algoritmo da tabela, aquele em que os navegadores tentam muito respeitar as dimensões indicadas.
Teste com o Chrome (e IE8, se necessário). Tudo bem com um Safari recente, mas não me lembro da compatibilidade desse truque com eles.

CSS (instruções relevantes):

div {
    display: table;
    width: 250px;
    table-layout: fixed;
}

div > div {
    display: table-cell;
    width: 2%; /* or 100% according to OP comment. See edit about Safari 6 below */
}

EDIT (2013): Cuidado com o Safari 6 no OS X, ele está table-layout: fixed; errado (ou talvez apenas diferente, muito diferente de outros navegadores. Não fiz a revisão do layout da tabela CSS2.1 REC;)). Esteja preparado para resultados diferentes.

FelipeAls
fonte
1
Obrigado, esta parece ser a resposta. Não sei por que, mas se eu definir a largura para 2%, na verdade, cada coluna será dividida em 2%. Mas 100% parece funcionar muito bem. Alguma idéia do que está acontecendo lá?
Harry
3
Eu tive o mesmo problema de precisar usar 100% de largura nas células da tabela. Isso estava acontecendo devido a um clearfix aplicado ao elemento pai com display: table. Como as células com largura de 100% não funcionam no IE8, a correção para mim foi remover o clearfix. Espero que isso ajude alguém.
Alex Barrett
Para expandir isso, funciona para layouts simples (1x1, 2x2, 3x3, etc), mas layouts complexos (1x3x1, 1x2x3x4, etc) exigem que divs adicionais display:tablesejam usados ​​como se fossem linhas, não display:tabl-rowcomo alguns podem esperar. Exemplo aqui .
Filoxo
2
A largura de 100% não funcionou no IE8 (surpresa), mas a sugestão inicial de 2% fornece os resultados corretos.
1
A largura de 100% também não funcionou no IE10. Ele fez trabalho no IE11. E 1% de largura fez com que o Mobile Safari mostre colunas super estreitas. Então eu acabei usando um hack CSS alvo IE9 e IE10: .my-cell { width: 100%; }; @media screen and (min-width:0\0) { .my-cell { width: 1%; } }O hack CSS é a partir daqui: stackoverflow.com/a/24321386/6962
Henrik N
29

HTML

<div class="table">
    <div class="table_cell">Cell-1</div>
    <div class="table_cell">Cell-2 Cell-2 Cell-2 Cell-2Cell-2 Cell-2</div>
    <div class="table_cell">Cell-3Cell-3 Cell-3Cell-3 Cell-3Cell-3</div>
    <div class="table_cell">Cell-4Cell-4Cell-4 Cell-4Cell-4Cell-4 Cell-4Cell-4Cell-4Cell-4</div>
</div>

CSS

.table{
    display:table;
    width:100%;
    table-layout:fixed;
}
.table_cell{
    display:table-cell;
    width:100px;
    border:solid black 1px;
}

DEMO.

The Alpha
fonte
O violino não funciona aqui. As células são sempre 25%.
netAction
Essa solução não é muito escalável para qualquer coisa dinâmica, como a navegação no site controlada pelo cliente.
Eric K
Provavelmente você está certo e, aliás, ele tem quase dois anos de idade @QuantumDynamix. Tem algo melhor em mente? Por que não apenas compartilhar a sua idéia, deixar o mundo saber coisas melhores :-)
O Alpha
15

Apenas usar max-width: 0o display: table-cellelemento funcionou para mim:

.table {
  display: table;
  width: 100%;
}

.table-cell {
  display: table-cell;
  max-width: 0px;
  border: 1px solid gray;
}
<div class="table">
  <div class="table-cell">short</div>
  <div class="table-cell">loooooong</div>
  <div class="table-cell">Veeeeeeery loooooong</div>
</div>

José Antonio Postigo
fonte
1
Apenas nitpicking aqui, mas 0pxnão é uma unidade válida. Deveria ser apenas 0.
Gavin
Isso funcionou para mim, mas você poderia explicar como isso funciona?
Emmanual
6

Substituir

  <div style="display:table;">
    <div style="display:table-cell;"></div>
    <div style="display:table-cell;"></div>
  </div>

com

  <table>
    <tr><td>content cell1</td></tr>
    <tr><td>content cell1</td></tr>
  </table>

Veja todos os problemas relacionados à tentativa de fazer com que os divs funcionem como tabelas. Eles tiveram que adicionar table-xxx para imitar layouts de tabela

As tabelas são suportadas e funcionam muito bem em todos os navegadores. Por que abandoná-los? o fato de que eles precisavam imitá-los é uma prova de que eles cumpriram bem o seu trabalho.

Na minha opinião, use a melhor ferramenta para o trabalho e, se você quiser dados tabulados ou algo parecido com tabelas de dados tabulados, basta trabalhar.

Resposta muito tardia, eu sei, mas vale a pena expressar.

DesenvolvedorChris
fonte
2
+1 porque funciona e porque CSS ainda, em 2014 não faz isso corretamente em todos os navegadores.
Yuck
6
Às vezes, você deseja um layout em forma de tabela para itens que não são dados tabulados. por exemplo, elementos de navegação que deve usar <nav>, <ul>etc.
Ben
1
Para responsivo, é ideal ter um layout baseado em div. Exibir tabelas em dispositivos móveis é um pé no saco.
Pablo Rincon
Tentar emular uma tabela impede o design responsivo. Concordo que se você deseja um design responsivo, as tabelas não são a escolha.
DeveloperChris
2
As tabelas foram criadas para exibir dados tabulares: eram, são e serão os elementos HTML a serem usados ​​para exibir dados tabulares, por que alguém os abandonaria (para esse fim)? O layout da tabela não é imitado : faz parte da recommandação CSS2 há algum tempo e acontece que o layout padrão das tabelas HTML é display: table-etc(naturalmente). Não passo meus dias criando links que imitam divs ou divs que imitam tabelas, extensões ou entradas: estou apenas usando CSS para estilizar. Finalmente, boa sorte com o IE9 por aplicar qualquer outro valor da displaypropriedade aos elementos table, tr, td.
FelipeAls 20/02
1

isso vai funcionar para todos

<table border="your val" cellspacing="your val" cellpadding="your val" role="grid" style="width=100%; table-layout=fixed">
<!-- set the table td element roll attr to gridcell -->
<tr>
<td roll="gridcell"></td>
</tr>
</table>

Isso também funcionará para dados da tabela criados pela iteração

tcasante1
fonte
0

Aqui está:

http://jsfiddle.net/damsarabi/gwAdA/

Você não pode usar width: 100px, porque a exibição é célula de tabela. No entanto, você pode usar Largura máxima: 100px. sua caixa nunca ficará maior que 100 px. mas você precisa adicionar overflow: hidden para garantir que o conteúdo não sangre para outras células. você também pode adicionar espaço em branco: nowrap se desejar impedir que a altura aumente.

Sammy
fonte
0

Isso pode ser feito configurando o estilo da célula da tabela como width: autoe o conteúdo vazio. As colunas agora têm a mesma largura, mas não contêm conteúdo.

Para inserir conteúdo na célula, adicione um divcom css:

position: absolute;
left: 0;
top: 0;
right: 0;
bottom: 0;

Você também precisa adicionar position: relativeàs células.

Agora você pode colocar o conteúdo real na div mencionada acima.

https://jsfiddle.net/vensdvvb/

RnMss
fonte