2010-02-04 8 views
9

Mam kilka obrazów, które są ustawione absolutnie, chcę móc kliknąć przycisk i mieć wszystkie animacje do miejsca, w którym normalnie byłyby na stronie, gdyby miały pozycję: względną.jquery: czy mogę animować pozycję: absolutna do pozycji: względna?

czyli czy możliwe jest nawet animowanie z pozycji: absolutna do pozycji: względna w jquery?

to, co mam:

$(".change_layout").click(function(){ 

    $(".book_img").animate({position:'relative', top:'0px', left:'0px'}, 1000) 

}) 
+0

Czy na pewno masz na myśli "względny", a nie "statyczny"? Ponieważ 'statyczny' jest pozycją 'domyślną'. –

+0

tak, statyczne jest to, co miałem na myśli. – ExodusNicholas

Odpowiedz

15

Nie, nie można go animować bezpośrednio, ale można znaleźć punkt końcowy i ożywić tam pozycję. Coś jak to może działać, gdy animację do pozycji static:

$('img.foo').each(function() { 

    var el = $(this); 

    // Make it static 
    el.css({ 
     visibility: 'hidden', // Hide it so the position change isn't visible 
     position: 'static' 
    }); 

    // Get the static position 
    var end = el.position(); 

    // Turn it back to absolute 
    el.css({ 
     visibility: 'visible', // Show it 
     position: 'absolute' 
    }).animate({ // Animate to the static position 
     top: end.top, 
     left: end.left 
    }, function() { // Make it static 
     $(this).css('position', 'static'); 
    }); 
}); 

To trochę hacky, ale powinno działać.

+1

Powinieneś wywołać 'position()', a nie 'offset()'. – SLaks

+0

ah jesteś cudowny. Jedynym problemem jest to, że wszystkie obrazy (rozłożone na całej stronie) animują się do pozycji pierwszego obrazu, a następnie natychmiast pojawiają się w ich statycznej pozycji, ale każdy obraz nie animuje jego własnej statycznej pozycji . jakaś wskazówka, jak to naprawić? – ExodusNicholas

+0

Wykonaj pętlę 'each', w której każdy z obrazów będzie obsługiwany osobno. Prawdopodobnie teraz wybierasz wszystkie elementy w jednej deklaracji (twój 'var el' jest podobny do' $ ('img.foo') ', to robi wszystkie operacje względem pierwszego obrazu. Zaktualizowałem swój post, aby pokazać to –

0

I nie sądzę, że można to zrobić. jQuery animate działa tylko na dowolnej "numerycznej właściwości CSS".

+0

Niezupełnie ... możesz również zmienić kolor tekstu lub tła. :) –

+0

, ale czy kolor nie jest wartością liczbową? – ExodusNicholas

+0

@TiuTalk - dobry punkt, ale myślę, że ExodusNicholas ma rację, w tej sytuacji jQuery użyłby numerycznych aspektów koloru, aby go ożywić, zwiększając/zmniejszając wartości RGB, stosownie do zmiany koloru. – rosscj2533

0

nr

Jednakże, można sprawdzić aktualną lokalizację elementu (wezwanie .position()), ustaw position do relative i animowanie z pierwotnej lokalizacji do obecnego.

+0

Nie jestem pewien, jak by to się stało, czy jest szansa, że ​​pomożesz mi zacząć? co próbuję zrobić, to zapewnić 2 różne widoki dla ludzi, każdy artykuł ma obraz i chcę, aby te obrazy były w stanie ożywiać swoją pozycję po naciśnięciu przycisku drugiego widoku, a następnie po naciśnięciu przycisku pierwszego widoku , niech animują powrót do pierwszej pozycji. – ExodusNicholas

+0

Na przykład, patrz odpowiedź Tatu Ulmanena, dokładnie to, co opisałem. – SLaks

0

Lubię rozwiązanie tATu, ale uznał ten kod wielokrotnego użytku będzie lepiej dla moich celów:

function specialSlide(el, properties, options){ 
    //http://stackoverflow.com/a/2202831/ 
    el.css({ 
     visibility: 'hidden', // Hide it so the position change isn't visible 
     position: 'static' 
    }); 
    var origPos = el.position(); 
    el.css({ 
     visibility: 'visible', // Unhide it (now that position is 'absolute') 
     position: 'absolute', 
     top: origPos.top, 
     left: origPos.left 
    }).animate(properties, options); 
} 

Powiedzmy, że chcemy przesunąć $ („# elementToMove”) do nowej pozycji, a ja chcę go prześlij 1000 milisekund. Mogę to nazwać:

var props = {'top' : 200, 'left' : 300}; 
var options = {'duration': 1000}; 
specialSlide($('#elementToMove'), props, options); 
Powiązane problemy