Pourquoi display:table-cell ne pas le contenu du centre sans display:table?

Je suis à la recherche de la plus efficace (ou élégant) à la verticale et à l'horizontale le contenu du centre de hauteur variable. J'ai trouvé ceci: http://cssdeck.com/t/2veysdkg/16, qui utilise des règles css à la verticale du centre de l'essentiel du contenu.

Mes demandes pour l'écriture de ce morceau de code:

  • Doit être en mesure de centre de variable et fixe la largeur du contenu verticalement et horizontalement
  • Centrée sur le contenu doit être à l'intérieur de la normale de la circulation des documents (donc pas de chevauchement)
  • Collant, pied de page et normal d'en-tête, à la fois de 100% de la largeur de
  • Que quelques hacks, laide du code ou de la non-sémantique html que possible
  • Je n'ai pas de soins sur la prise en charge pour IE6, IE7 (je vais utiliser une autre feuille de style pour eux)

La chose étrange est que les exigences ci-dessus ne sont remplies que lorsque l'en-tête et pied de page sont mis à display:table-row, et la balise "body" pour display:table. C'est bizarre parce que si je comprends bien le css va générer anonyme éléments de la table lors de la table parent éléments sont manquants. Donc display:table-cell devrait fonctionner sans tous les éléments environnants, mais pourtant, je n'ai pas été capable de le faire fonctionner.

Si ça ne tenait qu'à moi, je préfère ne pas salir avec le mode d'affichage de la balise body, et de laisser l'en-tête et pied de page sur display:block. Mais je n'ai pas été capable de le faire fonctionner. Personne ne comprends pourquoi cela ne fonctionne pas, et comment répondre aux exigences indiquées ci-dessus sans l'utilisation de display:table et display:table-row?

Pour ceux qui préfèrent ne pas visiter cssdeck pour afficher mon code source, je vais le poster ici:

HTML

<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Vertical Centering</title>
    </head>
    <body>
        <div id="header">header</div>
        <div id="vertical">
            <div id="horizontal">content</div>
        </div>
        <div id="footer">footer</div>
    </body>
</html>

CSS

body, html {
    height: 100%;
    width: 100%;
    margin: 0;
    padding: 0;
}

body {
    display: table;
}

#header {
    display: table-row;
    height: 2em;
    background: gray;
}

#vertical {
    display: table-cell;
    vertical-align: middle;
    width: 100%;
    height: 100%;
}

#horizontal {
    height: 500px;
    width: 500px;
    margin: auto;
    background: gray;
}

#footer {
    height: 2em;
    display: table-row;
    width: 100%;
    background: gray;
}
Pouvez-vous nous montrer le code html où vous sont effectivement avoir des problèmes?
bien sûr, je l'ai ajouté à la question (un/modifiable exemple peut être trouvé ici: cssdeck.com/t/2veysdkg/16).

OriginalL'auteur | 2012-06-08