2010-02-04 18 views
9

tengo un montón de imágenes que están posicionadas absolutamente, quiero poder hacer clic en un botón y hacer que todas ellas se animen a donde normalmente estarían en la página si tuvieran la posición: relativa.jquery: ¿puedo animar la posición: absoluta a posición: relativa?

Entonces, ¿es posible animar desde la posición: absoluta a la posición: relativa en jquery?

esto es lo que tengo:

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

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

}) 
+0

¿Estás seguro de que te refieres a 'relative' y no a' static'? Como 'estático' es la posición 'predeterminada'. –

+0

sí, estático es lo que quise decir. – ExodusNicholas

Respuesta

15

No, no puede animarlo directamente pero puede averiguar el punto final y animar la posición allí. Algo como esto podría funcionar animación cuando a la posición 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'); 
    }); 
}); 

Es un poco hacky, pero debería funcionar.

+1

Debería llamar a 'position()', not 'offset()'. – SLaks

+0

ah eres maravilloso. el único problema es que todas las imágenes (que se extienden por la página) animan a la posición de la primera imagen, y luego aparecen instantáneamente en su posición estática, pero cada imagen no se anima a su propia posición estática . alguna pista de cómo solucionar esto? – ExodusNicholas

+0

Haz un bucle 'each' donde manejas cada una de las imágenes individualmente. Probablemente ya esté seleccionando todos los elementos en una declaración (su 'var el' es algo así como' $ ('img.foo') ', esto hace que todas las operaciones sean relativas a la primera imagen. He actualizado mi publicación para mostrar esto –

0

No creo que se puede hacer eso. jQuery animate solo funciona en cualquier "propiedad CSS numérica".

+0

No realmente ... también puedes cambiar el color del texto o el fondo. :) –

+0

pero no es el color un valor numérico? – ExodusNicholas

+0

@TiuTalk - buen punto, pero creo que ExodusNicholas tiene razón, en esta situación jQuery usaría los aspectos numéricos del color para animarlo, incrementando/disminuyendo los valores RGB según corresponda para cambiar el color. – rosscj2533

0

Sin embargo, se puede comprobar la ubicación actual del elemento (llamar .position()), establecer el position-relative, y la animación de la ubicación original a la actual.

+0

No estoy seguro de cómo voy a hacer esto, ¿existe la posibilidad de que pueda ayudarme a comenzar? Lo que trato de hacer es proporcionar 2 vistas diferentes para las personas, cada artículo tiene una imagen, y quiero que esas imágenes puedan animar su posición cuando se presiona el 2do botón de vista, y luego cuando se presiona el 1er botón de vista , haz que vuelvan a animar a la primera posición. – ExodusNicholas

+0

Para ver un ejemplo, ver la respuesta de Tatu Ulmanen, que es exactamente lo que estaba describiendo. – SLaks

0

me gusta la solución de Tatu, pero encontré este código reutilizable para ser mejor para mis propósitos:

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

Digamos que quiero deslice $ ('# elementToMove') a una nueva posición, y yo quiero que toma 1000 milisegundos para moverte. Puedo llamar a esto:

var props = {'top' : 200, 'left' : 300}; 
var options = {'duration': 1000}; 
specialSlide($('#elementToMove'), props, options); 
Cuestiones relacionadas