Warum display:table-cell nicht-center-Inhalte ohne display:table?
Ich bin auf der Suche nach der effizientesten (oder eleganter) Weg, um vertikal-und horizontal-center-Inhalte von variabler Höhe. Ich kam mit dieser: http://cssdeck.com/t/2veysdkg/16, die mit css-Tabellen vertikal zentrieren Sie die wichtigsten Inhalte.
Meine Anforderungen für das schreiben dieses Besondere Stück code:
- Werden können, muss das center variable und fixe Breite-Inhalte vertikal und horizontal
- Zentriert-Inhalt muss in den normalen Belegfluss (also nicht überlappend)
- Sticky footer und normalen header, beide 100% width
- Als paar hacks, hässlich-code oder nicht-semantisches html als möglich
- Ich didn 'T Pflege über die Unterstützung für IE6, IE7 (ich' ll verwenden Sie ein anderes stylesheet)
Komisch ist, dass die oben genannten Anforderungen sind nur erfüllt, wenn die Kopf-und Fußzeile festgelegt display:table-row
, und der body-tag zu display:table
. Das ist komisch, weil wie ich es verstehe, css generieren anonyme Tische Elemente bei der parent-Tabelle Elemente fehlen. So display:table-cell
funktionieren sollte, ohne alle umliegenden Elemente, aber noch habe ich nicht in der Lage gewesen, es zu schaffen.
Wenn es nach mir geht würde ich lieber nicht Durcheinander mit den display-Modus für das body-tag, und lassen Sie die Kopf-und Fußzeile auf display:block
. Aber ich habe nicht in der Lage gewesen, es zu schaffen. Hat jemand verstehen, warum das nicht funktioniert, und wie erfüllen die oben genannten Anforderungen ohne die Verwendung von display:table
und display:table-row
?
Für diejenigen, die lieber nicht besuchen cssdeck zu meiner sourcecode werde ich es hier posten:
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;
}
natürlich habe ich es auf die Frage (ein Arbeits - /Bearbeitbare Beispiel finden Sie hier: cssdeck.com/t/2veysdkg/16).
InformationsquelleAutor | 2012-06-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Tatsächlich, den browser ist einfügen ein anonymes table-element wie erwartet. Jedoch, dieses element ist nur vorhanden, um die Tabelle Semantik arbeiten. Gibt es nicht eine Möglichkeit, in CSS Ziel dieser anonymen block zu geben, die es 100% Breite und Höhe, die Ihr layout erfordert.
Benötigen Sie eine aktuelle element in Ihrem HTML zu handeln, wie die "table" - Objekt, wenn Sie ändern möchten Ihre Präsentation.
Würde ich nicht. Wenn Sie möchten, dass die ganze Seite verwenden Sie die Tabellen-layout-Algorithmus, dann gibt es kein problem geben
display:table;
zu denbody
element. Wenn Sie nicht wollen, zu behandeln, den Körper besonders dann, ich würde noch ein container-element, und geben Sie die Tabellen-layout. Denken Sie daran, das Problem hier ist, dass Sie anwenden möchten, und extra styling zu einem ansonsten anonymen element, so dass Sie haben, um ihm etwas zu verweisen. Obwohl Sie nicht möchten, um Elemente hinzufügen, dies ist akzeptabel, da hier die Elemente' layouts müssen aufeinander bezogen werden, Sie sind nicht standalone.Vielen Dank, das ist die erste klare, artikulieren Antwort, die bezieht sich auf das, was ich gefragt habe.
Übrigens, ich habe ein design mit einem extra-container-mit-Tisch-layout, wie von Ihnen angegeben. Angesichts dieses design (mit einer extra unsemantic div für das Tisch-layout), und das original (das gilt für den Tisch layout für den Körper), was würden Sie bevorzugen? (Sie finden die designs hier: cssdeck.com/t/2veysdkg/16 (original) und cssdeck.com/t/2veysdkg/51 (extra-container mit Tabellen-layout)
InformationsquelleAutor Gareth
Wie Funktioniert display-Eigenschaft Arbeiten?
Display-Eigenschaft können Sie angeben, eine Reihe von Tisch-bezogenen Werte in Ordnung, um Elemente anzuzeigen, als ob Sie die Tisch-Elemente. Die verfügbaren Werte angezeigt werden:
table
macht das element verhält sich wie ein table-elementtable-row
macht das element verhält sich wie eine Tabellenzeile (tr) elementtable-cell
macht das element verhält sich wie eine Tabellenzelle (td) elementtable-row-group
macht das element sich Verhalten wie eine Tabelle, Körper, Reihe, Gruppe(tbody) element
table-header-group
macht das element sich Verhalten wie eine Tabelle, KopfzeileGruppe (thead) element
table-footer-group
macht das element verhält sich wie eine Tabelle FußzeileGruppe (tfoot) element
table-caption
macht das element sich Verhalten wie eine Tabelle, caption-elementtable-column
macht das element verhält sich wie eine Tabellenspalte (col)element
table-column-group
macht das element sich Verhalten wie eine Tabelle, Spalte, Gruppe(colgroup) element
überprüfen Sie die vollständige Liste hier... http://www.digital-web.com/articles/everything_you_know_about_CSS_Is_wrong/
aber dein Problem kann gelöst werden, wie dies
Check arbeiten fiddle http://jsfiddle.net/jZJXf/1/
Css sollte das so sein.
überprüfen Sie diese. jsfiddle.net/jZJXf/2
Es sieht alles richtig in jsfiddle, aber check it out hier: cssdeck.com/t/2veysdkg/48, die Fußzeile ist fast in der Mitte des Bildschirms. Ihre Margen auf #horizontale Art center das element, aber dies funktioniert nicht für jede Auflösung (in der Tat, es nicht für Grube).
Entfernen Sie die oberen und unteren Ränder und das layout zerstört. Also, im moment, diese immer noch nicht lösen mein layout-problem, wie der ursprüngliche code wird die vertikale Zentrierung besser, haben einen sticky footer und weniger display:table-tags. Umformulieren meine ursprüngliche Frage, was ich Suche, ist: kann man verbessern auf meinen code, ohne dabei die Funktionalität oder zusätzliche Komplexität?
check-in cssdesk cssdeck.com/t/2veysdkg/49
InformationsquelleAutor CSS Guy
Diese Arbeit für mich (CSS):
InformationsquelleAutor HEDMON
Dein problem ist das layout. Sie brauchen eine öffnung, div, zeigt die Tabelle. Dann innerhalb der nächsten ein div, zeigt Tabelle Zeile. Innerhalb der es gibt Sie neben Ihrer Zelle der Tabelle divs.
Werden sollte, dass das layout des divs.
CSS wie folgt.
Natürlich fügen Sie die Inhalte, die Sie wollen, um die divs und die zusätzliche Formatierung des CSS. Diese Gliederung soll helfen, die als Leitlinie obwohl. Wenn Sie eine visuelle Referenz überprüfen Sie diese Seite aus. http://www.quirksmode.org/css/display.html
Auch sollte es nicht notwendig sein, erstellen Sie die Tabelle und Tabelle-row-Elemente für die Einbindung der Tabellen-Zelle, im Gegensatz zu html-Tabellen mit css-Tabellen soll der browser Rendern eine anonyme Tabelle automatisch, wenn jede Tabelle Elemente fehlen in der Hierarchie (siehe: digital-web.com/articles/everything_you_know_about_CSS_Is_wrong).
Wie sieht das aus? Nahm so viel wie ich konnte, ohne drastisch ändern Sie das layout. cssdeck.com/t/2veysdkg/20 EDIT Im nicht sicher, wenn Sie benötigt, um die vertikale div oder nicht. Wenn dem so ist, können Sie fügen Sie es wieder mit einigen leichten Anpassungen. Wenn es nötig ist, lass es mich wissen und ich werde versuchen, um das Spiel wieder mit ihm. EDIT2 Es scheint, wenn Sie brauchen, vertikal Sie können die div-zurück in der und für die css-nehmen Sie nur die display: table-row; Linie und es wird noch ein format richtig
Es sieht ok, aber mein problem mit der absoluten Positionierung der Kopf-und Fußzeile ist, dass dauert es Sie aus dem Belegfluss, so dass Sie überlappen andere Inhalte. Auch die relative Positionierung der zentrierten element von % bedeutet, dass es nicht immer perfekt zentriert ist (nur bei bestimmten screenwidths/Höhen). Was ich Suche ist eine Lösung, bei der die ursprünglichen Eigenschaften von mein design, aber ohne den table und table-cell display-Eigenschaften.
eine Letzte änderung. Klar, dass der footer unter den unteren Rand des browser-Fensters, nicht der unten auf der Seite, was bedeutet, dass, wenn Sie brauchen, zu Blättern, dann ist die Fußzeile wäre in der Mitte der Seite. Dies behebt das problem cssdeck.com/t/2veysdkg/27
InformationsquelleAutor Tony318
Meiner Meinung nach, das problem ist das % Höhe /Breite auf Ihre div. Naja, das problem nicht unbedingt, aber der Grund, warum Sie sich nicht immer die erwarteten Ergebnisse.
Ähnlich wie eine html-Tabelle, die "display: table-cell" - element muss sein, eingeschlossen in eine Tabelle und Zeile.
Wenn keiner gefunden wird, wird eine anonyme Tabelle und Zeile in der Tabelle angelegt werden (was bei deinem code). Nun, das problem ist, dass die anonyme Tabelle wird auf auto-shrink die Inhalte.
Darüber hinaus ist jeder Versuch, die Größe des Inhalts wird ignoriert, wenn es unverständlich. Sie Gaben eine Höhe /Breite auf den Inhalt, aber Sie sind jetzt erzählen Sie Ihre table-cell zu nehmen 100% der anonymen Tabelle, das macht keinen Sinn, den browser.
Im Grunde der Grund, warum Sie brauchen die Tabelle soll dabei helfen, den browser intelligent bestimmen Sie die Dimensionen der Fläche. Sie nicht haben, um es auf den Körper obwohl.
Ich persönlich würde nicht zulassen, dass die Körper wirken wie in der Tabelle. Ich denke, Sie bekommen konnte Weg mit, wie es ist, wenn Sie verwendet Pixel statt Prozent, aber ansonsten würde ich ein div vertikal zu handeln, wie die Eltern und setzen die % Höhe / Breite auf, und nehmen Sie es aus der vertikalen.
Aber das würde bedeuten, dass ich konnte nicht legen Sie die Höhe auf 100%, denn das würde schieben Sie die Fußzeile aus dem browser-viewport. Wie würden Sie das lösen?
Das ist schon ein problem mit der Art, wie es jetzt ist. Sie können nicht 100% von 100% + 2em + 2em. Wenn Sie wollen, dass es zu flüssig wäre, würde ich alle %, und verwenden Sie ein min-height, min-width-Deklaration. Die andere option könnte sein, die stellen-und Fußzeile in vertikaler als Geschwister, horizontal. Sie können noch die position, die Sie auf oben / unten.
Ich habe bei footer und header in einem wrapper als Geschwister zu den Haupt-content-Bereich: cssdeck.com/t/2veysdkg/46, wie pro Ihre Anregung. Wo würden Sie
display:table-cell
vertikal ausrichten des Haupt-content-Bereich, und wie würden Sie dehnen die gesamte Höhe auf 100%?InformationsquelleAutor MikeCruz13
Versuchen mit Ihr html mit der css, ich bin mir nicht sicher über die 10% oberen,unteren Rand, aber es funktionierte con css-deck.
InformationsquelleAutor Ateszki
Etwas, was ich mir ausgedacht habe mich (erfüllt die design - /code-Anforderungen, und fügt nur ein wenig zusätzliche Komplexität/unsemantic html).
Check it out hier: http://cssdeck.com/t/2veysdkg/51.
HTML
CSS
InformationsquelleAutor