webthreads.de - Web 2.0, Web-Entwicklung und Netzkultur von Markus Kühle

HTML Tipp: <div style=”vertical-align:middle”> geht nicht… oder doch?

Wie oft sucht man nach <div style=”vertical-align:middle> und findet immer nur die gleiche Antwort: es funktioniert nicht, funktionierte noch nie und wird wohl so schnell auch nicht funktionieren. Soweit die ernüchternde erste Antwort.

Wozu braucht man überhaupt einen mittigen Schriftzug? Gerade im “Ajax-Zeitalter”, wo die animierten Loading Bilder überall auftauchen möchte man doch ab und an auch den Text – “Loading..” mittig neben dem Bild haben und beide Elemente (Bild und Text) mittig im darum liegenden Block-Element. Aus diesem Grund wird oft das div Element verwendet um Bild und Text gemeinsam auszurichten. Oft läuft der erste Versuch dann folgendermaßen ab:

Loading…
<div style="vertical-align:middle;">
  <img src='http://www.webthreads.de/.../ajax-loader.gif'/> Loading...
</div>

Diese Herangehensweise funktioniert nicht, weil vertical-align nur auf die Höhe einer Zeile reagiert und nicht auf die Höhe eines umliegenden Block Elements.

Aber was tun? Selbst habe ich auch oft genug danach gegoogelt, mir Lösungen angeschaut und Erläuterungen entgegengenommen die mir sagen, dass es nur mit einer Tabelle funktioniert. Heißt es also wenn ich einen Text mittig neben einem Bild ausrichten möchte muss ich eine Tabelle nehmen? Das würde dann wie folgt aussehen:

Loading…
<table style="height: 40px;">
  <tr>
    <td style="vertical-align: middle; width: 25px;">
      <img src="http://www.webthreads.de/.../ajax-loader.gif"/>
    </td>
    <td style="vertical-align: middle;">
      Loading…
    </td>
  </tr>
</table>

Sieht ja grundsätztlich im Ergebnis schonmal nicht schlecht aus. Die Frage ist ob man dafür immer eine Tabelle verwenden soll bzw. muss:

Wenn man darüber nachdenkt, dann kann man doch ein Block Element nehmen welches auf die Zeilenhöhe reagiert, wie z.b. das <p> Element. D.h. man erstellt ein solches Element, mit einer angegebenen festen Zeilenhöhe und sagt, dass es sich mittig ausrichten soll:

Loading…

<p style="vertical-align:middle;">
  <img src='http://www.webthreads.de/.../ajax-loader.gif'/> Loading...
</p>

Das kann natürlich nicht funktionieren weil sich die CSS Angabe vertical-align:middle auf den Text einer Zeile bezogen auf das Eltern Element auswirkt, welches wiederum ein Inline-Element sein muss. Dabei orientiert sich die Zeile an der größten Box die die Zeile enthält. Das heißt, hat man mehrere Inline-Elemente nebeneinander und sie orientieren sich mit der Basislinie an dem größten Element, dann erstellt man einfach zwei separate Inline-Elemente, setzt bei einem die Schriftgröße zum ausrichten und orientieren für die anderen Boxen. Siehe dazu auch in der W3C CSS Level 2 Beschreibung zu der Eigenschaft “vertical-align:middle” (deutsche Übersetzung).

Folgende Variante funktioniert somit um einen Text neben einer Grafik mittig auszurichten:

Loading…

<p style="padding:0;margin:0;">
  <span style="vertical-align:middle; font-size:40px;">
    <img src='http://www.webthreads.de/.../ajax-loader.gif'/>
  </span>
  <span style="vertical-align:middle">Loading...</span>
</p>

Vor allem wichtig ist die Angabe font-size in einem Inline-Element denn diese erstellt die entsprechende Zeilenhöhe an der sich die weiteren Boxen (span Elemente) ausrichten. Am einfachsten ist es diese Angabe entweder in einer leeren Box anzugeben oder bei einer Box, wie hier bei dem Bild, bei der es nicht weiter stört. Zur weiteren Verschönerung kann man die default padding und margin CSS Eigenschaften des p Elementes noch außer Gefecht setzen.

Ob diese Lösung eine gute, eine einfache oder eine bessere Lösung als die Tabellen-Lösung ist, dass darf jeder selbst entscheiden. Falls einer eine weitere Möglichkeit für das mittige Ausrichten eines Textes neben einem Bild hat so darf er sie hier gerne kund tun – bin sehr gespannt darauf.

(Für das Erstellen des animierten Loading Bildes wurde ajaxload.info verwendet.)

Ähnliche Artikel, die dich interessieren könnten:

    None Found

22 Kommentare zu 'HTML Tipp: <div style=”vertical-align:middle”> geht nicht… oder doch?' »»


Kommentare

  1. Kommentar by Joern | 09.05.2007 at 10:05:05

    Super Beitrag.
    Nach dieser Lösung suche ich schon lange!!

    Danke
    Jörn

  2. Jan
    Kommentar by Jan | 09.05.2007 at 11:43:45

    Autsch
    Wie wärs mit vertical-align: middle im IMG tag?
    So wie das eigentlich gedacht war?

  3. Kommentar by Markus Kühle | 09.05.2007 at 13:22:05

    Ahoi Jan,
    bevor hier groß “Autsch” gebrüllt wird gib doch mal ein Beispiel. Ziel ist es einen Text mittig mit oder aber auch auch ohne Grafik in einem Block-Element darzustellen – wenn möglich ohne Tabelle. Und gerade bei den Ajax Events wenn man ein animiertes Loading anzeigen möchte besteht das Problem im Zusammenspiel mit einem Bild.

    Wenn man einen Text direkt mittig neben einem Bild erstellen möchte, dann reicht in der Tat vertical-align auf das IMG Element aus.

    Loading…
    <div style="height: 40px;">
        <img src="http://www.webthreads.de/…/ajax-loader.gif" style="vertical-align:middle"/> Loading…
    </div>

    Allerdings ist das Bild sowie der Text dann immer noch nicht mittig dem darüber gelegenen Block-Element, was aber das Ziel war wie auch die Überschrift des Artikels beschreibt. Aber evtl. habe ich nicht deutlich genug hervorgehoben das die Anforderung den Text mittig neben einem Bild zu haben als Beispiel für das eigentliche Problem dient. Ich habe dies im Text ein wenig angepasst.

    …Text – “Loading..” mittig neben dem Bild haben und beide Elemente (Bild und Text) mittig im darum liegenden Block-Element. Aus diesem Grund wird oft das div Element verwendet um Bild und Text gemeinsam auszurichten.

    Daher vielen Dank für deinen Hinweis. Für einen Text mittig neben einem Bild reicht die Angabe vertical-align:middle völlig aus.

  4. Kommentar by manuel | 05.07.2007 at 21:48:46
    Loading…
    
    
    <div style="height:90px; line-height:90px">Loading…</div>

    so gehts doch perfekt …
    allerdings nur einzeilig ;)

  5. Kommentar by manuel | 05.07.2007 at 21:49:53

    hat wohl nicht geklappt naja egal
    einfach noch ein line-height in das div
    dann gehts für eine einzige text zeile super!!

    siehe:
    http://www.mileandra.de/weblog/css-texte-vertikal-mittig-positionieren

  6. Kommentar by Markus Kühle | 05.07.2007 at 22:13:51

    Woha!

    Ich habe mir erlaubt deinen ersten Kommentar anzupassen, so dass das Beispiel zu sehen ist.
    Ansonsten vielen Dank für das Beispiel – das ist für einzeilige div Elemente echt die beste und einfachste Lösung.

  7. Kommentar by manuel | 06.07.2007 at 07:33:13

    danke, wenn man jetzt im Div noch ein Bild neben dem Text mittig haben will muss man das Bild einfach rein packen und dem Bild den Style: vertical-align: middle; geben…

  8. Kommentar by Noch ein manuel | 26.09.2007 at 14:21:00

    An meinen Vorredner: Du hast echt einen tollen Namen :D

    Ich hab da gerade ein ähnliches Problem (Bild – Breite und Höhe unbekannt – soll vertikal und horizontal zentriert in einem div – mit fester größe und breite – angezeigt werden). Da kam mir Eure Idee mit dem line-height wie gerufen.

    Ich würd ja gerne HTML-Code hier einfügen, hab aber keine ahnung wie das geht :) – das code-tag mag kein html.

    Letzendlich hab ich manuel’s Vorschlag (Post VII – nur ohne Text) aufgegriffen. Leider scheint der IE6 nicht mit der line-height und einem img klarzukommen. Der 7′er und FF verhalten sich wie erwartet.

    Ich seh mich doch wieder zu einer Tabellen-Lösung aufgrund vom IE6 genötigt :(

  9. Kommentar by Tobi | 13.07.2008 at 00:51:45

    *line-height* – ich habe echt schon stunden mit der Suche nach der Lösung gesucht! Ich habe auch in der Referenz zu CSS nicht mal dieses Element gefunden, ich wusste nicht dass es ihn gibt.
    VIELEN DANK, das erspart mir viele hässliche Tabellen.
    Falls das nochmal jemand sieht, ich würde mich für die Arbeitsweise des Elements line-height interessieren. Warum ist dann der Text vertikal zentriert?

    Nochmals danke
    Grüße Tobias

  10. Kommentar by Juergen Nantke | 31.07.2008 at 16:37:06

    Try:

    display:table-cell;
    vertical-align:middle;

  11. Kommentar by €Holzkopf€ | 15.11.2008 at 19:33:19

    voll geil dieser thread ty vielmlas

  12. Kommentar by Josi | 27.01.2009 at 12:18:23

    Danke für den Tip!
    Kleiner Typo: “vertical-align:center” gibt es nicht!

  13. Kommentar by Markus Kühle | 27.01.2009 at 12:50:41

    Danke für den Hinweis! Hat sich doch tatsächlich eingeschlichen und bis heute gehalten.
    Habe das eben aktualisiert.

  14. Kommentar by Marc | 24.08.2009 at 13:45:41

    Öh, Euch ist schon der stinknormale, uralte HTML-Tag im IMG-Tag bekannt, ja? align=”absmiddle”

  15. Kommentar by krom | 19.10.2009 at 17:41:29

    @10:Dabei wäre zu beachten das der Wert “table-cell” bei “display” nicht von allen Browsern interpretiert wird. Ergo unbrauchbar.
    @14: Das ist nicht Teil des Standards und sollte nicht verwendet werden. Bringt dich zudem beim ausrichten von Text leider auch nicht weiter.

    Ich war gerade auf der Suche nach einer Lösung, um ein DIV mit bekannten Größen (800×600) auf der Seite vertikal mittig auszurichten.
    Mir ist gerade wieder eingefallen, wie es ging. Falls mal jemand braucht:

    There goes teh content…

  16. Kommentar by krom | 19.10.2009 at 17:43:55

    öh ja. da wurde mein html fröhlich entfernt. hätte ich mir denken können :)

    Auf jeden Fall ein DIV absolut/relativ positionieren mit den Werten top:50% und left:50%.
    Dann ein negatives margin für top und left mit der halben höhe/breite des DIVs.

  17. Kommentar by Markus Kühle | 20.10.2009 at 10:38:47

    Vielen Dank für die weitere Lösung und deinen Kommentar – evtl mailst du mir nochmal die Lösung und ich kopiere sie dann rein oder einfach die spitzen Klammern escapen. Aber die Lösung ist ja auch so schon erläutert =).

  18. Kommentar by Legastheniker | 22.02.2010 at 15:27:08

    Sehr gutes Thema,

    und nach meinem Wissensstand wurde hier nun auch wirklich jede bekannte Lösung genannt und auch gleichzeitig alle Nachteile, wenn vorhanden.

    Aber es mit line-height zu machen war auch mir neu, es lohnt sich doch immer wieder auf die Suche zu gehen :).

  19. Kommentar by PhoC | 26.03.2010 at 09:05:26

    Danke!

    Auch für mich war die line-height die Lösung.

    Kreative Leute hier… :)

  20. Kommentar by Wolle | 07.04.2010 at 21:12:49

    Hallo,
    Text vertical zentriert neben Bild . Mein Vorschlag :
    3 Div’s erstellen . Erste Div bekommt ein DIV mit Text als Inhalt .
    Zweite DIV bekommt Bild als Inhalt .
    Div mit Text bekommt style=”float:left; width:XXpx; margin-top: XXpx;”
    Div mit Bild bekommt style=”float:right; width:XXpx;”

    Somit lassen sich Text und Bild pixelgenau im ersten DIV positionieren.
    Größe aus Flensburg
    Wolle

  21. Tom
    Kommentar by Tom | 23.05.2010 at 16:44:56

    Hey !!

    Was kann man machen, wenn man einen Div in einem Div vertical-mittig ausrichten will?
    also zb
    (div style=’heighe:100;vertical-align:middle’)
       (div style=’heighe:50;vertical-align:middle’)
       Inhalt
       (/div)
    (/div)


Trackbacks & Pingbacks »»

  1. [...] webthreads.de » HTML Tipp: <div style=”vertical-align:middle”> geht nicht… oder doch? [...]

Hinterlasse ein Kommentar »»

Bad Behavior has blocked 1461 access attempts in the last 7 days.