2013-07-23 37 views
7

Sto cercando di centrare il testo sia verticalmente che orizzontalmente su un'immagine che cresce quando la pagina si allarga.Testo verticalmente e orizzontalmente centrato su un'immagine reattiva

Originariamente avevo impostato l'immagine come sfondo per un div di altezza fissa, nel qual caso era relativamente facile centrarlo, ma poiché le immagini di sfondo non sono strutturali, non potrei impostare l'altezza per essere un funzione automatica della larghezza, e ho dovuto buttare questa opzione quando sono andato per un design più reattivo.

Così ho attualmente un div con due elementi in esso, img e testo overlay. La larghezza dell'immagine è impostata al 100% della larghezza del suo contenitore e l'altezza varia di conseguenza. Di conseguenza, non posso impostare il testo di sovrapposizione come posizione: assoluta e superiore: 80px o qualcosa, perché la distanza dalla parte superiore dovrà variare. E anche facendo top: 25% o qualsiasi altra cosa non funziona, perché a) se la larghezza della pagina si riduce per comprimere il testo, o se c'è solo più testo, il centraggio verticale viene eliminato quando ci sono più/meno linee, e b) la percentuale è arbitraria - non è 50 o qualcosa del genere, perché ciò metterebbe il in cima del testo sovrapposto del 50% verso il basso l'immagine, quando voglio il centro dell'overlay .

Ho guardato, tra l'altro, a this post, che è decisamente vicino - ma in entrambe le soluzioni, l'altezza dell'immagine non è in grado di ridimensionare, e nel primo caso, il JS si carica al caricamento della pagina, ma poi si blocca , così se cambio la larghezza/altezza della pagina, le cose finiscono male. Idealmente, questa soluzione non coinvolgerebbe JS proprio per quel motivo (anche se ricaricato su ogni ridimensionamento, che non sembra ideale), ma se questa è l'unica soluzione, la prenderò.

Inoltre, solo per i dettagli aggiunti/divertimento, ho impostato un altezza massima sull'immagine, perché non voglio che superi l'altezza di circa 300px, anche su un monitor cinematografico.

Basic fiddle of current attempt here e codice identico di seguito. Qualche idea? Grazie!

html

<div class='quotation_div'> 
    <img src='http://www.mountainprofessor.com/images/mount-ranier-mount-features-2.jpg'> 
    <div class='overlay'> 
     <p>Any reasonable amount of text should be able to go here. I want it to be able to center vertically even if it takes up 2 or 3 lines.</p> 
    </div> 
</div> 

css

.quotation_div { 
position: relative; 
display: table; 
} 
img { 
    width: 100%; 
    max-height: 300px; 
} 
.overlay { 
    z-index: 99; 
    width: 70%; 
    margin-left: 15%; 
    vertical-align: middle; 
    position: absolute; 
    top: 25%; /* Obvious problem, cause it's arbitrary */ 
} 
p { 
    text-align: center; 
    color: red; 
    font-size: 165%; 
    font-weight: lighter; 
    line-height: 2; 
} 
+0

Possibile duplicato http://stackoverflow.com/questions/59309/how-to-vertically-center-content-with-variable-height-within-a-div – user1477388

+0

Eventuale duplicato http://stackoverflow.com/questions/14113676/vertically-center-a-div-with-variable-height-within-a-div-that-is-100-of-the-vi – user1477388

+0

Un'altra soluzione qui: http: //stackoverflow.com/questions/21562253/vertical-centering-some-text-over-an-image-with-dynamic-height/21562992#21562992 –

risposta

6

È possibile utilizzare i CSS background-size per impostare la larghezza su 100% e l'altezza sarà calcolata per mantenere le proporzioni.

Ecco a fiddle utilizzando tale tecnica.

Se si desidera che l'immagine come un elemento HTML, allora vi consiglio di impostare la sua posizione di assoluta e utilizzare lo stesso metodo di disply:table-cell per centrare la sovrapposizione:

Ecco a fiddle utilizzando tale metodo, questo allunga la immagine a causa dello max-height.

+0

Impressionante. Ho finito col prendere il consiglio della prima opzione, andando con l'immagine di sfondo. Due avvertimenti: ho anche dovuto impostare la larghezza dello sfondo div al 100%, perché l'immagine era meno ampia in pixel rispetto alla larghezza della finestra, per il mio grande display. Inoltre, penso che questo abbia funzionato solo nel mio caso (con un sacco di contenuto di impilamento), quando il testo di sovrapposizione interno aveva margini verticali per dare al contenitore un'altezza verticale definita. In ogni caso, funziona alla grande. Grazie! – Sasha

-1

Ho appena aggiunto alla html

<div align="center"></div>

per circondare il codice esistente per ottenere l'immagine per centrare

speranza che aiuta

1

Si prega di provare il seguito css per .overlay come nel tuo violino

.overlay { 
    z-index: 99; 
    width: 70%; 
    /* height: 100%; */ 
    /* margin-left: 15%; */ 
    /* vertical-align: middle; */ 
    position: absolute; 
    top: 50%; 
    left: 50%; 
    transform: translate(-50%,-50%); 
} 

o questo è il collegamento di violino aggiornato http://jsfiddle.net/hLdbZ/284/

Problemi correlati