Wenn Sie nur ein einzelnes Wort oder eine einzelne Textzeile haben, gibt es eine clevere Möglichkeit, es mit CSS vertikal in einem Block zu zentrieren. Sie setzen die Zeilenhöhe dieses Textes gleich der Höhe des Feldes. Funktioniert gut, ist aber ein großer Fehler, wenn dieser Text umgebrochen werden muss.
Eine „Sprechblase“ ist ein klassisches Beispiel dafür, wo wir Text sowohl horizontal als auch vertikal zentriert und anpassbar an mehrere Zeilen haben möchten. Dafür gibt es einen kleinen, ziemlich einfachen CSS-Trick mit CSS-Tabellen. Hier ist das Ergebnis

Demo anzeigen Dateien herunterladen
Das HTML ist nichts Besonderes. Die „Fläche“ ist nur der Bereich, mit dem wir es zu tun haben, wo wir position: relative; setzen können, damit wir den Text in der Sprechblase absolut positionieren können.
<div class="area">
<div class="bubble">
<p>To look best, text should really be centered inside this bubble both vertically and horizontally.</p>
</div>
</div>
Die „Sprechblase“ setzen wir auf display: table;, was allein nicht viel bewirkt, aber dann können wir das <p>-Element darin zu einer Tabelle-Zelle machen, was uns erlaubt, die vertical-align-Eigenschaft darauf anzuwenden.
.area {
width: 300px;
height: 300px;
background: url(../images/abe-bg.png) no-repeat;
position: relative;
}
.bubble {
position: absolute;
left: 93px;
top: 21px;
width: 135px;
height: 84px;
display: table;
}
.bubble p {
display: table-cell;
vertical-align: middle;
text-align: center;
}
Macht den Trick meiner Meinung nach hervorragend. Diese aktuelle Version von CSS-Tricks hat unten im Footer eine kleine Twitter-Sprechblase, für die ich das verwendet habe.
Und was ist mit IE <= 7?!
IE 8 unterstützt CSS-Tabellen, aber IE 7 und darunter nicht. Zu schade, zu traurig. Stattdessen erhalten Sie dies

… könnte schlimmer sein. Ich hatte gehofft, das ie8.js von Dean Edwards würde das lösen, aber bisher ohne Erfolg.
UPDATE 1
Boris Kuzmic kommentiert unten mit einer perfekten Lösung, um IE 6 und 7 perfekt zum Laufen zu bringen
<!--[if lt IE 8]>
<style>
.bubble { position: absolute; left: 93px; top: 21px; width: 135px; height: 84px; text-align: center;}
.bubble p { position: relative; font-size: 11px;
margin-top: expression(this.offsetHeight < this.parentNode.offsetHeight ? parseInt((this.parentNode.offsetHeight - this.offsetHeight) / 2) + "px" : "0");
}
</style>
<![endif]-->
UPDATE 2
Boris erneut mit einer Methode, um den IE-Ausdruck speichersicher zu machen (auf diese Weise muss er nur einmal ausgewertet werden, nicht kontinuierlich ausgeführt).
.bubble p { position: relative; font-size: 11px;
margin-top: inherit;
*clear: expression(
style.marginTop = "" + (offsetHeight < parentNode.offsetHeight ? parseInt((parentNode.offsetHeight - offsetHeight) / 2) + "px" : "0"),
style.clear = "none", 0
);
}
UPDATE 3
James John Malcolm meldet sich mit einer weiteren Technik für IE zu Wort. Sie ist etwas weniger semantisch (erfordert ein zusätzliches div), aber sie benötigt keinen Ausdruck.
Wickeln Sie zunächst die innere <p>-Element in ein neues <div> und dann
<!--[if lt IE 8]>
<style>
.bubble div { position: absolute; top:50%;}
.bubble div p {position: relative; top: -50%}
</style>
<![endif]–>
Ich dachte, Sie mögen keine CSS-Tabellen?
Ha! Nun ja, das stimmt, im Allgemeinen nicht. Aber ich mag sie nicht, weil sie nichts bieten, was Tabellen-Markup nicht bereits tut. *Wow, ich kann dieses div wie eine Tabellenzelle verhalten lassen!* Warum nicht einfach eine Tabellenzelle verwenden?
In diesem Fall sparen wir Markup, indem wir es verwenden UND seine einzigartige Eigenschaft nutzen, vertikales Ausrichten zu ermöglichen. Es ist also keine Täuschung, sondern nur ein netter Trick.
Bedeutet das, dass CSS HTML im Grunde auf Größe reduzieren kann?
Nehmen wir zum Beispiel an, ich habe fett und kursiv Text
Könnte ich nicht CSS verwenden, um den Stil dieser beiden Tags komplett zu entfernen und sie dann zu dem machen, was ich will? Ein Tag könnte also jetzt etwas kursiv machen und ein Tag ist jetzt ein Absatz-Tag?
Wenn ja, dann könnte man theoretisch jeden Tag in einen Tabellen-Tag verwandeln :)
Gut gemacht, Chris. Ich mag, wie die oben erwähnte Frage „Ich dachte, Sie mögen display:table nicht?“. Und unabhängig davon, ob Sie es mögen oder nicht, haben Sie sich trotzdem damit auseinandergesetzt, um herauszufinden, wie es tatsächlich nützlich sein kann. Definitiv die Zeichen eines CSS-Fanatikers :) Gut gemacht.
„Illusionen, Michael! Tricks sind das, was eine Hure für Geld tut… oder Süßigkeiten!“ – GOB
Konnte nicht widerstehen. ;-)
Wie immer sehr schön. Hoffe nur, die Migration von IE7 zu IE8 verläuft viel reibungsloser und schneller. Verdammt, Legacy-Software.
Sieht ziemlich gut aus, wenn das Dean Edwards Skript es unterstützt, wird es super!
Wenn Ihnen unterschiedlich hohe Felder nichts ausmachen, funktioniert auch gleicher Abstand oben und unten.
Guter Tipp, aber IE6 sucks….
Ich hatte keinerlei Erfolg mit dem Dean Edwards Skript. Sehr frustrierend!
Aber ein schöner Trick.
Ich schätze den Tipp, aber bei etwa 40% immer noch in IE6 und IE7 gibt es einfach zu viele Benutzer, die es nicht richtig sehen würden, als dass ich es übernehmen könnte.
Das ist einer meiner Lieblingstricks! Toller Bericht :)
Hmmm. Was ist, wenn Sie ein bisschen jQuery verwenden? Sie haben 2 Felder, berechnen die Größe jedes einzelnen, machen dann 2 Subtraktionen und Sie wissen, wo Sie die Absätze innerhalb der Sprechblase platzieren müssen.
Bogdan, das wäre die Verwendung von JavaScript für die Darstellung. Wann immer möglich
sollte XHTML den gesamten Inhalt semantisch kennzeichnen
sollte CSS die gesamte Darstellung des Inhalts übernehmen
sollte JavaScript nur das Verhalten zuweisen
Meinten Sie
Und was ist mit IE <= 7?!
Das ist ein Anfang, aber nur die halbe Lösung – es ist in der realen Welt nutzlos, wenn es nicht auf den bösen Browsern IE6 und IE7 funktioniert…
Mit bedingten Kommentaren und dem Positionierungs-Trick (ein relativ positioniertes div mit top/left -50% innerhalb eines absolut positionierten div mit top/left 50%) funktioniert es browserübergreifend gut.
Mit IE 6 und 7 können Sie Folgendes tun
<!--[if lt IE 8]>
<style>
.bubble { position: absolute; left: 93px; top: 21px; width: 135px; height: 84px; text-align: center;}
.bubble p { position: relative;
display: inline-block;
margin-top: expression(this.offsetHeight < this.parentNode.offsetHeight ? parseInt((this.parentNode.offsetHeight - this.offsetHeight) / 2) + "px" : "0");
}
</style>
<![endif]-->
Platzieren Sie es einfach im
<head>-Element unter dieser Zeile<link rel="stylesheet" type="text/css" href="css/style.css" />
Sie benötigen keine „display: inline-block;“ – ich habe versucht, es mit einem Span-Tag anstelle von p zum Laufen zu bringen
Hurra! Boris bekommt heute drei fette goldene Sterne!
Es funktioniert sehr gut, und ich habe das Live-Beispiel aktualisiert, um dies einzuschließen.
ERINNERUNG: Wenn Sie den obigen Code kopieren und einfügen, wandelt WordPress gerne schräge Anführungszeichen in gerade um, also korrigieren Sie die um „px“ und „0“.
Chris, ich glaube, ich habe einen ultimativen Hack gefunden :-). Wie viele Sterne bekomme ich heute?! :-)
Schau dir das an
.bubble p { position: relative; font-size: 11px;
margin-top: inherit;
*clear: expression(
style.marginTop = "" + (offsetHeight < parentNode.offsetHeight ? parseInt((parentNode.offsetHeight - offsetHeight) / 2) + "px" : "0"),
style.clear = "none", 0
);
}
Dies zwingt IE, die Expression nur einmal auszuwerten und vermeidet so Speicher- und Leistungsprobleme.
Inspirationsquelle war dieser großartige Beitrag
Einmalige Ausführung von IE CSS-Ausdrücken
Süßer Tipp, den muss ich in meine Trickkiste packen! :D
Vielen Dank,
Anthony Proulx
Chris! Beachten Sie, dass die Verwendung von IE-Ausdrücken zu erheblichen Speicherlecks führen kann (er läuft immer).
DN hat Recht, Ausdrücke können Speicherlecks verursachen. In diesem Fall passiert das nicht, aber es gibt ein Leistungsproblem: Der Ausdruck läuft die ganze Zeit (wenn Sie die Maus bewegen, wenn Sie scrollen usw.). Um dies zu vermeiden, können Sie diesen kleinen JavaScript-Code für IE 6 und 7 verwenden (fügen Sie ihn am Ende des HTML-Bodys ein)
<!--[if lt IE 8]>
<script type="text/javascript">
// alle Blasen vertikal zentrieren
var ps = document.getElementsByTagName("p");
for (var i=0;i<ps.length;i++) {
if (ps[i].parentNode.className=='bubble') {
ps[i].style.marginTop = ps[i].offsetHeight < ps[i].parentNode.offsetHeight ?
parseInt((ps[i].parentNode.offsetHeight - ps[i].offsetHeight) / 2) + "px" : "0";
}
}
ps = null;
</script>
<![endif]-->
Entfernen Sie außerdem den margin-top-Stil aus der .bubble p-Klasse.
Es wird langsam viel Code für einen einfachen Trick. Gute Arbeit, aber ich persönlich neige dazu, diese kleinen Anzeigefehler von IE zu ignorieren… und die Leute aufzufordern, ihre Browser zu aktualisieren :)
Toller Tipp! Danke!
Ich liebe diese Sprechblase.
Stört es Sie, wenn ich diese Grafik auf meiner Website verwende?
Ja, das ist definitiv ein Hack. Ich würde es vorziehen, einfach eine Tabelle zu verwenden. Es ist mehr HTML, aber weniger verwirrender Code.
Nein, das ist kein Hack. Es ist die Verwendung von CSS für die Darstellung… was dafür gedacht ist. Eine Tabelle in diesem Kontext zu verwenden wäre ein Hack. Und der Code ist überhaupt nicht verwirrend, es sei denn, Sie kennen CSS noch nicht gut.
Ich benutze Tabellen, wenn es nötig ist und in allen Browsern funktioniert. Warum machen diese Leute, die über Leichen gehen, um Tabellen zu vermeiden, und am Ende eine komplexere Lösung?
Es ist keine generelle Vermeidung, sondern nur die richtige Anwendung. Da eine Sprechblase, die aus einem einzigen Absatz besteht, nicht als tabellarische Daten betrachtet werden kann, wäre es unangemessen, sie in diesem Kontext zu verwenden. Auf der anderen Seite sind Tabellen großartig für die Speicherung von mehrspaltigen, mehrzeiligen Daten.
Sie haben so sehr Recht.
Es ist ziemlich bekannt, dass fortgeschrittenes CSS nicht verwendet werden sollte, bis alle wichtigen Browser es unterstützen.
Dieser Artikel leistet nichts Neues für niemanden, und es gibt hier keinen TRICK.
Es ist nur CSS, von dem jeder IMMER wusste, dass es da ist, aber es nicht benutzen würde, weil
wegen mangelnder IE-Unterstützung. Also… ich werde es immer noch nicht benutzen. Vorerst :)
Persönlich finde ich nicht, dass alles in allen Browsern exakt gleich aussehen muss, und dies ist ein gutes Beispiel dafür, wo ein geringfügiger Unterschied einen modernen Browser gut aussehen lässt und ein älterer Browser trotzdem korrekt funktioniert.
Um einen Mittelweg zu finden, könnten Sie display:table-cell und vertical-align in Verbindung mit etwas vertikalem Abstand verwenden – so werden auch ältere Browser nicht überfüllt und traurig aussehen.
Sehr schöner Tipp! Danke!
Ich war schockiert, als ich entdeckte, dass es in CSS keine einfache Möglichkeit gibt, Text auf diese Weise vertikal zu zentrieren. Horizontales Zentrieren ist kein Problem, aber warum musste Vertikales so ein großes Problem sein?
Es sollte so einfach sein wie vertical-align:middle oder margin:auto 0
Die einzigen Optionen, um es in ie6 und ie7 richtig zum Laufen zu bringen, sind entweder die Verwendung einer Tabelle oder ein seltsames Durcheinander aus CSS.
Es ist großartig, dass wir eine Möglichkeit haben, es unter IE 6 und 7 zum Laufen zu bringen, aber ich denke, wir können es nicht als „CSS-freundlich“ bezeichnen, daher müssen wir es vermeiden, wann immer wir können :\
Deshalb heißt es Hack – hässlich, aber notwendig. Jedenfalls ist die letzte Lösung, die ich gepostet habe, IE-CSS-freundlich und erleichtert das Leben des Entwicklers.
Guter Tipp, aber es sieht in CHROME nicht gut aus ;-)
Welche Chrome-Version verwenden Sie? Ich habe es gerade mit 1.0.154.65 ausprobiert und es funktioniert. Vielleicht beziehen Sie sich auf den Text in der ersten Sprechblase (die Schriftgröße sollte geändert werden).
Was ist, wenn Sie Bilder anstelle von Text verwenden möchten?
Ich habe eine einfache zentrierte Login-Seite erstellt, um zu zeigen, wie diese Technik auch verwendet werden kann.
Schauen Sie es sich an: CSS zentrierte Login-Seite
Brillante Lösung für ein häufiges Problem. Blockelemente variabler Größe können knifflige Probleme beim gleichzeitigen horizontalen und vertikalen Zentrieren darstellen. CSS-Tabellen bieten einen (nicht so idealen) Workaround für diese Probleme.
Nun, die reguläre Methode des vertikalen Zentrierens in CSS wurde von Dušan Janovský dokumentiert. Sie benötigt ein zusätzliches div für ihre IE-Lösung, aber sie erfordert keine Ausdrücke, nur reguläres CSS.
Ich habe das Beispiel aktualisiert, um bedingte Kommentare anstelle von Hacks zu verwenden. Das HTML wird
<div class="area" id="two">
<div class="bubble">
<div>
<p>Das zu tun ist vielleicht nicht so einfach oder offensichtlich, wie wir hoffen würden.</p>
</div>
</div>
</div>
Das Stylesheet wird
#page-wrap { width: 600px; margin: 0 auto;
.area { width: 300px; height: 300px; background: url(abe-bg.png) no-repeat; position: relative; float: left; }
.bubble { position: absolute; left: 93px; top: 21px; width: 135px; height: 84px; display: table; }
.bubble div { display: table-cell; vertical-align: middle; text-align: center;}
Das IE-spezifische CSS wird
<!--[if lt IE 8]>
<style>
.bubble div { position: absolute; top:50%;}
.bubble div p {position: relative; top: -50%}
</style>
<![endif]-->
Das ist wirklich cool und die Technik von James John Malcolm ist eine großartige Lösung für IE. Übrigens… würde das nicht browserübergreifend funktionieren? Da die zusätzliche Markierung sowieso da sein muss, könnte man genauso gut nur James CSS verwenden und die Tabellentechnik überspringen?
Chris, ich mag die von Ihnen erstellten Sprechblasen-Beispiele :)
Auch hier habe ich am 7.4.09 ein ähnliches Thema behandelt. Falls Sie die chinesische Version mögen, hier ist ein Link
http://www.61dh.com/blog/2009/04/css.html
Es ist an der Zeit, dass jeder Entwickler oben auf jeder Seite eine große, schreckliche Warnung anzeigt, die auf den Computern von <=IE7-Benutzern erscheint. Dann können wir hoffentlich bald die Welt von diesen Microsoft-Internetverbrechen befreien und uns VIEL Zeit sparen!
Ich habe herausgefunden, dass, wenn Sie offsetHeight oder offsetWidth in IE7 oder IE8 verwenden, stellen Sie sicher, dass Sie das HTML-Tag mit einer Dimension versehen… z.B. oder Sie setzen das Tag in CSS;
z.B.
html { height: 100%; width:100%; }
Ich hoffe, diese kleine Information hilft jemandem.
So lustig, dass wir CSS (IE8!) verwenden, um das Verhalten von Tabellenzellen nachzuahmen, obwohl uns gesagt wurde, dass Tabellen Teufelszeug seien. Erstaunlich, wie viele Hürden und bedingte Anweisungen man überwinden muss, um das gleiche Ergebnis zu erzielen, mit dem ein v4-Browser mit Tabellen leicht zurechtkam (und es war brav browserübergreifend). Sind wir alle verrückt geworden?
Wow… ich wünschte nur, IE würde kapieren, dass sie mehr Probleme als Lösungen verursachen und Firefox einfach die Überhand gewinnen lassen…
Toller Blog! Auf RSS abonniert. Werde ihn regelmäßig lesen. Gute Arbeit.
Ausgezeichneter Blog! Sehr interessante Beiträge. Ich werde ihn immer lesen. Auch auf RSS abonniert.
Fantastischer Beitrag. Es scheint mir, dass die CSS3-Leute eine multi_center-Option erstellen müssen. Ich verstehe, dass für eine solche Option mehr Rendering-Mathematik erforderlich ist, daher ist es vernünftig, sie zur Leistung zu von einfach 'center' zu unterscheiden. Dennoch ist dies mein drittes CSS3-Projekt, und man sollte meinen, dass dies keine so schwierige Aufgabe wäre. Leicht einer der Top-Stile, die "schwieriger sind, als sie aussehen".