Uma DIV dentro de um TD é uma má ideia?

143

Parece que ouvi / li em algum lugar que um <div>interior de um <td>era um não-não. Não que isso não funcione, apenas algo sobre eles não serem realmente compatíveis com base no tipo de exibição. Não consigo encontrar nenhuma evidência para apoiar meu palpite, então posso estar totalmente errado.

jcollum
fonte

Respostas:

144

Usar um divinstide a tdnão é pior do que qualquer outra maneira de usar tabelas para o layout. No entanto, algumas pessoas nunca usam tabelas para layout, e eu sou uma delas.

Se você usar um divem um td, no entanto, entrará em uma situação em que pode ser difícil prever como os elementos serão dimensionados. O padrão para uma div é determinar sua largura a partir de seu pai, e o padrão para uma célula da tabela é determinar seu tamanho, dependendo do tamanho do seu conteúdo.

As regras de como uma divdimensão deve ser dimensionada estão bem definidas nos padrões, mas as regras de como a tddimensão deve ser dimensionada não são tão bem definidas; portanto, navegadores diferentes usam algoritmos ligeiramente diferentes.

Guffa
fonte
Eu suspeito que este é o lugar de onde veio meu palpite. Obrigado por esclarecê-lo.
jcollum
9
Se suas colunas tiverem uma largura pré-especificada, isso não deve ser um problema. Basta lembrar de set table-layout: fixed sobre a mesa para navegadores não substituir as larguras (potencialmente levando a problemas)
Jens Roland
6
Ele nunca disse que estava usando tabelas para layouts.
precisa
table-layout:fixedCSS @texelate não é o que você pensa que é. Reduz a quantidade de cálculos que os navegadores fazem ao renderizar tabelas calculando apenas o tamanho da primeira linha.
steveb
73

Depois de verificar o XHTML DTD , descobri que um elemento <TD> pode conter elementos de bloco, como cabeçalhos, listas e também elementos <DIV>. Portanto, o uso de um elemento <DIV> dentro de um elemento <TD> não viola o padrão XHTML. Tenho certeza de que outras variações modernas de HTML têm um modelo de conteúdo equivalente para o elemento <TD>.

Aqui estão as regras relevantes de DTD:

<!ELEMENT td %Flow;>
<!-- %Flow; mixes block and inline and is used for list items etc. -->
<!ENTITY %Flow "(#PCDATA | %block; | form | %inline; | %misc;>
<!ENTITY %block "p | %heading; | div | %lists; | %blocktext; | fieldset | table">
Martin Liversage
fonte
1
Esta é a resposta específica que eu estava procurando. Então, obrigado gentilmente. Eu imagino que vou dormir um pouco melhor esta noite.
3Dom
A única resposta apoiada pelo pec.
Peterchaula # 13/17
Compartilhe conosco onde, no DTD, isso explica isso. Não é um documento fácil de ler. Obrigado!
redolent
1
@redolent: adicionei as regras relevantes de DTD à minha resposta.
Martin Liversage
E as especificações HTML5 que não são XHTML?
esmaga
38

Não. Não necessariamente.

Se você precisar colocar um DIV dentro de um TD, verifique se está usando o TD corretamente. Se você não se importa com dados tabulares e semântica, em última análise, não se importa com DIVs em TDs. Eu acho que não há um problema - se você tiver que fazê-lo, você está bem.

De acordo com a especificação HTML

A <div>pode ser colocado onde o conteúdo do fluxo é esperado 1 , que é o <td>modelo de conteúdo 2 .

Sampson
fonte
2
Eu sempre quis responder a uma pergunta com um sim ou um não;)
Jani Hartikainen
+1 - realmente queria responder com algo mais inteligente, mas falhou.
karim79
Mesmo que isso tem mais upvotes Acho que Guffa trouxe um ponto que não é abordada aqui (e pode ser a fonte de meu palpite)
jcollum
14

Uma célula de tabela pode legitimamente conter elementos em nível de bloco, portanto, não é inerentemente um passo em falso. A implantação do navegador, é claro, deixa essa posição teórico-especulativa. Isso pode causar problemas e erros de layout.

Embora as tabelas tenham sido usadas para o layout - e algumas vezes ainda o sejam -, imagino que a maioria dos navegadores renderize o conteúdo corretamente. Até o IE.

David diz para restabelecer Monica
fonte
Eu suspeito que a implementação do navegador foi o local onde recebi minha "espera, é uma má idéia".
jcollum
13

Se você deseja usar a posição: absoluto; no div com position: relative;no td você terá problemas. FF, safari e chrome (mac, embora não seja PC) não posicionarão a div em relação ao td (como você esperaria). Isso também é válido para divs com, display: table-whatever;portanto, se você quiser fazer isso, precisará de duas divs, uma para o contêiner width: 100%; height: 100%;e sem borda, por isso preenche o td sem nenhum impacto visual. e então o absoluto.

diferente disso, por que não apenas dividir a célula?

Zeel
fonte
6
A resposta só prático, não-holywar
Antony Hatchkins
2

Eu enfrentei o problema colocando um <div>interior <td>.

Não consegui identificar a div usando document.getElementById()se eu colocar isso dentro de td. Mas lá fora, estava funcionando bem.

Himaja
fonte
1

Como todos mencionaram, pode não ser uma boa ideia para fins de layout. Cheguei a essa pergunta porque estava pensando o mesmo e só queria saber se seria um código válido.

Como é válido, você pode usá-lo para outros fins. Por exemplo, para o qual vou usá-lo é colocar algumas divs "CSSed" sofisticadas nas linhas da tabela e, em seguida, usar uma função rápida do jQuery para permitir que o usuário classifique as informações por preço, nome etc. A única tabela de layout que me dará é a "ordem vertical", mas controlarei a largura, altura, plano de fundo etc. das divs pelo CSS.

Juan Ignacio
fonte
0

Duas maneiras de lidar com isso

  1. colocar tag divdentrotbody
  2. colocar tag divdentrotr

Ambas as abordagens são válidas, se você observar a diferença: https://stackoverflow.com/a/23440419/2305243

Alan Dong
fonte
-4

Isso quebra a semântica , só isso. Funciona bem, mas pode haver leitores de tela ou algo no futuro que não gostará de processar seu HTML se você "quebrar a semântica".

Greg
fonte
13
@ Greg, por que quebra a semântica? Uma div é simplesmente uma divisão em nível de bloco ou subdivisão do conteúdo da página. Como tal, não é essencial e irrevogavelmente anti-semântico colocá-los dentro de uma célula da tabela.
David diz Reintegrar Monica
2
Tentei escrever várias respostas para você que justificassem minha resposta, mas continuava me referindo à opinião pessoal. : / Acho que minha melhor resposta seria que o que estiver no seu celular provavelmente possa ser melhor representado por outra tag HTML. Se você estiver realmente dividindo suas células em componentes, provavelmente não deve usar uma tabela para começar, estilizando uma série de DIVs para o seu layout. Não sei por que não posso colocar isso em palavras melhores ... suponho que seja IMHO, suponho.
Greg
Hmm, você quer dizer que um TD é semanticamente a mesma coisa que um DIV, por que ter dois deles seguidos?
jcollum
2
@jcollum: Não, eu não diria que eles são semanticamente iguais. TD é definitivamente uma célula em uma tabela; faz parte de uma estrutura conhecida: uma tabela possui linhas, uma linha possui células, as células contêm dados. O DIV é apenas um contêiner ... ele pode representar qualquer coisa a qualquer momento no documento - você precisa aplicar estilo a ele para obter semântica em termos de finalidade na marcação.
Greg
7
Uma DIV é semanticamente sem sentido, então não vejo como poderia estar incorreta.
Rex M