Pergunta

Eu tenho uma div com duas imagens e uma h1.Todos eles precisam estar alinhados verticalmente dentro da div, um ao lado do outro.

Uma das imagens precisa ser absolute posicionado dentro da div.

Qual é o CSS necessário para que isso funcione em todos os navegadores comuns?

<div id="header">
    <img src=".." ></img>
    <h1>testing...</h1>
    <img src="..."></img>
</div>
Foi útil?

Solução

Uau, esse problema é popular.Baseia-se num mal-entendido no vertical-align propriedade.Este excelente artigo explica isso:

Entendimento vertical-align, ou "Como (não) centralizar o conteúdo verticalmente" por Gavin Kistner.

“Como centralizar em CSS” é uma ótima ferramenta web que ajuda a encontrar os atributos de centralização CSS necessários para diferentes situações.


Em poucas palavras (e para evitar o apodrecimento do link):

  • Elementos embutidos (e apenas elementos inline) podem ser alinhados verticalmente em seu contexto por meio de vertical-align: middle.No entanto, o “contexto” não é toda a altura do contêiner pai, é a altura da linha de texto em que ele está. exemplo jsfiddle
  • Para elementos de bloco, o alinhamento vertical é mais difícil e depende fortemente da situação específica:
    • Se o elemento interno puder ter um altura fixa, você pode definir sua posição absolute e especifique seu height, margin-top e top posição. exemplo jsfiddle
    • Se o elemento centralizado consiste em uma única linha e sua altura pai é fixa você pode simplesmente definir o contêiner line-height para preencher sua altura.Este método é bastante versátil na minha experiência. exemplo jsfiddle
    • … existem mais casos especiais desse tipo.

Outras dicas

Agora que o suporte ao flexbox está aumentando, este CSS aplicado ao elemento contido centralizaria verticalmente o item contido:

.container {        
    display: flex;
    align-items: center;
}

Use a versão prefixada se você também precisar direcionar o Explorer 10 e navegadores Android antigos (< 4.4):

.container {
    display: -ms-flexbox;
    display: -webkit-flex;
    display: flex;

    -ms-flex-align: center;
    -webkit-align-items: center;
    -webkit-box-align: center;

    align-items: center;
}

Usei este código muito simples:

HTML:

<div class="ext-box">
    <div class="int-box">
        <h2>Some txt</h2>
        <p>bla bla bla</p>
    </div>
</div>

CSS:

div.ext-box { display: table; width:100%;}
div.int-box { display: table-cell; vertical-align: middle; }

Obviamente, quer você use um .class ou um #id, o resultado não mudará.

Funcionou para mim:

.vcontainer {
    min-height: 10em;
    display: table-cell;
    vertical-align: middle;
}
 .outer {
   display: flex;
   align-items: center; 
   justify-content: center;
 }

Uma técnica de um amigo meu:

HTML:

<div style="height:100px; border:1px solid;">
    <p style="border:1px dotted;">I'm vertically centered.</p>
</div>

CSS:

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

DEMONSTRAÇÃO aqui

Todos eles precisam estar alinhados verticalmente dentro da div

Alinhado como?Topos das imagens alinhados com o topo do texto?

Uma das imagens precisa estar posicionada de forma absoluta dentro do div.

Absolutamente posicionado em relação ao DIV?Talvez você possa esboçar o que está procurando...?

fd descreveu os passos para posicionamento absoluto, bem como ajustar a exibição do H1 elemento tal que as imagens aparecerão alinhadas com ele.Além disso, acrescentarei que você pode alinhar as imagens usando o vertical-align estilo:

#header h1 { display: inline; }
#header img { vertical-align: middle; }

...isso colocaria o cabeçalho e as imagens juntos, com as bordas superiores alinhadas.Existem outras opções de alinhamento; veja a documentação.Você também pode achar benéfico descartar o DIV e mover as imagens dentro do H1 elemento - fornece valor semântico ao contêiner e elimina a necessidade de ajustar a exibição do H1:

<h1 id=header">
   <img src=".." ></img>
   testing...
   <img src="..."></img>
</h1>

Para posicionar os elementos do bloco no centro (funciona no IE9 e superior), é necessário um wrapper div:

.vcontainer {
  position: relative;
  top: 50%;
  transform: translateY(-50%);
  -webkit-transform: translateY(-50%);
}

Use esta fórmula e ela funcionará sempre sem falhas:

#outer {height: 400px; overflow: hidden; position: relative;}
#outer[id] {display: table; position: static;}

#middle {position: absolute; top: 50%;} /* For explorer only*/
#middle[id] {display: table-cell; vertical-align: middle; width: 100%;}

#inner {position: relative; top: -50%} /* For explorer only */
/* Optional: #inner[id] {position: static;} */
<div id="outer">
  <div id="middle">
    <div id="inner">
      any text
      any height
      any content, for example generated from DB
      everything is vertically centered
    </div>
  </div>
</div>

Quase todos os métodos precisam especificar a altura, mas muitas vezes não temos nenhuma altura.
Então aqui está um truque de 3 linhas do CSS3 que não requer saber a altura.

.element {
    position: relative;
    top: 50%;
    transform: translateY(-50%);
}

É suportado até no IE9.

com seus prefixos de fornecedor:

.element {
    position: relative;
    top: 50%;
    -webkit-transform: translateY(-50%);
    -ms-transform: translateY(-50%);
    transform: translateY(-50%);
}

Fonte: http://zerosixtrês.se/vertical-align-anything-with-just-3-lines-of-css/

Meu truque é colocar dentro da div uma tabela com 1 linha e 1 coluna, definir 100% de largura e altura, e a propriedade vertical-align:middle.

<div>

    <table style="width:100%; height:100%;">
        <tr>
            <td style="vertical-align:middle;">
                BUTTON TEXT
            </td>
        </tr>
    </table>

</div>

Violino:http://jsfiddle.net/joan16v/sbqjnn9q/

Por padrão, h1 é um elemento de bloco e será renderizado na linha após a primeira img e fará com que a segunda img apareça na linha após o bloco.

Para impedir que isso ocorra, você pode configurar o h1 para ter um comportamento de fluxo inline:

#header > h1 { display: inline; }

Quanto ao posicionamento absoluto da img dentro da div, você precisa definir o div que o contém para ter um "tamanho conhecido" antes que isso funcione corretamente.Na minha experiência, você também precisa alterar o atributo position do padrão - position:relativo funciona para mim:

#header { position: relative; width: 20em; height: 20em; }
#img-for-abs-positioning { position: absolute; top: 0; left: 0; }

Se você conseguir que isso funcione, tente remover progressivamente os atributos de altura, largura e posição de div.header para obter os atributos mínimos necessários para obter o efeito desejado.

ATUALIZAR:

Aqui está um exemplo completo que funciona no Firefox 3:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
    <head>
        <title>Example of vertical positioning inside a div</title>
        <style type="text/css">
            #header > h1 { display: inline; }
            #header { border: solid 1px red; 
                      position: relative; }
            #img-for-abs-positioning { position: absolute;
                                       bottom: -1em; right: 2em; }
        </style>
    </head>

    <body>
        <div id="header">
            <img src="#" alt="Image 1" width="40" height="40" />
            <h1>Header</h1>
            <img src="#" alt="Image 2" width="40" height="40" 
                 id="img-for-abs-positioning" />
        </div>
    </body>
</html>

Usando CSS para centralização vertical, você pode permitir que os contêineres externos atuem como uma tabela e o conteúdo como uma célula da tabela.Neste formato seus objetos ficarão centralizados.:)

Aninhei vários objetos no JSFiddle, por exemplo, mas a ideia central é assim:

HTML

<div class="circle">
  <div class="content">
    Some text
  </div>
</div>

CSS

 .circle {
   /* act as a table so we can center vertically its child */
   display: table;
   /* set dimensions */
   height: 200px;
   width: 200px;
   /* horizontal center text */
   text-align: center;
   /* create a red circle */
   border-radius: 100%;
   background: red;
 }

 .content {
   /* act as a table cell */
   display: table-cell;
   /* and now we can vertically center! */
   vertical-align: middle;
   /* some basic markup */
   font-size: 30px;
   font-weight: bold;
   color: white;
 }

O exemplo de vários objetos:

HTML

<div class="container">
  <div class="content">

    <div class="centerhoriz">

      <div class="circle">
        <div class="content">
          Some text
        </div><!-- content -->
      </div><!-- circle -->

      <div class="square">
        <div class="content">
          <div id="smallcircle"></div>
        </div><!-- content -->
      </div><!-- square -->

    </div><!-- center-horiz -->

  </div><!-- content -->
</div><!-- container -->

CSS

.container {
  display: table;
  height: 500px;
  width: 300px;
  text-align: center;
  background: lightblue;
}

.centerhoriz {
  display: inline-block;
}

.circle {
  display: table;
  height: 200px;
  width: 200px;
  text-align: center;
  background: red;
  border-radius: 100%;
  margin: 10px;
}

.square {
  display: table;
  height: 200px;
  width: 200px;
  text-align: center;
  background: blue;
  margin: 10px;
}

.content {
  display: table-cell;
  vertical-align: middle;
  font-size: 30px;
  font-weight: bold;
  color: white;
}

#smallcircle {
  display: inline-block;
  height: 50px;
  width: 50px;
  background: green;
  border-radius: 100%;
}

Resultado

Result

https://jsfiddle.net/martjemeyer/ybs032uc/1/

Podemos usar um cálculo de função CSS para calcular o tamanho do elemento e então posicionar o elemento filho de acordo.

Exemplo de HTML:

<div class="box">
    <span><a href="#">Some Text</a></span>
</div>

E CSS:

.box {
    display: block;
    background: #60D3E8;
    position: relative;
    width: 300px;
    height: 200px;
    text-align: center;

}
.box span {
    font: bold 20px/20px 'source code pro', sans-serif;
    position: absolute;
    left: 0;
    right: 0;
    top: calc(50% - 10px);
}
a {
    color: white;
    text-decoration: none;
}

Demonstração criada aqui: https://jsfiddle.net/xnjq1t22/

Esta solução funciona bem com responsivo div height e width também.

Observação:A função calc não foi testada quanto à compatibilidade com navegadores antigos.

Hoje, encontrei uma nova solução alternativa para alinhar verticalmente várias linhas de texto em uma div usando CSS3 (e também estou usando o sistema de grade bootstrap v3 para embelezar a IU), que é a seguinte:

.immediate-parent-of-text-containing-div{
    height: 50px;         /* or any fixed height that suits you.*/
}

.text-containing-div {
    display: inline-grid;
    align-items: center;
    text-align: center;
    height: 100%;
}

Pelo que entendi, o pai imediato do elemento que contém o texto deve ter alguma altura.Espero que ajude você também.Obrigado!

Existem duas maneiras de alinhar elementos verticalmente e horizontalmente

enter image description here

1.Inicialização 4.3.X

para alinhamento vertical: d-flex align-items-center

para alinhamento horizontal: d-flex justify-content-center

.container {
    height: 180px;
    width:100%;
}
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" 
rel="stylesheet"/>

<div class="d-flex align-items-center justify-content-center bg-info container">
  <div class="bg-light p-2">I am in Center</div>
</div>

2.CSS3

.container {
    display: flex;
    align-items: center;
    justify-content: center;
    background-color: #17a2b8;
    height: 180px;
    width:100%;
}

.child {
  background-color: #f8f9fa;
  padding: 0.5rem;
}
<div class="container">
  <div class="child">I am in Center</div>
</div>

Basta usar uma tabela de uma célula dentro da div!Basta definir a altura da célula e da tabela como 100% e você pode usar o alinhamento vertical.

Uma tabela de uma célula dentro do div lida com o alinhamento vertical e é compatível com versões anteriores até a Idade da Pedra!

Tenho usado a seguinte solução (sem posicionamento e sem altura de linha) há mais de um ano, ela também funciona com IE 7 e 8.

<style>
.outer {
    font-size: 0;
    width: 400px;
    height: 400px;
    background: orange;
    text-align: center;
    display: inline-block;
}

.outer .emptyDiv {
    height: 100%;
    background: orange;
    visibility: collapse;
}

.outer .inner {
    padding: 10px;
    background: red;
    font: bold 12px Arial;
}

.verticalCenter {
    display: inline-block;
    *display: inline;
    zoom: 1;
    vertical-align: middle;
}
</style>

<div class="outer">
    <div class="emptyDiv verticalCenter"></div>
    <div class="inner verticalCenter">
        <p>Line 1</p>
        <p>Line 2</p>
    </div>
</div>

Esta é minha solução pessoal para um elemento i dentro de uma div

Exemplo JSFiddle

HTML

<div class="circle">
    <i class="fa fa-plus icon">
</i></div>

CSS

.circle {
   border-radius: 50%;
   color: blue;
   background-color: red;
   height:100px;
   width:100px;
   text-align: center;
   line-height: 100px;
}

.icon {
  font-size: 50px;
  vertical-align: middle;
}

Para mim funcionou assim:

<div style="width:70px; height:68px; float:right; display: table-cell; line-height: 68px">
    <a href="javascript:void(0)" style="margin-left: 4px; line-height: 2" class="btn btn-primary">Login</a>
</div>

O elemento "a" foi convertido em um botão, usando classes Bootstrap, e agora está centralizado verticalmente dentro de um "div" externo.

<div class="outdiv">
  <div class="indiv">
     <span>test1</span>
     <span>test2</span>
  </div>
</div>


.outdiv {
    display: flex;
    justify-content:center;
    align-items:center;
}

Só isso:

<div>
    <table style="width: 100%; height: 100%">
        <tr>
            <td style="width: 100%; height: 100%; vertical-align: middle;">
               What ever you want vertically-aligned
            </td>
        </tr>
    </table>
</div>

Uma tabela de uma célula dentro do div lida com o alinhamento vertical e é compatível com versões anteriores até a Idade da Pedra!

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
    <head>
        <style type="text/css">
            #style_center { position:relative; top:50%; left:50%; }
            #style_center_absolute { position:absolute; top:50px; left:50px; }
            <!--#style_center { position:relative; top:50%; left:50%; height:50px; margin-top:-25px; }-->
        </style>
    </head>

    <body>
        <div style="height:200px; width:200px; background:#00FF00">
            <div id="style_center">+</div>
        </div>
    </body>
</html>

Aqui está apenas outra abordagem (responsiva):

html,
    body {
        height: 100%;
    }
    body {
        margin: 0;
    }

    .table {
        display: table;
        width:  auto;
        table-layout:auto;
        height: 100%;
    }
        .table:nth-child(even) {
            background: #a9edc3;
        }
        .table:nth-child(odd) {
            background: #eda9ce;
        }

    .tr {
        display: table-row;
    }
    .td {
        display: table-cell;
        width: 50%;
        vertical-align: middle;
    }

http://jsfiddle.net/herrfischerhamburg/JcVxz/

Sou um cara .NET que acabou de começar a programar web.Não usei CSS (bem, um pouquinho).Usei um pouco de JavaScript para realizar a centralização vertical junto com a função .css do jQuery.

Estou apenas postando tudo do meu teste.Provavelmente não é muito elegante, mas funciona até agora.

script.

<html>
    <head>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>

        <script type="application/javascript">
            function centerElementVertically(id) {
                var btnDivHeight = $(id).outerHeight();
                var prnt = $(id).parent();
                var parentHeight = prnt.outerHeight();

                var newTop = ((parentHeight - btnDivHeight) / 2) + 'px';
                var newPct = newTop / parentHeight+'%;';

                $(id).css({top: newTop});
            }

            function showAlert(){
                alert("alert");
            }

            $(window).load(()=>{
                centerElementVertically('#buttonRight');
                centerElementVertically('#buttonLeft');
                centerElementVertically('#testerbtn')
            });

            $(window).resize(()=>{
                centerElementVertically('#buttonRight');
                centerElementVertically('#buttonLeft');
                centerElementVertically('#testerbtn')
            })
        </script>

        <style>
            #div1 {
                position:relative;
                height: 33%;
                background-color: red;
                overflow: hidden;
            }
            #buttonLeft {
                position: relative;
                float:left;
                width:50%;
                height:20%;
                background-color: cornsilk;
            }
            #buttonRight {
                position: relative;
                float:right;
                width:50%;
                height:50%;
                background-color: darkorchid;
            }
            #testerbtn {
                position: absolute;
            }
            body {
                background-color: aqua;
            }
        </style>

        <body>
            <div id="div1">
                <div id="buttonLeft">
                    <button id="testerbtn">tester</button>
                </div>
                <div id="buttonRight"></div>
            </div>
        </body>
    </head>
</html>
<div id="header" style="display: table-cell; vertical-align:middle;">

...

ou CSS

.someClass
{
   display: table-cell;
   vertical-align:middle;
}

Cobertura do navegador

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top