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 heightproprietà in modo 100%che prenda tutta l'altezza del suo genitore .
2) Inoltre, l'aggiunta vertical-align: middlemantiene 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-sizeproprietà di divper 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 paddingproprietà 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 paddingproprietà a un bambino fittizio o :before/ :afterpseudo-elemento per ottenere lo stesso risultato. Ma nota che in questo caso, il valore percentuale paddingè relativo alla larghezza della .responsive-containerstessa.
<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 :afterpseudo-elemento)
Aggiunta del contenuto
L'uso della padding-topproprietà 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, bottome leftproprietà) 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 ::beforepseudo-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-heighte max-widthproprietà 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 .