2010-04-07 7 views
97

Sto scrivendo un sito utilizzando jquery che chiama ripetutamente $(window).width() e $(window).height() per posizionare e dimensionare elementi in base a la dimensione del viewport.

Nella risoluzione dei problemi, ho scoperto che sto ottenendo report di dimensioni viewport leggermente diversi nelle chiamate ripetute alle funzioni jQuery sopra riportate quando la finestra non viene ridimensionata.

Chiedendosi se c'è qualche caso particolare, qualcuno sa di quando succede, o se è proprio così. La differenza nelle dimensioni riportate è 20px o meno, sembra. Accade in Safari 4.0.4, Firefox 3.6.2 e Chrome 5.0.342.7 beta su Mac OS X 10.6.2. Non ho ancora provato altri browser perché non sembra essere specifico per il browser. Non ero nemmeno in grado di capire da cosa dipende la differenza, se non è la dimensione della finestra, potrebbe esserci un altro fattore che rende i risultati diversi?

Qualsiasi intuizione sarebbe apprezzata.


aggiornamento:

Si non i valori di $(window).width() e $(window).height() che cambiano. Sono i valori delle variabili che sto usando per memorizzare i valori di cui sopra.

Non ci sono barre di scorrimento che influenzano i valori, non appaiono barre di scorrimento quando i valori delle variabili cambiano. Ecco il mio codice per memorizzare i valori nelle mie variabili (che sto facendo solo in modo che siano più brevi).

(tutto questo è a $(document).ready())

// inizialmente dichiarare le variabili per essere visibili a otehr funzioni all'interno .ready()

var windowWidth = $(window).width(); //retrieve current window width 
var windowHeight = $(window).height(); //retrieve current window height 
var documentWidth = $(document).width(); //retrieve current document width 
var documentHeight = $(document).height(); //retrieve current document height 
var vScrollPosition = $(document).scrollTop(); //retrieve the document scroll ToP position 
var hScrollPosition = $(document).scrollLeft(); //retrieve the document scroll Left position 


function onm_window_parameters(){ //called on viewer reload, screen resize or scroll 

    windowWidth = $(window).width(); //retrieve current window width 
    windowHeight = $(window).height(); //retrieve current window height 
    documentWidth = $(document).width(); //retrieve current document width 
    documentHeight = $(document).height(); //retrieve current document height 
    vScrollPosition = $(document).scrollTop(); //retrieve the document scroll ToP position 
    hScrollPosition = $(document).scrollLeft(); //retrieve the document scroll Left position 

}; //end function onm_window_parameters() 

ho inserito una relazione d'allarme per sondare le variabili di cui sopra contro i valori che dovrebbero avere in mano. I valori $(item).param() rimangono coerenti, ma le variabili cambiano per motivi che non riesco a capire.

Ho cercato i punti in cui il mio codice potrebbe alterare il valore delle variabili in questione, anziché recuperare solo i valori impostati e non trovarne nessuno. Posso postare l'intera shebang da qualche parte se questa è una possibilità.

risposta

92

Penso che quello che stai vedendo sia il nascondere e mostrare le barre di scorrimento. Here's a quick demo showing the width change.

Per inciso: hai bisogno di sondare costantemente? Potreste essere in grado di ottimizzare il codice per eseguire l'evento di ridimensionamento, come questo:

$(window).resize(function() { 
    //update stuff 
}); 
+1

btw, avevi ragione dopo tutto ... durante la risoluzione dei problemi ho notato che c'erano barre di scorrimento. apparivano così brevemente che non potevano essere visti se non in modalità debug con la sceneggiatura sospesa a metà dell'esecuzione. una volta rimosse le variabili e la funzione di cui sopra, alcuni elementi saltarono ancora dalla posizione - aveva a che fare con l'ordine delle istruzioni di script - dovevo solo assicurarmi di resettare il div tenendo le immagini inserite a css left: 0 prima di inserire l'immagine . morale alla storia: solo perché le barre di scorrimento non appaiono abbastanza a lungo da essere viste, non significa che non erano lì! –

+0

Vorrei anche usare questa domanda: http://stackoverflow.com/questions/2854407/javascript-jquery-window-resize-how-to-fire-after-the-resize-is-completed in modo da poter controllare una volta che il ridimensionamento l'evento è finito prima di fare qualsiasi cosa. Lo script eseguirà ciò che è sempre nella funzione .resize() ogni pixel che ridimensionate, quindi è meglio aspettare. – MarkP

1

ho avuto un problema molto simile. Stavo ottenendo valori di altezza() incoerenti quando ho aggiornato la mia pagina. (Non era la mia variabile a causare il problema, era il valore effettivo dell'altezza.)

Ho notato che nella parte iniziale della mia pagina ho chiamato prima i miei script, poi il mio file css. Sono passato in modo che il file css sia collegato per primo, poi i file di script e questo sembra aver risolto il problema finora.

Spero che questo aiuti.

+0

In realtà, il mio problema originale era che il modo in cui i miei elementi si posizionavano attorno alla pagina causava la visualizzazione di barre di scorrimento per una frazione di secondo, poiché la misura non era sufficiente ma l'occhio non riusciva a catturarla ... I capito questo una volta ho messo le dichiarazioni di allarme tra le mie dichiarazioni javascript per rompere il codice in stati distinti. L'ho fatto in modo che potessi fare in modo che gli avvisi riportassero le misurazioni in ogni fase dell'esecuzione del codice. In quel momento ho notato che uno degli stati ha causato la comparsa di barre di scorrimento, il che è lo stato in cui è stata effettuata la misurazione. –

+1

Posso confermare la stessa cosa con le barre di scorrimento. Farei una lettura di $ (window) .height() dopo aver ridimensionato il browser e potrebbe mostrare qualcosa come 500. Quindi aggiornerei (senza ridimensionare il browser) e mostrerebbe qualcosa di più grande come 700. Nel mio caso, sono stato in grado di risolverlo semplicemente facendo overflow: nascosto sul corpo, perché non voglio mai che le barre di scorrimento si accendano. Una volta fatto ciò, il rapporto sull'altezza era coerente. – Susan

9

tenta di utilizzare un

  • $(window).load evento

o

  • $(document).ready

    poiché i valori iniziali possono essere incostanti causa dei cambiamenti che si verificano durante il parsing o durante il carico del DOM.

3

Si noti che se il problema è provocato da barre di scorrimento che appaiono, mettendo

body { 
    overflow: hidden; 
} 

nel CSS potrebbe essere una soluzione semplice (se non è necessario nella pagina per scorrere).