Une telle chose est-elle possible en utilisant CSS et deux balises DIV inline-block (ou autre) au lieu d'utiliser un tableau ?
La version tableau est la suivante (les bordures ont été ajoutées pour que vous puissiez la voir) :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head></head>
<body>
<table style="width:100%;">
<tr>
<td style="border:1px solid black;width:100px;height:10px;"></td>
<td style="border:1px solid black;height:10px;"></td>
</tr>
</table>
</body>
</html>
Il produit une colonne de gauche avec un LARGEUR FIXE (et non un pourcentage de largeur), et une colonne de droite qui s'étend pour remplir L'ESPACE RESTANT sur la ligne. Cela semble assez simple, n'est-ce pas ? De plus, comme rien n'est "flottant", la hauteur du conteneur parent s'étend correctement pour englober la hauteur du contenu.
--BEGIN RANT--
J'ai vu les implémentations "clear fix" et "holy grail" pour les mises en page multi-colonnes avec des colonnes latérales de largeur fixe, et elles sont nulles et compliquées. Elles inversent l'ordre des éléments, utilisent des largeurs en pourcentage, des marges flottantes ou négatives, et la relation entre les attributs "left", "right" et "margin" est complexe. En outre, les mises en page sont sensibles aux sous-pixels, de sorte que l'ajout d'un seul pixel de bordures, de rembourrage ou de marges brisera toute la mise en page et enverra des colonnes entières à la ligne suivante. Par exemple, les erreurs d'arrondi sont un problème même si vous essayez de faire quelque chose de simple, comme placer 4 éléments sur une ligne, la largeur de chacun étant fixée à 25 %.
--END RANT--
J'ai essayé d'utiliser "inline-block" et "white-space:nowrap ;", mais le problème est que je n'arrive pas à faire en sorte que le deuxième élément remplisse le champ "inline-block". restant espace sur la ligne. Définir la largeur avec quelque chose comme "width:100%-(LeftColumWidth)px" fonctionnera dans certains cas, mais effectuer un calcul dans une propriété de largeur n'est pas vraiment pris en charge.
1 votes
Je ne pense pas qu'il y ait une façon saine de procéder, si ce n'est en transformant cela en une
display: table-*
qui fonctionnera, mais qui n'est pas vraiment "plus sémantique" non plus (c'est un cas terrible dediv
soup) et rompt la compatibilité avec IE6. Personnellement, je m'en tiendrais à la version<table>
La Commission a donc décidé de mettre en place un système d'alerte précoce, à moins que quelqu'un ne parvienne à trouver une idée géniale et simple qui fonctionne sans que cela soit nécessaire.53 votes
Je n'arrête pas de tomber sur ces arguments "évitez les tableaux" datant de l'aube de l'ère CSS, et ils sont formulés de manière à vous faire passer pour un crétin incompétent et paresseux si vous continuez à utiliser des tableaux pour les mises en page. Une décennie plus tard, ce n'est toujours qu'un rêve idéaliste. Le fait est que la sémantique de la mise en page de flux craint pour les mises en page fixes mais flexibles telles que les interfaces utilisateur et les formulaires. La vérité, c'est que les personnes intelligentes utiliseront des tableaux lorsque cela est pratique, parce qu'elles ont épuisé toutes les solutions CSS possibles et se sont rendu compte qu'elles étaient toutes imparfaites et beaucoup plus complexes que l'utilisation d'un tableau.
4 votes
Flotteurs ? Montrez-moi un code qui fonctionne, où les éléments de fin de ligne ne s'enroulent pas de manière imprévisible et où les bordures et les marges n'interrompent pas la mise en page. C'est ce qui ne va pas. Par ailleurs, le conteneur parent de taille automatique s'étend-il correctement pour englober les éléments flottants sans les "clear fix hacks" ? Je ne pense pas que ce soit le cas.
0 votes
Si vous avez au moins un élément non flottant dans votre conteneur parent, ce n'est pas vraiment un "hack" d'effacer les flottants, n'est-ce pas ? N'oubliez pas que les feuilles de style CSS sont issues de l'imprimerie - voir css-tricks.com/containers-dont-clear-floats pour une bonne discussion sur les pourquoi vous ne bénéficiez pas d'une compensation automatique.
0 votes
Je n'aime pas la quantité de pleurnicheries dans votre question. J'ai fait quelque chose qui ressemble exactement à votre démo (sans utiliser aucune sorte de
table
) un peu facilement, mais je ne sais toujours pas ce que vous voulez réellement ; voulez-vous simplement une version de ce exactestable
code sanstable
ou vous cherchez quelque chose de plus ? Que se passe-t-il à l'intérieur des cellules ? Doivent-elles conserver la même hauteur ?0 votes
Css3 à la rescousse ! le nouveau module de mise en page flexible aidera, voir ma réponse ici pour un exemple : stackoverflow.com/questions/4433931/ . malheureusement, comme toujours, ce n'est pas possible avec internet explorer.
0 votes
@thirtydot : Voyons voir. J'aimerais analyser votre solution.
0 votes
@Chowlett. Il n'y a pas d'éléments non flottants dans mon conteneur. Il y a exactement DEUX DIVs. Une colonne gauche et une colonne droite. Je veux que la colonne de gauche ait une largeur fixe, et que la colonne de droite s'étende pour remplir le reste de la largeur de la ligne. De plus, je veux que la hauteur du conteneur parent s'étende pour englober les deux colonnes, afin qu'elles ne débordent pas. Les éléments flottants n'ont normalement pas de taille en ce qui concerne le conteneur parent, de sorte qu'ils débordent, à moins que le "débordement" du parent ne soit autre chose que visible, ce qui devra probablement être "caché" pour que les barres de défilement n'apparaissent pas.
0 votes
@thirtydot : Pour être clair. Un DIV conteneur avec n'importe quelle largeur (fixe/parcent/peu importe tant qu'il a une certaine largeur). Deux DIVs enfants formant des colonnes côte à côte. La DIV de gauche a une LARGEUR DE PIXEL FIXE, une hauteur variable. Le DIV de droite est également de hauteur variable, mais sa largeur s'étend pour remplir la largeur restante du conteneur. Les colonnes ne seront pas de la même taille et devront s'étendre (en hauteur) pour s'adapter à ce que je veux y mettre. Le conteneur DIV doit s'étendre en hauteur pour s'adapter aux colonnes (les plus grandes). BTW, les jérémiades sont nécessaires pour décrire des solutions qui sont insuffisantes et instables.
3 votes
@Triynko : C'est ce que j'ai fait plus tôt : jsfiddle.net/thirtydot/qx32C - Je pense qu'il répond à la plupart des points que vous avez soulevés. J'écouterai vos critiques sur la démo que j'ai faite, et j'essaierai de la corriger par la suite.
0 votes
@thirtydot : Merci, c'est la solution que je vois. C'est simple, ça marche, ça répond à toutes les exigences. Si vous l'affichez comme réponse, je la marquerai comme telle. Voir aussi la même solution ici : stackoverflow.com/questions/3568262/
0 votes
Bon sang de bonsoir. Si vous ajoutez overflow:hidden ou overflow:auto à la colonne de droite, elle réagit différemment dans Safari et Firefox. Safari semble refléter la marge de gauche sur la droite, ce qui fait que la colonne de droite apparaît centrée et écrasée, de sorte que la marge de droite est la même que celle de gauche. Firefox ne fait pas cela et laisse la colonne de droite de la même taille. De plus, lorsqu'un débordement est défini pour la colonne de droite, il répond, par exemple, à une marge droite sur la colonne de gauche flottante, alors que sans définir le débordement, une telle marge sur la colonne de gauche n'a pas d'effet sur la colonne de droite. L'incohérence est ASSEZ gênante.
0 votes
Et sans overflow:hidden, dans Safari, une partie du contenu de ma colonne de droite est forcée sous la colonne de gauche... mais pas tout ! Juste le deuxième ou troisième élément, sans raison apparente. Cela ne se produit pas sur Firefox.
0 votes
Vous avez parlé d'espace blanc, mais cela fonctionne avec un tableau.
0 votes
Si seulement le HTML était archivé et qu'un nouveau langage était inventé pour le Web 2.0 ...