Aqui está uma técnica para alinhar elementos embutidos dentro de um pai , horizontal e verticalmente ao mesmo tempo:
Alinhamento vertical
1) Nesta abordagem, criamos um inline-block
(pseudo-) elemento como o primeiro (ou último) filho do pai e definimos sua height
propriedade 100%
para assumir toda a altura do pai .
2) Além disso, a adição vertical-align: middle
mantém os elementos embutidos (-bloco) no meio do espaço da linha. Então, adicionamos essa declaração CSS ao primeiro filho e ao nosso elemento (a imagem ).
3) Finalmente, para remover o caractere de espaço em branco entre os elementos embutidos (-bloco) , poderíamos definir o tamanho da fonte do pai como zero por font-size: 0;
.
Nota: usei a técnica de substituição de imagem de Nicolas Gallagher a seguir.
Quais são os benefícios?
- O contêiner ( pai ) pode ter dimensões dinâmicas.
Não há necessidade de especificar explicitamente as dimensões do elemento de imagem.
Podemos facilmente usar essa abordagem para alinhar um <div>
elemento verticalmente também; que pode ter um conteúdo dinâmico (altura e / ou largura). Mas observe que você deve redefinir a font-size
propriedade do div
para exibir o texto interno. Demo Online .
<div class="container">
<div id="element"> ... </div>
</div>
.container {
height: 300px;
text-align: center; /* align the inline(-block) elements horizontally */
font: 0/0 a; /* remove the gap between inline(-block) elements */
}
.container:before { /* create a full-height inline block pseudo=element */
content: ' ';
display: inline-block;
vertical-align: middle; /* vertical alignment of the inline element */
height: 100%;
}
#element {
display: inline-block;
vertical-align: middle; /* vertical alignment of the inline element */
font: 16px/1 Arial sans-serif; /* <-- reset the font property */
}
A saída
Container Responsivo
Esta seção não responderá à pergunta, pois o OP já sabe como criar um contêiner responsivo. No entanto, vou explicar como isso funciona.
Para fazer a altura de um elemento de contêiner mudar com sua largura (respeitando a proporção), poderíamos usar um valor percentual para a padding
propriedade superior / inferior .
Um valor percentual no preenchimento / margens superior / inferior é relativo à largura do bloco que o contém.
Por exemplo:
.responsive-container {
width: 60%;
padding-top: 60%; /* 1:1 Height is the same as the width */
padding-top: 100%; /* width:height = 60:100 or 3:5 */
padding-top: 45%; /* = 60% * 3/4 , width:height = 4:3 */
padding-top: 33.75%; /* = 60% * 9/16, width:height = 16:9 */
}
Aqui está a demonstração online . Comente as linhas da parte inferior e redimensione o painel para ver o efeito.
Além disso, poderíamos aplicar a padding
propriedade a um filho fictício ou :before
/ :after
pseudoelemento para obter o mesmo resultado. Mas observe que, nesse caso, o valor percentual ativado padding
é relativo à largura do .responsive-container
próprio.
<div class="responsive-container">
<div class="dummy"></div>
</div>
.responsive-container { width: 60%; }
.responsive-container .dummy {
padding-top: 100%; /* 1:1 square */
padding-top: 75%; /* w:h = 4:3 */
padding-top: 56.25%; /* w:h = 16:9 */
}
Demo # 1 .
Demo # 2 (usando :after
pseudo-elemento)
Adicionando o conteúdo
O uso da padding-top
propriedade causa um enorme espaço na parte superior ou inferior do conteúdo, dentro do contêiner .
Para corrigir isso, temos que envolva o conteúdo por um elemento de invólucro, remover esse elemento de documento fluxo normal usando posicionamento absoluto e, finalmente, expandir o invólucro (bu usando top
, right
, bottom
e left
propriedades) para preencher todo o espaço de seu pai, o recipiente .
Aqui vamos nós:
.responsive-container {
width: 60%;
position: relative;
}
.responsive-container .wrapper {
position: absolute;
top: 0; right: 0; bottom: 0; left: 0;
}
Aqui está a demonstração online .
Reunindo todos
<div class="responsive-container">
<div class="dummy"></div>
<div class="img-container">
<img src="http://placehold.it/150x150" alt="">
</div>
</div>
.img-container {
text-align:center; /* Align center inline elements */
font: 0/0 a; /* Hide the characters like spaces */
}
.img-container:before {
content: ' ';
display: inline-block;
vertical-align: middle;
height: 100%;
}
.img-container img {
vertical-align: middle;
display: inline-block;
}
Aqui está a demonstração de trabalho .
Obviamente, você pode evitar o uso de ::before
pseudoelemento para compatibilidade do navegador e criar um elemento como o primeiro filho do .img-container
:
<div class="img-container">
<div class="centerer"></div>
<img src="http://placehold.it/150x150" alt="">
</div>
.img-container .centerer {
display: inline-block;
vertical-align: middle;
height: 100%;
}
DEMO ATUALIZADO .
Usando max-*
propriedades
Para manter a imagem dentro da caixa em largura menor, você pode definir max-height
e max-width
propriedade na imagem:
.img-container img {
vertical-align: middle;
display: inline-block;
max-height: 100%; /* <-- Set maximum height to 100% of its parent */
max-width: 100%; /* <-- Set maximum width to 100% of its parent */
}
Aqui está a demo atualizada .