2010-05-27 28 views
24

Sono sicuro che la risposta è no, ma è possibile determinare la larghezza di un elemento prima del che viene aggiunto al DOM?DOM Larghezza elemento prima aggiunta al DOM

Una volta aggiunto, so che posso usare offsetWidth e offsetHeight.

Grazie

risposta

17

Il trucco è quello di mostrare l'elemento (display: block), ma anche nasconderlo (visibility: hidden) e per impostare la sua posizione a assoluta in modo che non influisce sul flusso di pagina.

La classe MooTools Element.Measure fa questo, come ha menzionato Oscar.

5

non è possibile, almeno non accuratamente, perché styling colpisce queste proprietà, e dove verrà posizionato determina la modalità di stile e quali regole incidono su di esso.

Ad esempio, il posizionamento di un <p></p> nella pagina corrisponderà per impostazione predefinita alla larghezza del corpo se aggiunto come un bambino, ma se lo si è appostato all'interno ad esempio a <div style="width: 100px;"></div>, si vedrà come questo cambi rapidamente le cose.

+4

+1, con ulteriore: l'elemento non sarà effettivamente reso finché la corrente di esecuzione JavaScript ferma. Ciò significa che è possibile aggiungere, ottenere le dimensioni e rimuovere di nuovo senza alcuna indicazione visiva che qualcosa è successo. –

7

Quello che puoi fare con MooTools è usare la classe Element.Misura - cioè, devi iniettare l'elemento nel DOM, ma tenerlo nascosto. Ora puoi misurare l'elemento senza effettivamente mostrarlo.

http://mootools.net/docs/more/Element/Element.Measure

+0

+1 Nice, un'altra bella gemma MooTools. Grazie. – Steve

11

L'elemento Mootools. La funzionalità di misura menzionata da Oscar è eccezionale. Per coloro che utilizzano jQuery, ecco un rapido plugin che compie la stessa cosa: (grazie Sam Fen per la segnalazione)

$.fn.measure = (fn)-> 
    el = $(this).clone(false) 
    el.css 
    visibility: 'hidden' 
    position: 'absolute' 
    el.appendTo('body') 
    result = fn.apply(el) 
    el.remove() 
    return result 

si può chiamare così, avendo cura di restituire il valore:

width = $('.my-class-name').measure(function(){ return this.width() }) 
+1

So che questo è stato postato molto tempo fa, ma per chiunque come me che cerca di applicare questo, è necessario * restituire * il valore nella funzione che si passa. Quindi 'width = $ ('. My-class-name ') .measure (function() {return this.width()})' –

+0

Aggiornato - grazie a @SamFen. :) – jpadvo

+1

Grandi cose. Attualmente in uso con RequireJS - https://gist.github.com/simonsmith/5135933 –

0

Modificato leggermente il codice. Ecco una soluzione pura JS:

function measure(el, fn) { 
 
    var pV = el.style.visibility, 
 
     pP = el.style.position; 
 
     
 
    el.style.visibility = 'hidden'; 
 
    el.style.position = 'absolute'; 
 
    
 
    document.body.appendChild(el); 
 
    var result = fn(el); 
 
    el.parentNode.removeChild(el); 
 
    
 
    el.style.visibility = pV; 
 
    el.style.position = pP; 
 
    return result; 
 
} 
 

 
var div = document.createElement('div'); 
 
div.innerHTML = "<p>Hello</p><br/>"; 
 

 
alert(div.offsetHeight); // 0 
 

 
alert(measure(div, function(el){return el.offsetHeight})); // 68