103 votes

Pouvez-vous faire cette mise en page HTML sans utiliser de tableaux ?

Ok, j'ai eu une mise en page simple problème a une ou deux semaines. À savoir les sections d'une page a besoin d'un en-tête:

+---------------------------------------------------------+
| Title                                            Button |
+---------------------------------------------------------+

Assez simple. Chose est le tableau de la haine semble avoir pris le dessus dans le monde du Web, qui m'a rappelé quand j'ai demandé Pourquoi utiliser des listes de définitions (DL,DD,DT) des balises pour les formulaires HTML au lieu de tables? Maintenant, sur le thème général de tables vs vrd/CSS a déjà été discuté, par exemple:

Donc, ce n'est pas destiné à être une discussion générale à propos de CSS vs tableaux de mise en page. C'est tout simplement la solution à un problème. J'ai essayé différentes solutions à l'aide de CSS, y compris:

  • Flotteur à droite du bouton ou un div contenant le bouton;
  • La Position relative pour le bouton; et
  • La Position relative de+absolue.

Aucune de ces solutions n'étaient satisfaisants pour des raisons différentes. Par exemple, le positionnement relatif a entraîné un z-index problème où mon menu déroulant, est apparu dans le contenu.

J'ai donc fini par retourner à:

<style type="text/css">
.group-header { background-color: yellow; width: 100%; }
.group-header td { padding: 8px; }
.group-title { text-align: left; font-weight: bold; }
.group-buttons { text-align: right; }
</style>
<table class="group-header">
<tr>
  <td class="group-title">Title</td>
  <td class="group-buttons"><input type="button" name="Button"></td>
</tr>
</table>

Et il fonctionne parfaitement. C'est simple, en tant que descendante de compatibile qu'il obtient (qui fonctionnent probablement même sur IE5) et il fonctionne, tout simplement. Pas vous embêter avec le positionnement ou de flotteurs.

Si quelqu'un peut faire l'équivalent, sans tables?

Les exigences sont les suivantes:

  • Compatible: pour FF2 et IE6;
  • Raisonnablement cohérent: à travers les différents navigateurs;
  • Centrée verticalement: le bouton et le titre sont de tailles différentes; et
  • Flexible: permettent raisonnablement d'un contrôle précis sur le positionnement (de remplissage et/ou de la marge) et le style.

Sur une note de côté, je suis tombé sur quelques articles intéressants aujourd'hui:

EDIT: Permettez-moi d'insister sur le flotteur question. Ce type d'œuvres:

<html>
  <head>
    <title>Layout</title>
    <style type="text/css">
      .group-header, .group-content { width: 500px; margin: 0 auto; }
      .group-header { border: 1px solid red; background: yellow; overflow: hidden; }
      .group-content { border: 1px solid black; background: #DDD; }
      .group-title { float: left; padding: 8px; }
      .group-buttons { float: right; padding: 8px; }
    </style>
  </head>
  <body>
    <div class="group-header">
      <div class="group-title">This is my title</div>
      <div class="group-buttons"><input type="button" value="Collapse"></div>
    </div>
    <div class="group-content">
      <p>And it works perfectly. It's simple, as backward compatibile as it gets (that'll work probably even on IE5) and it just works. No messing about with positioning or floats.</p>
      <p>So can anyone do the equivalent without tables that is backwards compatible to at least FF2 and IE6?</p>
      <p>On a side note, I came across a couple of interesting articles today:</p>
    </div>
  </body>
</html>

Grâce à Ant P pour l' overflow: hidden partie (ne comprends toujours pas pourquoi). C'est ici que le problème vient de. Dire que je veux le titre et le bouton pour être centrée verticalement. C'est problématique parce que les éléments sont de hauteur différente. Comparez cela à:

<html>
  <head>
    <title>Layout</title>
    <style type="text/css">
      .group-header, .group-content { width: 500px; margin: 0 auto; }
      .group-header { border: 1px solid red; background: yellow; overflow: hidden; }
      .group-content { border: 1px solid black; background: #DDD; }
      .group-header td { vertical-align: middle; }
      .group-title { padding: 8px; }
      .group-buttons { text-align: right; }
    </style>
  </head>
  <body>
    <table class="group-header">
    <tr>
      <td class="group-title">This is my title</td>
      <td class="group-buttons"><input type="button" value="Collapse"></td>
    </tr>
    </table>
    <div class="group-content">
      <p>And it works perfectly. It's simple, as backward compatibile as it gets (that'll work probably even on IE5) and it just works. No messing about with positioning or floats.</p>
      <p>So can anyone do the equivalent without tables that is backwards compatible to at least FF2 and IE6?</p>
      <p>On a side note, I came across a couple of interesting articles today:</p>
    </div>
  </body>
</html>

ce qui fonctionne parfaitement.

51voto

Gregor Brandt Points 5645

Il n’y a rien de mal à utiliser les outils qui sont offrent à vous pour faire le travail rapidement et correctement.

Dans ce cas, une table a fonctionné parfaitement.

J’ai personnellement aurait utilisé une table pour cela.

Je pense que les tables imbriquées sont à proscrire, choses peuvent être gênant.

28voto

Milan Babuškov Points 20423

Juste flotter à gauche et à droite et set pour effacer à la fois et vous avez terminé. Pas besoin de tableaux.

Edit: je sais que j'ai eu beaucoup de upvotes pour cela, et j'ai cru que j'étais en droit. Mais il ya des cas où vous avez simplement besoin d'avoir des tables. Vous pouvez essayer de faire tout avec CSS et il va fonctionner dans les navigateurs modernes, mais si vous souhaitez soutenir les plus âgés... de ne Pas me répéter, voici la relative débordement de pile de thread et coup de gueule sur mon blog.

Edit2: Depuis les navigateurs plus anciens ne sont pas intéressants plus, je suis en utilisant Twitter bootstrap pour de nouveaux projets. Il est idéal pour la plupart des besoins de mise en page et l'utilisation de CSS.

17voto

AmbroseChapel Points 4971

C'est le genre de question piège: il ressemble terriblement simple jusqu'à ce que vous obtenez à

Dire que je veux le titre et le bouton pour être centrée verticalement.

Je tiens à préciser que oui, à la verticale de centrage est difficile dans le CSS. Quand les gens post, et il semble sans fin, et le "pouvez-vous faire X en CSS", la réponse est presque toujours "oui" et leur whinging semble pas justifiée. Dans ce cas, oui, que d'une chose en particulier est difficile.

Quelqu'un doit il suffit d'éditer l'ensemble de la question "est à la verticale de centrage problématique dans le CSS?".

17voto

flussence Points 5870

Flotteur titre bouton flottant à droite, à gauche, et (ici est la partie que je ne savais pas jusqu'à une date récente) - rendre le contenant de ces deux `` .

Qui devrait éviter le problème de z-index, de toute façon. Si cela ne fonctionne pas et que vous vraiment besoin du soutien de IE5, allez-y et utiliser la table.

7voto

Andrew Vit Points 10630

En pur CSS, une réponse sera un jour à l'utiliser "display:table-cell". Malheureusement, cela ne fonctionne pas au-delà de grade navigateurs, donc pour tout ce que vous pourriez aussi bien utiliser une table si vous voulez juste pour obtenir le même résultat, de toute façon. Au moins, vous pourrez être sûr qu'il fonctionne assez loin dans le passé.

Honnêtement, il suffit d'utiliser une table si c'est plus facile. Il ne fera pas de mal.

Si la sémantique et l'accessibilité de l'élément de tableau vraiment d'importance pour vous, il y a un projet de travail pour faire de votre table de non-sémantique:

http://www.w3.org/TR/wai-aria/#presentation

Je pense que cela nécessite un DTD-delà de XHTML 1.1, ce qui pourrait attiser l'ensemble de l' text/html vs application/xml débat, afin de ne pas laisser y aller.

Alors, à vos suspens CSS problème...

Pour aligner verticalement les deux éléments sur leur centre: il peut être fait de différentes façons, avec certains obtus CSS hackery.

Si vous pouvez l'intégrer dans les contraintes suivantes, alors il existe un moyen relativement simple:

  • La hauteur des deux éléments est fixe.
  • La hauteur du conteneur est fixe.
  • Les éléments seront assez étroit pour ne pas se chevaucher (ou peut être réglé à une longueur fixe).

Ensuite, vous pouvez utiliser le positionnement absolu avec des marges négatives:

.group-header { height: 50px; position: relative; }
.group-title, .group-buttons { position: absolute; top: 50%; }
# Assuming the height of .group-title is a known 34px
.group-title { left: 0; margin-top: -17px; }
# Assuming the height of .group-buttons is a known 38px
.group-buttons { right: 0; margin-top: -19px; }

Mais c'est inutile dans la plupart des situations... Si vous connaissez déjà la hauteur des éléments, vous pouvez simplement utiliser des flotteurs et ajouter assez de marge pour se positionner en tant que de besoin.

Voici une autre méthode qui utilise le texte de référence pour aligner verticalement les deux colonnes en ligne blocs. L'inconvénient ici est que vous devez définir des largeurs fixes pour les colonnes à remplir la largeur de la bordure gauche. Parce que nous avons besoin pour maintenir les éléments verrouillés à un texte de base, nous ne pouvons pas utiliser float:right pour la deuxième colonne. (Au lieu de cela, nous avons à faire à la première colonne, assez large pour pousser plus.)

<html>
  <head>
    <title>Layout</title>
    <style type="text/css">
      .group-header, .group-content { width: 500px; margin: 0 auto; }
      .group-header { border: 1px solid red; background: yellow; }
      .valign { display: inline-block; vertical-align: middle; }
      .group-content { border: 1px solid black; background: #DDD; }
      .group-title { padding: 8px; width: 384px; }
      .group-buttons { padding: 8px; width: 84px; text-align: right; }
    </style>
    <!--[if lt IE 8]>
    <style type="text/css">
      .valign { display: inline; margin-top: -2px; padding-top: 1px; }
    </style>
    <![endif]-->
  </head>
  <body>
    <div class="group-header">
      <div class="valign">
        <div class="group-title">This is my title.</div>
      </div><!-- avoid whitespace between these! --><div class="valign">
        <div class="group-buttons"><input type="button" value="Collapse"></div>
      </div>
    </div>
    <div class="group-content">
      <p>And it works perfectly, but mind the hacks.</p>
    </div>
  </body>
</html>

Le code HTML: Nous ajouter .valign wrappers autour de chaque colonne. (Donnez-leur plus de "sémantique" nom si elle vous rend plus heureux.) Ces le besoin d'être gardé sans espace entre les deux, ou autre chose du texte, des places de les pousser dehors. (Je sais c'est nul, mais qu'est ce que vous obtenez pour être "pure" avec le texte et de le séparer de la couche de présentation... Ha!)

Le CSS: Nous utilisons vertical-align:middle d'aligner les blocs de la ligne de base du texte du groupe de l'en-tête de l'élément. Les différentes hauteurs de chaque bloc de rester centrée verticalement et de pousser à la hauteur de leur conteneur. Les largeurs des éléments doivent être calculés de manière à s'adapter à la largeur. Ici, ils sont de 400 et 100, moins leur remplissage horizontal.

L'IE correctifs: Internet Explorer n'affiche que inline-block pour en natif des éléments en ligne (p. ex. durée, pas de div). Mais, si l'on donne à la div hasLayout, puis l'afficher en ligne, il se comportera comme inline-block. La marge de réglage est de fixer un 1px écart en haut (essayez d'ajouter des couleurs d'arrière-plan à la .groupe-titre pour voir).

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