146 votes

Un DIV à l'intérieur d'un TD est-il une mauvaise idée ?

Il me semble avoir entendu/lu quelque part qu'une <div> à l'intérieur d'un <td> était un non-non. Ce n'est pas que ça ne marchera pas, c'est juste qu'ils ne sont pas vraiment compatibles en fonction de leur type d'affichage. Je n'ai trouvé aucune preuve pour étayer mon intuition, je peux donc me tromper complètement.

150voto

Guffa Points 308133

Utilisation d'un div instiller un td n'est pas pire que toute autre façon d'utiliser les tableaux pour la mise en page. (Certaines personnes n'utilisent jamais les tableaux pour la mise en page cependant, et il se trouve que je suis l'une d'entre elles).

Si vous utilisez un div dans un td vous vous retrouverez cependant dans une situation où il peut être difficile de prévoir la taille des éléments. La valeur par défaut d'un div est de déterminer sa largeur à partir de son parent, et la valeur par défaut d'une cellule de tableau est de déterminer sa taille en fonction de la taille de son contenu.

Les règles concernant la manière dont un div doit être dimensionnée est bien définie dans les normes, mais les règles concernant la manière dont une td n'est pas aussi bien définie, de sorte que les différents navigateurs utilisent des algorithmes légèrement différents.

0 votes

Je pense que c'est de là que vient mon intuition. Merci de l'avoir éclairci.

9 votes

Si vos colonnes ont une largeur prédéfinie, cela ne devrait pas poser de problème. N'oubliez pas de définir table-layout:fixed sur la table afin que les navigateurs ne remplacent pas vos largeurs (ce qui pourrait causer des problèmes).

7 votes

Il n'a jamais dit qu'il utilisait des tableaux pour la mise en page.

78voto

Martin Liversage Points 43712

Après avoir vérifié le DTD XHTML I discovered that a <TD>-element is allowed to contain block elements like headings, lists and also <DIV>-elements. Ainsi, l'utilisation d'un élément <DIV> à l'intérieur d'un élément <TD> ne viole pas la norme XHTML. Je suis à peu près sûr que d'autres variantes modernes du HTML ont un modèle de contenu équivalent pour l'élément <TD>.

Voici les règles pertinentes de la 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">

1 votes

C'est la réponse spécifique que je cherchais. Je vous remercie donc chaleureusement. J'imagine que je dormirai un peu mieux ce soir.

0 votes

La seule réponse soutenue par le pec.

0 votes

Veuillez nous dire où la DTD explique cela. Ce n'est pas un document facile à lire. Merci !

39voto

Jonathan Sampson Points 121800

Non. Pas nécessairement.

Si vous devez placer un DIV à l'intérieur d'un TD, assurez-vous que vous utilisez le TD correctement. Si vous ne vous souciez pas des données tabulaires et de la sémantique, alors vous ne vous soucierez pas des DIV dans les TD. Je ne pense pas qu'il y ait de problème - si vous ont pour le faire, tu es bien.

Selon la spécification HTML

A <div> peut être placé là où contenu du flux est attendu 1 qui est le <td> modèle de contenu 2 .

2 votes

J'ai toujours voulu répondre à une question par un oui ou un non ;)

0 votes

+1 - je voulais vraiment répondre avec quelque chose de plus spirituel, mais j'ai échoué.

0 votes

Même si cette proposition a obtenu plus de votes positifs, je pense que Guffa a soulevé un point qui n'est pas abordé ici (et qui est peut-être à l'origine de mon intuition).

14voto

David Thomas Points 111253

Une cellule de tableau peut légitimement contenir des éléments de niveau bloc, ce n'est donc pas, en soi, un faux-pas. L'implémentation du navigateur, bien sûr, laisse cette position spéculative-théorique. Elle peut causer des problèmes de mise en page et des bogues.

Toutefois, comme les tableaux étaient utilisés pour la mise en page - et le sont parfois encore - j'imagine que la plupart des navigateurs afficheront le contenu correctement. Même IE.

0 votes

Je pense que l'implémentation du navigateur est à l'origine de mon "attendez, c'est une mauvaise idée".

13voto

zeel Points 565

Si vous voulez utiliser position : absolute ; sur le div avec position: relative; sur le td vous allez rencontrer des problèmes. FF, safari et chrome (mac, mais pas PC) ne positionneront pas le div par rapport au td (comme vous l'auriez souhaité). display: table-whatever; donc si vous voulez faire cela vous avez besoin de deux divs, un pour le conteneur width: 100%; height: 100%; et sans bordure, de sorte qu'il remplit le td sans aucun impact visuel. et ensuite l'absolu.

à part ça, pourquoi ne pas simplement diviser la cellule ?

6 votes

La seule réponse pratique, sans guerre sainte.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X