Comment aligner verticalement quelque chose à l'intérieur d'une balise span?

144

Comment faire pour que le "x" soit aligné verticalement au milieu de la travée?

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

<span class="foo">
   x
</span>
Mike
la source

Réponses:

218

Utilisez line-height:50px;au lieu de la hauteur. Cela devrait faire l'affaire ;)

Sindre Sorhus
la source
1
Excellent! Cela fonctionne pour tout type de balise. Dans mon cas, j'ai travaillé pour <img>.
Felipe Conde
21
Le problème est lorsque le texte s'habille. Avec deux lignes, cette étendue sera rendue avec une hauteur de 100 pixels.
Norberto Yoan
si votre texte se termine, essayez ma réponse @NorbertoYoan
Hashbrown
idem pour @Sumit (dupliqué en raison d'un problème avec les commentaires de SO )
Hashbrown
Cela ne devrait pas être la réponse la plus votée, car la solution pourrait donner d'autres résultats indésirables en fonction du contenu.
rafaelmorais
113

Sachez que l' line-heightapproche échoue si vous avez une longue phrase dans le spanqui rompt la ligne car il n'y a pas assez d'espace. Dans ce cas, vous auriez deux lignes avec un espace avec la hauteur des N pixels spécifiés dans la propriété.

Je suis resté dedans lorsque je voulais montrer une image avec du texte centré verticalement sur son côté droit qui fonctionne dans une application Web réactive. Comme base, j'utilise l'approche suggérée par Eric Nickus et Felipe Tadeo.

Si vous souhaitez atteindre:

bureau

et ça:

mobile

.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
la source
qu'est-ce qu'une hauteur dyanmique
Alberto Acuña
39

C'est le moyen le plus simple de le faire si vous avez besoin de plusieurs lignes. Enveloppez votre spantexte dans un autre spanet spécifiez sa hauteur avec line-height. Le tour à plusieurs lignes est la réinitialisation de l'intérieur spans » 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

Bien sûr, l'extérieur spanpourrait être un divou quoi

Hashbrown
la source
2
spans, comme tout autre élément en ligne, peut contenir n'importe quel élément HTML en ligne . Quoi qu'il en soit, j'ai écrit que cela textvalignmiddlepeut être un divsi nécessaire (et vous pouvez le définir display:inline;si vous êtes si opposé à l'utilisation spans)
Hashbrown
Je veux dire, ils n'auraient pas dû. Ils sont destinés à contenir du texte. Sinon, utilisez un div.
JorgeeFG
3
spanest le conteneur en ligne générique pour html et n'indique pas qu'il s'agit uniquement de texte; `Il peut être utilisé pour regrouper des éléments à des fins de style ...`. Je suggère de lire les spécifications avant de pousser vos normes de codage personnelles sur les autres en les déclarant comme des faits
Hashbrown
3
de toute façon, cette ligne de conversation n'est pas constructive dans un sens technique à la question et n'est pas à quoi servent les commentaires dans SO
Hashbrown
Fonctionne aussi pour moi. Utilisé un élément différent de span.
chocolata
27

La manière flexbox:

.foo {
    display: flex;
    align-items: center;
    justify-content: center;
    height: 50px;
}
Chris Clower
la source
depuis .fooest un span display: flex-inlineconviendrait mieux
koala
7
Voulez-vous dire "inline-flex"?
Tim Gerhard
5

J'en avais besoin pour les liens, j'ai donc enveloppé le span avec une balise a et un div, puis centré la balise span elle-même

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
la source
Merci pour cela, je déteste jouer avec CSS, je passais toute la journée à essayer de centrer verticalement un élément lorsque je suis tombé sur votre réponse ici. Vous êtes un sauveur de vie!
Todd Nestor
5

Texte et image centrale verticale CSS

J'ai Créer une démo pour le centre d'image vertical et le texte.J'ai également testé sur Firefox, Chrome, Safari, Internet Explorer 9 et 8 aussi.

C'est très court et facile css et html, veuillez vérifier le code ci-dessous et vous pouvez trouver la sortie sur screenshort.

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;
    }

Sortie entrez la description de l'image ici

Eduard Jacko
la source
2

cela fonctionne pour moi (Keltex a dit la même chose)

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

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

L'attribut css vertical-align ne fait malheureusement pas ce que vous attendez. Cet article explique 2 façons d'aligner verticalement un élément à l'aide de css.

Keltex
la source
1

Définissez padding-top comme une valeur appropriée pour pousser le x vers le bas, puis soustrayez la valeur que vous avez pour padding-top de la hauteur.

où rhys
la source