Ecco una tecnica per allineare gli elementi incorporati all'interno di un genitore , orizzontalmente e verticalmente allo stesso tempo:
Allineamento verticale
1) In questo approccio, creiamo un inline-block
(pseudo-) elemento come primo (o ultimo) figlio del genitore , e impostiamo la sua height
proprietà in modo 100%
che prenda tutta l'altezza del suo genitore .
2) Inoltre, l'aggiunta vertical-align: middle
mantiene gli elementi in-line (-block) al centro dello spazio della linea. Quindi, aggiungiamo quella dichiarazione CSS al primo figlio e al nostro elemento (l' immagine ) entrambi.
3) Infine, al fine di rimuovere il carattere dello spazio bianco tra gli elementi inline (-block) , potremmo impostare a zero la dimensione del carattere del genitorefont-size: 0;
.
Nota: ho usato la tecnica di sostituzione dell'immagine di Nicolas Gallagher nel seguito.
Quali sono i vantaggi?
- Il contenitore ( padre ) può avere dimensioni dinamiche.
Non è necessario specificare esplicitamente le dimensioni dell'elemento immagine.
Possiamo facilmente usare questo approccio per allineare un <div>
elemento anche verticalmente ; che può avere un contenuto dinamico (altezza e / o larghezza). Si noti che è necessario reimpostare la font-size
proprietà di div
per visualizzare il testo 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 */
}
Il risultato

Contenitore reattivo
Questa sezione non risponderà alla domanda poiché l'OP sa già come creare un contenitore reattivo. Tuttavia, ti spiego come funziona.
Per modificare l' altezza di un elemento contenitore con la sua larghezza (rispettando le proporzioni), è possibile utilizzare un valore percentuale per la padding
proprietà top / bottom .
Un valore percentuale sull'imbottitura superiore / inferiore o sui margini è relativo alla larghezza del blocco contenitore.
Per esempio:
.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 */
}
Ecco la demo online . Commenta le linee dal basso e ridimensiona il pannello per vedere l'effetto.
Inoltre, potremmo applicare la padding
proprietà a un bambino fittizio o :before
/ :after
pseudo-elemento per ottenere lo stesso risultato. Ma nota che in questo caso, il valore percentuale padding
è relativo alla larghezza della .responsive-container
stessa.
<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 n . 1 .
Demo n. 2 (utilizzo dello :after
pseudo-elemento)
Aggiunta del contenuto
L'uso della padding-top
proprietà provoca un enorme spazio nella parte superiore o inferiore del contenuto, all'interno del contenitore .
Per rimediare, abbiamo avvolgere il contenuto da un elemento contenitore, rimuovere tale elemento dal flusso normale documento utilizzando il posizionamento assoluto , e infine espandere l'involucro (bu usando top
, right
, bottom
e left
proprietà) per riempire l'intero spazio del suo genitore, il contenitore .
Eccoci qui:
.responsive-container {
width: 60%;
position: relative;
}
.responsive-container .wrapper {
position: absolute;
top: 0; right: 0; bottom: 0; left: 0;
}
Ecco la demo online .
Stare tutti insieme
<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;
}
Ecco la DEMO DI LAVORO .
Ovviamente, potresti evitare di usare lo ::before
pseudo-elemento per la compatibilità del browser e creare un elemento come primo figlio di .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 AGGIORNATA .
Utilizzando le max-*
proprietà
Per mantenere l'immagine all'interno della scatola di larghezza inferiore, è possibile impostare max-height
e max-width
proprietà sull'immagine:
.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 */
}
Ecco la DEMO AGGIORNATA .