Como alinhar verticalmente algo dentro de uma tag span?

144

Como faço para que o "x" fique alinhado verticalmente no meio do intervalo?

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

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

Respostas:

218

Use em line-height:50px;vez de altura. Isso deve fazer o truque;)

Sindre Sorhus
fonte
1
Excelente! Funciona para qualquer tipo de tag. No meu caso, trabalhei com <img>.
Felipe Conde
21
O problema é quando o texto é finalizado. Com duas linhas, esse intervalo será renderizado com 100px de altura.
Norberto Yoan
se o seu texto for embrulhado, tente a minha resposta @NorbertoYoan
Hashbrown 1/01
idem para @Sumit (duplicado por causa do problema com os comentários de SO )
Hashbrown
Esta não deve ser a resposta mais votada, pois a solução pode fornecer outros resultados indesejados, dependendo do conteúdo.
Rafaelmorais
113

Esteja ciente de que a line-heightabordagem falhará se você tiver uma frase longa na spanque quebra a linha porque não há espaço suficiente. Nesse caso, você teria duas linhas com um intervalo com a altura dos N pixels especificados na propriedade

Eu fiquei preso quando queria mostrar uma imagem com texto centralizado verticalmente no lado direito, que funciona em um aplicativo da web responsivo. Como base, uso a abordagem sugerida por Eric Nickus e Felipe Tadeo.

Se você deseja alcançar:

Área de Trabalho

e isto:

Móvel

.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
fonte
o que é uma altura dyanmic
Alberto Acuña
39

Essa é a maneira mais simples de fazer isso, se você precisar de várias linhas. Coloque spano texto em outro spane especifique sua altura com line-height. O truque de várias linhas está a repor os interiores 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

Claro que o exterior spanpode ser um divou o que você deve

Hashbrown
fonte
2
spans, como qualquer outro elemento embutido, pode conter qualquer elemento embutido HTML . Independentemente disso, eu escrevi que textvalignmiddlepode ser um divse assim for necessário (e você pode configurá-lo para display:inline;se você é tão avessos ao uso de spans)
Hashbrown
Quero dizer, eles não deveriam ter. Eles são para conter texto. Caso contrário, use uma div.
JorgeeFG
3
spané o contêiner embutido genérico para html e nem sequer sugere que seja apenas texto; `Pode ser usado para agrupar elementos para fins de estilo ...`. Eu sugiro a leitura da especificação antes de empurrar os seus padrões de codificação pessoais sobre os outros, afirmando-los como verdade
Hashbrown
3
de qualquer forma, essa linha de conversa is not construtiva no sentido técnico para a pergunta e isnt o que comentários no SO são para
Hashbrown
Funciona para mim também. Usou um elemento diferente do span.
Chocolata
27

A maneira flexbox:

.foo {
    display: flex;
    align-items: center;
    justify-content: center;
    height: 50px;
}
Chris Clower
fonte
desde que .fooé uma extensão display: flex-inlinecaberia melhor
Koala
7
Você quis dizer "inline-flex"?
Tim Gerhard
5

Eu precisava disso para links, então envolvi o span com uma tag e uma div, e então centralizei o tag span

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
fonte
Obrigado por isso, eu odeio mexer com CSS, estava passando o dia todo tentando centralizar verticalmente um elemento quando me deparei com sua resposta aqui. Você é um salva-vidas!
Todd Nestor
5

Imagem e texto do centro vertical CSS

Eu tenho criar uma demonstração para o centro de imagem vertical e texto também tenho teste no Firefox, Chrome, Safari, Internet Explorer 9 e 8 também.

É muito curto e fácil css e html. Verifique o código abaixo e você pode encontrar a saída no 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;
    }

Saída, insira a descrição da imagem aqui

Eduard Jacko
fonte
2

isso funciona para mim (Keltex disse o mesmo)

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

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

O atributo css de alinhamento vertical não faz o que você espera, infelizmente. Este artigo explica duas maneiras de alinhar verticalmente um elemento usando css.

Keltex
fonte
1

Defina padding-top como um valor apropriado para empurrar x para baixo e subtraia o valor que você tem para padding-top da altura.

wheresrhys
fonte