Wie kann ich etwas innerhalb eines Span-Tags vertikal ausrichten?

144

Wie kann ich erreichen, dass das "x" in der Mitte der Spanne vertikal ausgerichtet wird?

.foo {
    height: 50px;
    border: solid black 1px;
    display: inline-block;
    vertical-align: middle;
}

<span class="foo">
   x
</span>
Mike
quelle

Antworten:

218

Verwenden Sie line-height:50px;anstelle der Höhe. Das sollte den Trick machen;)

Sindre Sorhus
quelle
1
Hervorragend! Es funktioniert mit jeder Art von Tag. In meinem Fall hat <img> gearbeitet.
Felipe Conde
21
Das Problem ist, wenn der Text umbrochen wird. Mit zwei Zeilen wird diese Spanne mit einer Höhe von 100 Pixel gerendert.
Norberto Yoan
Wenn Ihr Text umbricht, versuchen Sie meine Antwort @NorbertoYoan
Hashbrown
Das Gleiche gilt für @Sumit (dupliziert wegen eines Problems mit den Kommentaren von SO )
Hashbrown
Dies sollte nicht die am häufigsten gewählte Antwort sein, da die Lösung je nach Inhalt möglicherweise andere unerwünschte Ergebnisse liefert.
Rafaelmorais
113

Beachten Sie, dass der line-heightAnsatz fehlschlägt, wenn Sie einen langen Satz in spander Zeile haben, der die Linie durchbricht, weil nicht genügend Platz vorhanden ist. In diesem Fall hätten Sie zwei Zeilen mit einer Lücke mit der Höhe der in der Eigenschaft angegebenen N Pixel.

Ich habe mich daran gehalten, als ich ein Bild mit vertikal zentriertem Text auf der rechten Seite anzeigen wollte, das in einer reaktionsschnellen Webanwendung funktioniert. Als Basis verwende ich den von Eric Nickus und Felipe Tadeo vorgeschlagenen Ansatz.

Wenn Sie erreichen wollen:

Desktop

und das:

Handy, Mobiltelefon

.container {
    background: url( "https://i.imgur.com/tAlPtC4.jpg" ) no-repeat;
    display: inline-block;
    background-size: 40px 40px; /* image's size */
    height: 40px; /* image's height */
    padding-left: 50px; /* image's width plus 10 px (margin between text and image) */
}

.container span {
    height: 40px; /* image's height */
    display: table-cell;
    vertical-align: middle;
}
<span class="container">
    <span>This is a centered sentence next to an image</span>
</span>

lluisaznar
quelle
Was ist eine dyanmische Höhe
Alberto Acuña
39

Dies ist der einfachste Weg, wenn Sie mehrere Zeilen benötigen. Wickeln Sie Ihren spanText in einen anderen ein spanund geben Sie dessen Höhe mit an line-height. Der Trick , um mehrere Zeilen wird das Zurücksetzen der inneren span‚s line-height.

<span class="textvalignmiddle"><span>YOUR TEXT HERE</span></span>
.textvalignmiddle {
    line-height: /*set height*/;
}

.textvalignmiddle > span {
    display: inline-block;
    vertical-align: middle;
    line-height: 1em; /*set line height back to normal*/
}

DEMO

Natürlich spankönnte das Äußere ein divoder was auch immer sein

Hashbrown
quelle
2
spans kann wie jedes andere Inline-Element jedes HTML-Inline-Element enthalten . Unabhängig davon habe ich geschrieben, dass textvalignmiddledies eine sein kann, divwenn dies erforderlich ist (und Sie können es einstellen, display:inline;wenn Sie so abgeneigt sind, es zu verwenden spans)
Hashbrown
Ich meine, sie sollten es nicht haben. Sie dienen zum Enthalten von Text. Sonst benutze ein div.
JorgeeFG
3
spanist der generische Inline-Container für HTML und weist nicht einmal darauf hin, nur Text zu sein. `Es kann verwendet werden, um Elemente für Stylingzwecke zu gruppieren ...`. Ich schlage vor, die Spezifikation zu lesen, bevor Sie Ihre persönlichen Codierungsstandards auf andere übertragen, die sie als Tatsache
angeben
3
In jedem Fall ist diese Konversationslinie in technischer Hinsicht nicht konstruktiv für die Frage und nicht dafür, wofür Kommentare in SO bestimmt sind
Hashbrown,
Funktioniert auch bei mir. Verwendet ein anderes Element als span.
Chocolata
27

Der Flexbox-Weg:

.foo {
    display: flex;
    align-items: center;
    justify-content: center;
    height: 50px;
}
Chris Clower
quelle
da .fooist eine spanne display: flex-inlinewürde besser passen
koala
7
Meinten Sie "Inline-Flex"?
Tim Gerhard
5

Ich brauchte dies für Links, also habe ich den Bereich mit einem a-Tag und einem div umbrochen und dann den Bereich selbst zentriert

HTML

<div>
    <a class="tester" href="#">
        <span>Home</span>
    </a>
</div>

CSS

.tester{
    display: inline-block;
    width: 9em;
    height: 3em;
    text-align: center;
}
.tester>span{
    position: relative;
    top: 25%;
}
Jason
quelle
Vielen Dank dafür, ich hasse es, mit CSS herumzuspielen. Ich habe den ganzen Tag damit verbracht, ein Element vertikal zu zentrieren, als ich hier auf Ihre Antwort stieß. Du bist ein Lebensretter!
Todd Nestor
5

CSS vertikales zentrales Bild und Text

Ich habe eine Demo für vertikale Bildmitte und Text erstellt und ich habe auch Test auf Firefox, Chrome, Safari, Internet Explorer 9 und 8.

Es ist sehr kurz und einfach CSS und HTML. Bitte überprüfen Sie den folgenden Code und Sie können die Ausgabe auf Screenshort finden.

HTML

<div class="frame">
    <img src="capabilities_icon1.png" alt="" />
</div>

CSS

  .frame {
        height: 160px;      
        width: 160px;
        border: 1px solid red;
        white-space: nowrap;
        text-align: center; margin: 1em 0;
    }

    .frame::before {
        display: inline-block;
        height: 100%;
        vertical-align: middle;
        content:"";
    }

    img {
        background: #3A6F9A;
        vertical-align: middle;
    }

Ausgabe Geben Sie hier die Bildbeschreibung ein

Eduard Jacko
quelle
2

das funktioniert bei mir (Keltex sagte dasselbe)

.foo {
height: 50px;
...
}
.foo span{
vertical-align: middle; 
}

<span class="foo"> <span>middle!</span></span>
Philll_t
quelle
1

Das vertikal ausgerichtete CSS-Attribut macht leider nicht das, was Sie erwarten. In diesem Artikel werden zwei Möglichkeiten zum vertikalen Ausrichten eines Elements mithilfe von CSS erläutert.

Keltex
quelle
1

Stellen Sie padding-top als geeigneten Wert ein, um das x nach unten zu drücken, und subtrahieren Sie dann den Wert, den Sie für padding-top haben, von der Höhe.

whereesrhys
quelle