2010-05-27 50 views

Odpowiedz

17

Sztuką jest pokazać element (display: block), ale również ukryć go (visibility: hidden) i ustawić jego pozycję na absolutną, tak że nie ma wpływu na przepływ strony.

Klasa MooTools Element.Measure robi to, jak wspomniano Oscar.

5

To nie jest możliwe, przynajmniej nie dokładnie, bo stylizacji wpływa te właściwości, a tam gdzie to umieścić określa, jak to jest stylizowany i co wpływa na to reguły.

Na przykład umieszczenie na stronie <p></p> będzie domyślnie szerokością ciała, jeśli zostanie do niej dołączone jako dziecko, ale jeśli wstawiłeś ją do wnętrza, na przykład <div style="width: 100px;"></div>, zobaczysz, jak szybko to zmienia.

+4

+1, a dodatkowe: element w rzeczywistości nie być świadczone aż prąd wykonanie JavaScript oporu. Oznacza to, że możesz dodawać, uzyskiwać wymiary i usuwać ponownie bez żadnego wizualnego wskazania, że ​​coś się stało. –

7

Co można zrobić z MooTools jest użyć klasy Element.Measure - oznacza to, wstrzyknąć elementem DOM, ale utrzymać go w ukryciu. Teraz możesz zmierzyć element bez pokazywania go.

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

+0

+1 Niezły, kolejny fajny klejnot MooTools. Dzięki. – Steve

11

Funkcja Mootools Element.Measure, o której wspomniał Oscar, jest niesamowita. Dla tych, którzy używać jQuery, oto szybkie plugin, który realizuje to samo: (! Dzięki Sam Fen za wskazanie, że obecnie)

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

można nazwać to w ten sposób, upewniając się, aby zwrócić wartość:

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

Wiem, że zostało to opublikowane dawno temu, ale dla kogoś takiego jak ja, który próbuje zastosować to, musisz * zwrócić * wartość w funkcji, którą przekazujesz. Tak więc 'width = $ ('. Moje-class-name ') .measure (function() {return this.width()})' –

+0

Zaktualizowany - dzięki @SamFen. :) – jpadvo

+1

Świetne rzeczy. Obecnie używa go z RequireJS - https://gist.github.com/simonsmith/5135933 –

0

Trochę zmodyfikował kod. Oto czystego roztworu 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

Powiązane problemy