2012-03-19 18 views
14

Sto creando un sito web e sto cercando di centro in verticale:Perché è superiore: il 50% in css non funziona?

position: absolute; 
width:1200px; 
height:600px; 
top: 50%; 
left: 50%; 
margin-left: -600px; 

e il mio HTML è una singola proprietà div

+1

Fare 'left: 50%;' e quindi 'margin-left: -600px;' non ha molto senso, dal momento che stai solo cancellando l'uno con l'altro. –

+0

swenflea: ho modificato la mia domanda con informazioni sull'effetto 'position' dell'elemento genitore. –

+0

In realtà, puoi essere più specifico con la domanda? Vuoi che il tuo DIV sia al centro della pagina. Intendo il centro esatto ....? –

risposta

13

Il CSS top funziona esattamente come left. Lo spinge il div da quella direzione. Quando scrivi top:50%, lo div verrà spostato in basso del 50% dall'alto. Vuoi che sia centrato verticalmente, quindi devi neutralizzarlo con tirandolo di nuovo su. Questo può essere fatto usando margin-top: -300px proprio come hai usato margin-left: -600px a tiralo a sinistra.

position: absolute; 
width: 1200px; 
height: 600px; 
top: 50%; 
margin-top: -300px; 
left: 50%; 
margin-left: -600px; 
+1

Questo funziona per elementi di altezza fissa.Per altezze variabili, utilizzare [this] (http://stackoverflow.com/a/29232492/3389737). – Luke

2

top:50%; funziona bene, ma "centro" solito la voce, sarà posto è bordo superiore del 50% dell'altezza della pagina dall'alto. Allo stesso modo di come avete margin-left:-600px; si dovrebbe anche aggiungere margin-top:-300px;

+1

Mi spiace che non funzioni ... lo infila solo -300px dalla parte superiore della pagina ... Devo avere uno stile per le div esterne o le div interne? – swenflea

+0

Lo stai riscontrando in un browser specifico? Fintanto che si tratta di posizione: assoluta, gli stili sugli elementi contenenti non dovrebbero avere importanza a meno che il selettore che stai utilizzando sia più specifico e stia sovrascrivendo lo stile che hai elencato sopra. – lukiffer

0

Credo che questo possa in qualche modo imitare la risposta Kristian ha dato, ma ecco i miei due centesimi, che include l'utilizzo di percentuali e dimostra anche uno all'interno di un altro:

#parent { 
    position: absolute; 
    top: 50%; 
    left: 50%; 
    width: 120px; 
    height: 60px; 
    margin: -60px 0 0 -30px; 
    background: blue; 
} 
#center { 
    position: absolute; 
    width: 50%; 
    height: 50%; 
    top: 50%; 
    left: 50%; 
    margin: -12.5% 0 0 -25%; 
    background: green; 
} 

http://jsfiddle.net/userdude/MYD27/

EDIT

Guardando ulteriormente, penso che si potrebbe incorrere in problemi se si sta cercando per fare ciò con un elemento non contenitore all'interno di un elemento posizionato. Ad esempio:

Full View | Code View

Non penso che funzioni nel modo desiderato. Quando aggiungo position: relative (o, in alternativa position: absolute), funziona penso come desiderato:

Full View | Code View

+0

+1 per la spiegazione sulla "posizione: relativa" (o assoluta) nel DIV genitore. Questo è ciò che ha funzionato per me. –

0

vorrei cogliere l'occasione per palesemente auto-promuovono my answer to another question here on SO :)

Detto questo, css proprietà "top" viene correttamente calcolato sulla base dell'altezza del elemento contenitore - in modo efficace rendendo l'elemento di destinazione sotto la linea mediana. Ciò significa che l'elemento deve essere spinto a metà altezza come spiegato nella domanda collegata.

Purtroppo tale compito apparentemente semplice, non può essere realizzato regolando margine superiore ecc senza utilizzare valori basati sui pixel assoluti (+1 richiesta di risposta Kristian Antonsen s') - si potrebbe immaginare modificando margin-top a "-50 %" significherebbe proprio questo, ma secondo css spec, valori dei margini anche sull'asse verticale vengono calcolate come a percentage always relative to the width of the containing block

0

È possibile utilizzare

calc(%50 - (items_height/2)); 

al centro.

24

Penso che questo dovrebbe essere utile :)

i{ 
 
    -webkit-transform: translate(-50%,-50%); 
 
    transform: translate(-50%,-50%); 
 
    position: absolute; 
 
    top: 50%; 
 
    left: 50%; 
 
}
<i>center</i>

+1

questa è la migliore soluzione IMO. – Kevin

+1

grazie! Sono stato alla ricerca di questo per sempre! –

+1

Questo non funzionerà se il tuo genitore non ha altezza statica, a meno che tu non abbia l'altezza: 100%; sia sul tuo html che sul tuo corpo. Puoi controllare la mia risposta qui sotto se hai bisogno di maggiori informazioni. Inoltre, in alcune situazioni non è assolutamente necessaria la posizione assoluta. Questo può funzionare con 'position: relative;' per coloro che sono preoccupati di optare per questa soluzione che ha bisogno di mantenere la relazione di posizionamento con altri elementi. Sebbene sia necessario un valore di posizione diverso da 'position: static;' per il 'top' e' left' per funzionare. (o anche 'bottom',' right', o'z-index') –

12

Per rispondere alla tua domanda perché top: 50% non funziona, quando si utilizza la proprietà top su un elemento, il genitore di quell'elemento deve avere un'altezza statica impostata. Questo dovrebbe essere in px o un'unità diversa da percentuale. Se hai davvero bisogno di usare la percentuale anche nei tuoi genitori, allora puoi passare al genitore successivo (che è il genitore di quel genitore) e avere quell'altezza statica fissa.

Centrare verticalmente nulla. I prefer to use this method

L'uso di CSS transform poiché non è necessario conoscere la larghezza dell'altezza del proprio elemento.

position: relative; 
top: 50%; 
left: 50%; 
-webkit-transform: translate(-50%, -50%); 
-moz-transform: translate(-50%, -50%); 
-ms-transform: translate(-50%, -50%); 
-o-transform: translate(-50%, -50%); 
transform: translate(-50%, -50%); 

Non dimenticare di aggiungere prefissi del browser/vendor.

You can refer here for vendor prefixes.


Se non si conosce l'altezza del vostro genitore. Sono disponibili due opzioni:

  1. utilizzando Javascript prendere l'altezza naturale dell'elemento genitore e quindi impostare la proprietà altezza di tale elemento genitore al valore appena scattata. Puoi usare questo metodo quando l'altezza dell'elemento genitore è causata da un altro elemento figlio che è fratello dell'elemento che stai centrando.

$('.parent').height($(this).height());
.parent { 
 
    /* Unkown height */ 
 
} 
 

 
.child { 
 
    /* Create columns */ 
 
    width: 50%; 
 
    float: left; 
 
} 
 

 
.child-1 { 
 
    position: relative; 
 
    top: 50%; 
 
    text-align: center; 
 
    -webkit-transform: translateY(-50%); 
 
    -moz-transform: translateY(-50%); 
 
    -ms-transform: translateY(-50%); 
 
    -o-transform: translateY(-50%); 
 
    transform: translateY(-50%); 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 
<!-- Example Start --> 
 
<div class="parent"> 
 
    <div class="child child-1"> 
 
    Lorem ipsum 
 
    </div> 
 
    <div class="child child-2"> 
 
    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. 
 
    </div> 
 
</div>

Suggerimento: se si sta assumendo reattivo in preoccupazione, basta impostare l'altezza di nuovo in JavaScript nel browser di ridimensionamento. Puoi ottenere la nuova altezza naturale impostando l'altezza su Auto in JavaScript e ripetere la procedura.

  1. È possibile graffiare le idee sopra e utilizzare invece il centraggio con display: table. CSS-Tricks has a very good example here.
+1

"quando si è la proprietà in cima a un elemento, il genitore di quell'elemento deve avere un'altezza statica impostata" - Questa era la risposta alla domanda. Risolto il mio problema in safari. – codescribblr

+1

RE: "il genitore di quell'elemento deve avere un'altezza statica impostata". Nota 1: HTML e body possono essere considerati genitori se non ci sono i genitori div. Nota 2: A% funzionerà anche. Per esempio amp.css contiene la riga: html, body {altezza: auto importante;} Ciò può causare gli annunci da decapitati quando si tira il proprio remote.html/frame.max.amp.html meno che non si aggiungi questo css al seguente indirizzo: html, body {height: 100%! important;} Ciò consentirà il massimo: 50% di lavoro. –

Problemi correlati