Usando CSS td largura absoluta, posição

103

Por favor, veja este JSFIDDLE

td.rhead { width: 300px; }

Por que a largura do CSS não funciona?

<table>
<thead>
<tr>
<td class="rhead">need 300px</td>
<td colspan="7">Week #0</td>
<td colspan="7">Week #1</td>
<!-- etc..-->
</tr>
<tr>
<td class="rhead"></td>
<td>S</td><td>M</td><td>T</td><td>W</td><td>T</td><td>F</td><td>S</td>
<td>S</td><td>M</td><td>T</td><td>W</td><td>T</td><td>F</td><td>S</td>
<!-- etc... -->
</tr>
<thead>
</table>

Além disso, quais são os efeitos da posição: fixo, absoluto, etc., têm nas larguras td, se houver? Estou procurando mais uma razão do que uma solução. Espero entender como funciona.

largura td não é 300px como desejado

Jake
fonte
display: table-cellnão respeita width(da mesma forma que não funcionaria para display: inline). Não entendo o que você está perguntandoposition fixed|absolute
Pílulas de explosão
@ExplosionPills porque no meu código atual, tenho a tabela definida como fixa. Como você pode imaginar, estou tentando obter uma linha do tempo no topo da página. Portanto, estou apenas afirmando caso o atributo de posição afeta as larguras.
Jake
possível duplicata da largura td da tabela CSS - fixa, não flexível
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Respostas:

144

Isso pode não ser o que você deseja ouvir, mas display: table-cellnão respeita a largura e será reduzido com base na largura de toda a mesa. Você pode contornar isso facilmente apenas tendo um display: blockelemento dentro da própria célula da tabela cuja largura você especifica, por exemplo

<td><div style="width: 300px;">wide</div></td>

Isso não deve fazer muita diferença se o <table>próprio for position: fixedou absoluto, porque a posição das células são todas estáticas em relação à tabela.

http://jsfiddle.net/ExplosionPIlls/Mkq8L/4/

EDIT: Eu não posso levar o crédito, mas como dizem os comentários, você pode simplesmente usar em min-widthvez de widthna célula da tabela.

Pílulas de explosão
fonte
31
+1 - Eu usei esta solução alternativa antes. Curiosamente, min-widthno TDparece funcionar no Chrome e FF: jsfiddle.net/Mkq8L/7
Tim Medora
2
Na verdade, como sempre, depois de postar a pergunta, descobri que min-width: 300pxfunciona! (@TimMedora você foi alguns segundos mais rápido!)
Jake
Acho que a melhor resposta é mencionar a exibição: comportamento da célula da tabela. Obrigado!
Jake
Esse comportamento faz sentido para mim: o que deve acontecer se você definir duas larguras diferentes para duas células na mesma coluna? Com min-widthnão há nenhum problema, porém, pegue o maior.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
3
Este é um hack, não o recomendo. A largura combinada do td está ultrapassando a largura da mesa. Este é o problema. Você não deve corrigir isso adicionando mais estruturas HTML.
David
28

Você está melhor usando table-layout: fixed

Auto é o valor padrão e com tabelas grandes pode causar um pouco de atraso no lado do cliente, pois o navegador itera por ele para verificar se todos os tamanhos se encaixam.

Fixed é muito melhor e renderiza mais rápido na página. A estrutura da tabela depende da largura geral da tabela e da largura de cada uma das colunas.

Aqui ele é aplicado ao exemplo original: JSFIDDLE , você notará que as colunas restantes são comprimidas e sobrepondo seu conteúdo. Podemos consertar isso com um pouco mais de CSS (tudo que tive que fazer foi adicionar uma classe ao primeiro TR):

    table {
        width: 100%;
        table-layout: fixed;
    }

    .header-row > td {
        width: 100px;
    }

    td.rhead {
        width: 300px
    }

Visto em ação aqui: JSFIDDLE

Hugo Yates
fonte
11

O motivo pelo qual isso não funciona no link fornecido é porque você está tentando exibir uma coluna de 300px MAIS 52 colunas com 7 colunas cada. Diminua o número de colunas e funciona. Você não pode caber tantos na tela.

Se você deseja forçar o ajuste das colunas, tente configurar:

body {min-width:4150px;}

veja meu jsfiddle: http://jsfiddle.net/Mkq8L/6/ @mike Não posso comentar ainda.

Matthew Brown
fonte
2
+1 para descobrir que o limite de largura da mesa aumenta com a largura do corpo.
Jake
8

A razão é porque você não especificou a largura da mesa e todo o seu conjunto de td's está transbordando.

Por exemplo , dei à mesa uma largura de 5.000 px, que achei que se encaixaria nos seus requisitos.

table{
    width:5000px;
}

É exatamente o mesmo código que você forneceu, que apenas adicionei na largura da tabela.

Eu acredito que o que está acontecendo é porque seus TDs ultrapassaram a largura padrão da mesa. O que você pode ver, se retirar cerca de 45 de seus td's em cada tr (ou seja, o código que você forneceu em sua pergunta, não o jsfiddle) funciona perfeitamente bem

He Hui
fonte
2
1 por mencionar que existe um limite de largura da mesa. O problema é que às vezes não sabemos a largura total de antemão. Qual é a largura padrão da tabela?
Jake
Na verdade, não sei. Tudo o que sei é que se você tiver muitas colunas, a tabela ficará comprimida, tornando todas as larguras dos nós filhos inúteis. Já encontrei isso antes, mas ainda não descobri o valor padrão. Talvez eu deva fazer uma pergunta.
He Hui
Creio que resolvi esse problema stackoverflow.com/questions/14767459/…
He Hui
Esta é a resposta real, em vez da bem avaliada. A largura só pode ser definida se o conteúdo não ultrapassar toda a largura da tabela.
David
5

Tente fazer isso funcionar.

<table>
<thead>
<tr>
<td width="300">need 300px</td>
Amirali Shahinpour
fonte
1
UAU! Obrigado ♥
ivahidmontazer
Adicione alguma explicação de por que / como este código ajuda o OP. Isso ajudará a fornecer uma resposta com a qual os futuros espectadores podem aprender. Veja esta questão Meta e suas respostas para mais informações.
Macaco herege
1
Observe que o atributo de largura de está obsoleto em HTML5.
simhumileco
5

Tente usar

table {
  table-layout: auto;
}

Se você usar Bootstrap, classe tabletem table-layout: fixed;por padrão.

sambrmg
fonte
4

Use a propriedade table-layout e o valor "fixo" em sua mesa.

table {
   table-layout: fixed;
   width: 300px; /* your desired width */
}

Após configurar toda a largura da mesa, agora você pode configurar a largura em% dos td's.

td:nth-child(1), td:nth-child(2) {
   width: 15%;  
}

Você pode aprender mais sobre em neste link: http://www.w3schools.com/cssref/pr_tab_table-layout.asp

Cyan Baltazar
fonte
3

Minha solução maluca.)

$(document).ready(function() {
    $("td").each(function(index) { 
    var htmlText = "<div style='width:300px;'>" + $(this).text() +"</div>";
    $(this).html(htmlText);
  });
});
mathewsun
fonte
2

Se a largura da tabela for, por exemplo, 100%, tente usar uma largura de porcentagem em td, como 20%.

Dally S
fonte
2

Envolva o conteúdo da primeira célula em div, por exemplo:

HTML:

<td><div class="rhead">a little space</div></td>

CSS:

.rhead {
  width: 300px;
}

Aqui está um jsfiddle .

simhumileco
fonte
1

Você também pode usar:

.rhead {
    width:300px;
}

mas isso só acontecerá com alguns navegadores, se bem me lembro o IE8 não permite isso. Acima de tudo, é mais seguro apenas colocar o width=""atributo no <td>próprio.

KernelCurry
fonte