2011-09-13 10 views
6

Ho scritto il seguente script per visualizzare un elemento nascosto, quindi correggere la sua posizione al centro della pagina.offsetHeight e offsetWidth che calcolano erroneamente sul primo evento onclick, non secondo

function popUp(id,type) { 
var popUpBox = document.getElementById(id); 

popUpBox.style.position = "fixed"; 
popUpBox.style.display = "block"; 

popUpBox.style.zIndex = "6"; 

popUpBox.style.top = "50%"; 
popUpBox.style.left = "50%"; 

var height = popUpBox.offsetHeight; 
var width = popUpBox.offsetWidth; 
var marginTop = (height/2) * -1; 
var marginLeft = (width/2) * -1; 

popUpBox.style.marginTop = marginTop + "px"; 
popUpBox.style.marginLeft = marginLeft + "px"; 
} 

Quando questa funzione viene richiamata da un evento onclick, l'offsetHeight e offsetWidth sono calcolati in modo errato, quindi non centrare correttamente l'elemento. Se faccio clic sull'elemento onclick una seconda volta, offsetHeight e offsetWidth vengono calcolati correttamente.

Ho provato a cambiare l'ordine in ogni modo che posso immaginare, e questo mi sta facendo impazzire! Qualsiasi aiuto è molto apprezzato!

+0

Hmm, il tuo codice sembra funzionare correttamente per me? http://jsfiddle.net/mrtsherman/SdTEf/1/ – mrtsherman

+3

@mtrsherman, GRAZIE. Sei jsfiddle mi ha mostrato l'errore dei miei modi. Fai attenzione: se non definisci altezza e larghezza per l'elemento che desideri determinare l'altezza e la larghezza, non otterrai l'altezza e la larghezza corrette usando offsetHeight e offsetWidth. – saoyr5

+0

Yay. Sono felice che tu l'abbia risolto. Problemi come questo in cui tutto sembra ok, ma non lo sono: fai esplodere la testa! – mrtsherman

risposta

1

Immagino che l'altezza e la larghezza non siano definite sul genitore. Vedi questo violino dove funziona bene. Ragazzo, sono intelligente http://jsfiddle.net/mrtsherman/SdTEf/1/

Vecchio risposta penso che questo può essere fatto molto di più semplice. Stai impostando le proprietà superiore e sinistra al 50%. Questo metterà l'elemento fisso leggermente fuori dal centro. Penso che tu stia cercando di riportarlo nella posizione corretta usando margini negativi. Invece - calcola i valori iniziali/sinistro corretti dall'inizio e non preoccuparti del margine. Ecco una soluzione jQuery, ma può essere facilmente adattata a plain js. Penso anche che il tuo codice attuale non funzionerà se la finestra è stata scorsa a tutti.

//this code will center the following element on the screen 
$('#elementid').click(function() { 
    $(this).css('position','fixed'); 
    $(this).css('top', (($(window).height() - $(this).outerHeight())/2) + $(window).scrollTop() + 'px'); 
    $(this).css('left', (($(window).width() - $(this).outerWidth())/2) + $(window).scrollLeft() + 'px'); 
}); 
+0

Sei corretto, il tuo modo funzionerà (l'ho testato per assicurarmi che offsetHeight e offsetWidth fossero corretti), tranne che non puoi ridimensionare la finestra e avere il div rimanere perfettamente centrato, che è qualcosa Sto cercando. Sono davvero interessato al motivo per cui il mio offsetHeight e offsetWidth non mi danno i numeri corretti, poiché uso sempre questa tecnica css e mi dà sempre l'effetto desiderato. – saoyr5

+0

Ah, vedo ora. Ho upvoted la tua domanda, quindi spero che qualcuno possa ottenere una risposta migliore. Potresti associare il precedente all'evento '$ (window) .resize()', ma il tuo metodo è sicuramente più elegante. – mrtsherman

Problemi correlati