2011-09-13 10 views
6

Napisałem poniższy skrypt, aby wyświetlić ukryty element, a następnie popraw jego pozycję na środku strony.offsetHeight i offsetWidth niepoprawnie obliczające pierwsze zdarzenie onclick, nie drugie

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"; 
} 

Gdy ta funkcja jest wywoływana przez zdarzenie onclick The offsetHeight i offsetWidth obliczono nieprawidłowe, co nie jest prawidłowo centrowania elementu. Jeśli kliknę element onclick po raz drugi, offsetHeight i offsetWidth obliczają poprawnie.

Próbowałem zmienić kolejność w każdy możliwy sposób, jaki mogę sobie wyobrazić, a to doprowadza mnie do szału! Wszelaka pomoc jest bardzo doceniana!

+0

Hmm, Twój kod wydaje się działać dobrze dla mnie? http://jsfiddle.net/mrtsherman/SdTEf/1/ – mrtsherman

+3

@mtrsherman, DZIĘKUJĘ. Jesteś jsfiddle pokazał mi błąd moich sposobów. Zwróćmy uwagę: jeśli nie zdefiniujesz wysokości i szerokości elementu, który chcesz określić wysokość i szerokość, nie uzyskasz prawidłowej wysokości i szerokości za pomocą offsetHeight i offsetWidth. – saoyr5

+0

Yay. Cieszę się, że to rozwiązałeś. Takie problemy, w których wszystko wydaje się w porządku, ale nie jest - niech głowa chce wybuchnąć! – mrtsherman

Odpowiedz

1

Zgaduję, że twój wzrost i szerokość nie są zdefiniowane w rodzicu. Zobacz to skrzypce, gdzie działa dobrze. Chłopie, jestem mądry. http://jsfiddle.net/mrtsherman/SdTEf/1/

Stara odpowiedź Myślę, że można to zrobić o wiele prościej. Ustawiasz górne i lewe właściwości na 50%. Spowoduje to lekki element stały ze środka. Myślę, że próbujesz następnie przywrócić go do właściwej pozycji, używając ujemnych marginesów. Zamiast tego - po prostu obliczyć prawidłowe górne/lewe wartości od początku i nie martw się o margines. Oto rozwiązanie jQuery, ale można je łatwo dostosować do zwykłego js. Uważam też, że twój obecny kod nie zadziała, jeśli okno zostało przewinięte w ogóle.

//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

Masz rację, jesteś na dobrej drodze (przetestowałem to, aby upewnić się, że offsetHeight i offsetWidth były poprawne), z tym że nie możesz zmienić rozmiaru okna i mieć div idealnie wyrównany, co jest czymś Szukam. Jestem naprawdę najbardziej zainteresowany tym, dlaczego moja offsetHeight i offsetWidth nie podają mi poprawnych liczb, ponieważ cały czas używam tej techniki css i zawsze daje mi to pożądany efekt. – saoyr5

+0

Ahh, teraz widzę. Przegłosowałem twoje pytanie, więc mam nadzieję, że ktoś dostanie lepszą odpowiedź. Możesz powiązać powyższe z zdarzeniem '$ (window) .resize()', ale twoja metoda jest z pewnością bardziej elegancka. – mrtsherman

Powiązane problemy