2012-05-03 16 views
5

Me gustaría agregar una animación al conjunto plegable con jQuery Mobile. Déjame mostrarte un ejemplo sencillo de esto:jQuery mobile agregar animación al conjunto plegable

<div id="tiles" data-role="collapsible-set" data-iconpos="right"> 
    <div class="tile" data-role="collapsible" data-iconpos="right">blablabla</div> 
    <div class="tile" data-role="collapsible" data-iconpos="right">blablabla</div> 
    <div class="tile" data-role="collapsible" data-iconpos="right">blablabla</div> 
</div> 

jQuery Mobile maneja esto perfectamente y me muestra conjunto plegable de 3 artículos. Lo que quiero es ANIMACIÓN, sin embargo, parece que no encuentro nada en los documentos.

no he probado todavía lo simple CSS animación (animación de propiedad height) iba a funcionar, sin embargo, es que hay un jQuery Mobile forma de hacerlo como si pasara algún indicador interno?

EDIT He probado un método simple jQuery animado y realmente funciona. Por si acaso alguien más necesita esto. Funciona sin problemas incluso en mi teléfono Android de 528 MHz en un navegador predeterminado. Un fragmento que he añadido es muy simple:

$(".ui-collapsible-heading").live("click", function(event, ui) { 
    $(this).next().css('height', '0').animate({ 
     height: '100px' 
    }); 
}); 
+0

fuera de la caja. Creo que el problema es el manejo de las dimensiones de la página/ventana gráfica (también conocida como altura) durante una transición de "expansión" o "colapso". En este momento, hace clic en un colapsable y cuando el colapsable está abierto, las alturas correspondientes se actualizan. Hacer esto "en transición" probablemente se ve horrible además de ser un colador de recursos.Aún así, podría probar simplemente agregando/eliminando las respectivas clases de transición (deslizar hacia arriba/abajo hacia afuera - verificar JQM CSS) para expandir y colapsar dentro del widget plegable de JQM. Luego vea qué sucede :-) – frequent

+1

@frequent jQuery Mobile expone los eventos 'expand' y' collapse' para widgets plegables. Si se vincula a estos eventos, puede detener el comportamiento predeterminado y animar el evento en su lugar. Ver mi respuesta a continuación. – Jasper

+0

@Jasper Sabía sobre los eventos, no sabía que estaban expuestos. ¡Gracias! También estoy usando las clases JQM css3 para elementos que no son de página. La parte difícil con collapsibles es que son elementos "en línea/estáticos" (vs. posicionado en forma absoluta). Entonces, cuando uso animaciones css3 en elementos en línea, no tengo forma de actualizar elementos como el relleno de página durante la transición. Entonces en ios4, por ejemplo, con pie de página fijo de relleno, el pie de página se perderá de vista durante la transición, no es que sea un problema grave, pero aún así ... – frequent

Respuesta

6

Aquí ya go:

$('[data-role="collapsible"]').bind('expand collapse', function (event) { 
    $(this).find('p').slideToggle(500); 
    return false; 
});​ 

Me gustaba la idea de que ibas así que jugué un rato con él un poco. Esto se engancha en la forma en que jQuery Mobile controla los widgets plegables por lo que es un poco menos hacky y luego se une al elemento de encabezado.

El return false; detiene el comportamiento predeterminado y la otra línea alterna el contenido dentro/fuera de la vista mediante las animaciones jQuery slideUp/slideDown. También puede usar .fadeToggle() o desplegar sus propias animaciones. Si marca event.type puede animar en función del evento disparado.

Aquí es una demostración: http://jsfiddle.net/VtVFB/

+0

gracias por la solución mejorada –

+0

No tengo mucha experiencia con html, pero estoy jugando con jquery mobile right ahora. ¿A dónde exactamente iría este fragmento de código? – Ryan

+0

@Ryan Colocaría este código dentro de un manejador de eventos 'pageinit' para una página específica o conjunto de páginas:' $ (documento) .on ("pageinit", "#somePageID, #someOtherPageID", function() {.. . COLOQUE CÓDIGO AQUÍ ...}); '. Este controlador de eventos 'pageinit' debe ejecutarse en el alcance global. – Jasper

0

El código no es del todo correcto. Anula la implementación móvil de jquery predeterminada de los eventos de expansión de colapso, pero no controla el cambio de los íconos de expansión de colapso.

Un código mejor será:

$('[data-role="collapsible"] h3:first').bind('click', function (event) { 
    $(this).next('p').slideToggle(500); 
    return false; 
});​ 
2

Tenga en cuenta que en jQuery Mobile 1.4 y hasta que necesitan de obligar a los collapsibleexpand y collapsiblecollapse eventos en lugar de expand y collapse. Por lo que el código completo se convierte en

$('[data-role="collapsible"]').on('collapsibleexpand collapsiblecollapse', function(event) { 
    $(this).find('p').slideToggle(500); 
    return false; 
}); 
+0

Esto funcionó para mí, ¿puedes explicar cómo funciona este selector? '$ ('[Data-role =" collapsible "]')' –

0

La cuenta de respuesta duerma aceptado para que no cambia el cursor plegable debido al retorno falsa, por lo que esta es mi respuesta de trabajo:

en mi proyecto era el contenido relativo a la [date-role="collapsible"] son $(this).find('>*:not(h3)')

/* animate collapsible-set */ 
$('[data-role="collapsible"]').on('expand', function (event) { 
    $(this).find('>*:not(h3)').each(function() { 
     if (!$(this).is(':visible')) { 
      $(this).stop().slideToggle(); 
     } 
    }); 
}).on('collapse', function (event) { 
    $(this).find('>*:not(h3)').each(function() { 
     if ($(this).is(':visible')) { 
      $(this).stop().slideToggle(); 
     } 
    }); 
}); 
No