2012-04-12 13 views
6

Esto podría ser realmente obvio y me falta completamente.jQuery UI efecto ciego - revelar desde abajo

He buscado durante horas y parece que no puedo encontrar la manera de, usando jQuery, revelar un div oculto de abajo arriba. Lo que intento lograr es exactamente como en el siguiente enlace, pero a la inversa: http://jqueryui.com/demos/show/

Puedo deslizar un div desde la parte inferior a la superior, pero esto se revela a medida que se mueve, en lugar de estar "enmascarado"

Como dije, esto podría (¿debería?) Ser realmente obvio y no lo estoy viendo, pero he estado buscando las edades y no puedo encontrar una solución a este problema relativamente simple.

Gracias,

Ronnie

+0

@ ronnie Se puede publicar un enlace jsFiddle – Devjosh

+0

seguro ... http://jsfiddle.net/gBY8V/ –

+0

el efecto que quiero es el que ver aquí, pero invertido (de abajo hacia arriba) –

Respuesta

13

El efecto que estás buscando es un poco difícil de lograr, pero se puede hacer, incluso sin un elemento de envoltura.

El problema principal aquí es que los elementos se renderizan naturalmente de arriba hacia abajo, no de abajo hacia arriba. La animación de ambos los top y height propiedades CSS de un elemento posicionado relativamente nos permite aplicar un efecto slide-up, pero el elemento todavía hará que de arriba hacia abajo:

+-------------------------------------------+ 
|           |^
|           | | Hidden area collapses upwards. 
|           | | 
+-------------------------------------------+ <-- 'top' 
|           |^
| | Upper part of element (visible).  | | 
| |          | | Animation goes bottom-up. 
| | Element still renders top-down.  | | 
| |          | | 
+--|----------------------------------------+ <-- 'top + height' 
| |          | | 
| | Lower part of element (hidden).  | | 
| V          | | 
+-------------------------------------------+ 

Si queremos simular la prestación de abajo hacia arriba , tenemos que modificar la propiedad scrollTop del elemento durante la animación, a fin de que su parte inferior para permanecer siempre a la vista:

+-------------------------------------------+ 
|           |^
| | Upper part of element (hidden).  | | Hidden area collapses upwards. 
| |          | | 
+--|----------------------------------------+ <-- 'top' and 'scrollTop' 
| |          |^
| | Element still renders top-down.  | | 
| |          | | Animation goes bottom-up. 
| | Lower part of element (visible).  | | 
| V          | | 
+-------------------------------------------+ <-- 'top + height' 

podemos utilizar animate() con scrollTop, pero si lo hace conjuntamente con top y height no funcionó correctamente en mis pruebas (sospecho que scrollTop se restablece cuando top o height se modifican en el primer paso de animación, por lo que termina pegado a 0).

Para solucionar esto, podemos manejar el scrollTop nosotros mismos a través de la función opcional que podemos pasar al animate(). Esta función se llama con dos argumentos, now y fx, now siendo el valor actual de la propiedad animada y fx como un objeto contenedor alrededor de información útil, como el elemento y la propiedad que se está animando.

Desde siempre queremos scrollTop a ser el mismo que top, sólo tenemos que probar si top está siendo animado en nuestra función step. Si es así, establecemos scrollTop en now. Esta solución da resultados aceptables, aunque parpadea un poco demasiado para mi gusto (aunque podría ser un artefacto de mi navegador).

Así, en resumen, para poner en práctica este sentido, tenemos que:

  • Fetch altura original del elemento,
  • Hacer el elemento position: relative; para que podamos animar su propiedad top,
  • Contraer el elemento al establecer top a la altura original y height a 0,
  • Mostrar el elemento (necesario en su violín ya que se aplica display: none;),
  • Animate top-0 y height a la altura original,
  • Dar scrollTop el valor de top en cada paso de animación.

resultante en el siguiente código:

$("#click").click(function() { 
    var $revealMe = $("#revealMe"); 
    var originalHeight = $revealMe.height(); 
    $revealMe.css({ 
     position: "relative", 
     top: originalHeight, 
     height: 0 
    }).show().animate({ 
     top: 0, 
     height: originalHeight 
    }, { 
     duration: 1000, 
     step: function(now, fx) { 
      if (fx.prop == "top") { 
       $(fx.elem).scrollTop(now); 
      } 
     } 
    }); 
}); 

puede probarlo en this fiddle.

+0

Frederic, ¡Guau, gracias por una respuesta tan detallada y bellamente diseñada! Por lo que puedo ver y por algunas pruebas rápidas, parece que funciona bien. Difícil, sí, pero entiendo por qué ahora. Gracias :) –

+2

Hola chicos, me encontré con su solución aquí, es realmente una respuesta muy detallada y realmente útil. No me gustó el parpadeo que estaba sucediendo, así que me tomé la libertad de editar tu violín y encontré una solución: [este violín] (http://jsfiddle.net/gBY8V/153/) es básicamente el puntos decimales en la parte superior del scroll que no funcionan bien, así que encontré una forma de forzar valores redondeados. ¡Espero eso ayude! – aberonni

+0

@aberonni, gracias por su comentario, de hecho, no hay un parpadeo notable :) Sugeriría que publique su código en una respuesta y elabore cómo funciona su estrategia (los votos a favor vendrán, no se preocupe por eso). Merry '$ CHILDREN_RULE_HOLIDAY' :) –

5

¿Qué tal en lugar de ciega, utilizando diapositivas con una opción de dirección? Aquí hay un jsFiddle example.

jQuery:

$("#effect").show('slide', { direction: "down" } , 500); 
+0

Gracias, pero desafortunadamente el efecto de deslizamiento no funciona para mí, lo que necesito es que div parezca estar enmascarado (revelado), en lugar de deslizarse a la vista ... –

+0

Parece que de acuerdo con este boleto (http://bugs.jqueryui.com/ticket/4880) las persianas deben tener esta habilidad, sin embargo, todo lo que puedo hacer es ir horizontal o vertical. Siempre puedes hacer esto usando animate y un wrapper. – j08691

+0

Mmmm, lo vi y tuve el mismo problema que tú ... ¿Cómo lograrías este efecto usando animate y un contenedor? –

0

¿Esto no hace el truco:

$("div").show('blind', {}, 'slow'); 
+0

No del todo - necesita hacer exactamente esto, pero revelando desde la parte inferior primero –

+0

Vaya por esto: $ ("DIV"). Show ('clip', {dirección: 'horizontal'}, 'lento'); – Palantir

+0

Gracias, Palantir, esto casi funciona, pero aún no es lo que busco ... El efecto del clip está más cerca de lo que estoy buscando, pero aún necesito que el objeto se revele como un papel de escritorio a medida que se revela. –

3

Si eres uso de la biblioteca jQuery UI tu bien puede:

$("div").hide("blind", {"direction": "down"}); 
$("div").show("blind", {"direction": "down"}); 
0

Ciegos Efecto dirección por defecto: "up".

Valores posibles: up, down, left, right, vertical, horizontal.

Documentation

Ejemplo:

$(document).click(function() { 
 
    $("#toggle").toggle("blind", {"direction": "down"}, 1000); 
 
});
#toggle { 
 
    width: 100px; 
 
    height: 100px; 
 
    background: #ccc; 
 
}
<link rel="stylesheet" href="//code.jquery.com/ui/1.11.4/themes/smoothness/jquery-ui.css"> 
 
<script src="//code.jquery.com/jquery-1.10.2.js"></script> 
 
<script src="//code.jquery.com/ui/1.11.4/jquery-ui.js"></script> 
 

 
<p>Click anywhere to toggle the box.</p> 
 
<div id="toggle"></div>