2011-02-10 15 views
14

¿Cómo puedo retrasar un cambio de CSS en jquery? Aquí está mi código:¿Función de retraso de CSS en Jquery?

$("document").ready(function() { 
    $(".pressimage img").mouseenter(function() { 
     $jq(this).css('z-index','1000'); 
      }); 
    $(".pressimage img").mouseleave(1000,function() { 
     $jq(this).css('z-index','1'); 
      }); 
}); 

Necesito la función mouseleave que ocurra alrededor de 1/2 de un segundo después de que las hojas del ratón.

Uso de algunos otros jquery para hacer que las imágenes se amplíen con el mouseover. Cuando se expanden, se cubren entre sí, por lo que necesito que el índice z de la imagen animada sea más alto que el otro. Luego, cuando el mouse se va, el índice z tiene que volver a la normalidad.

El código anterior funciona, excepto que el índice z cambia tan pronto como el mouse se va, por lo que la animación no tiene tiempo para completarse. Por lo tanto, necesito retrasar un poco la función mouseleave. Gracias

ACTUALIZACIÓN

Aquí está mi sitio: http://smartpeopletalkfast.co.uk/ppr6/press

He puesto mi código en la cabeza:

$jq("document").ready(function() { 

    $jq(".pressimage img").mouseenter(function() { 
     $jq(this).css('z-index','100'); 
      }); 

    $jq(".pressimage img").mouseleave(function() { 
     $jq(this).css('z-index','1'); 
      }); 

}); 

Este código está trabajando bien, pero no tiene ninguna demora. Si pasa el puntero sobre la imagen superior izquierda, funciona bien, pero tan pronto como suelta el mouse va detrás de la imagen debajo de él. Gracias

Respuesta

20

Prueba esto:

$(".pressimage img").mouseleave(function(){ 
    var that = this; 
    setTimeout(function(){ 
     $(that).css('z-index','1'); 
    },500); 
}); 
+0

de trabajo. Muchas gracias. – Evans

0
$("document").ready(function() { 
$(".pressimage img").mouseenter(function() { 
    $jq(this).css('z-index','1000'); 
     }); 
$(".pressimage img").mouseleave(1000,function() { 
    $jq(this).delay(500).css('z-index','1'); 
     }); 
}); 

hace este trabajo? :)

+0

no, no lo hace. También intenté agregar jq después de cada $. – Evans

+0

Eso es malo :(Pero, afortunadamente, las respuestas anteriores deberían funcionar :) – Milaan

+0

Ok, voy a investigar más. Gracias – Evans

0

http://jsfiddle.net/loktar/yK5ga/

Compruebe que uno fuera lo que estoy haciendo está asignando el tiempo de espera a una variable y luego borrarlo en mouseover, por lo que el fuego planteo si lo hace un ratón por encima rápidamente.

$("document").ready(function() { 
    var imgTimeout; 

    $("img").hover(
     function() { 
      clearTimeout(imgTimeout); 
      $(this).css('z-index','1000'); 
    }, 
    function() { 
     var element = $(this); 
     imgTimeout = setTimeout(function(){element.css('z-index','1');}, 1000); 
    }); 
}); 
+0

su método funciona por unos pocos segundos, pero luego deja de funcionar. – Evans

+0

Weird .. Ill jsfiddle a menos que a alguien se le ocurra una respuesta mejor/diferente. – Loktar

+0

Ok, acabo de actualizar mi respuesta, parece funcionar mucho mejor. – Loktar

1

Puede hacer esto con setTimeout();

$("document").ready(function() { 
    var timer; 
    $(".pressimage img").mouseenter(function() { 
     $jq(this).css('z-index','1000'); 
     clearTimeout(timer); 
    }); 
    $(".pressimage img").mouseleave(1000,function() { 
     timer = setTimeout(function(){ 
      $jq(this).css('z-index','1'); 
     }, 500); 
    }); 
}); 

El código en setTimeout (código, retardo) se ejecuta después de retardo milisegundos. Es posible que tenga problemas con los cambios involuntarios si tuviera que mover el mouse demasiado rápido, por lo que he borrado la acción de tiempo de espera en mouseenter().

+0

su método funciona por unos pocos segundos, pero luego deja de funcionar. Al igual que Loktar's. – Evans

+0

Agregué un clearTimeout() para detener el tiempo de espera configurado en caso de que el mouse entre rápidamente/deje eventos. Debería hacerlo funcionar mejor, al menos. –

+0

Al pasar el puntero sobre la imagen, el índice z se cambia a 1000 pero luego al mouseleave no cambia a 1. Gracias – Evans

3

Nota que la solución de sanon anterior es más natural que éste, ya que utiliza el método de jQuery .queue en lugar de abusar de .animate para el mismo propósito.

Respuesta original a continuación:


setTimeout es la forma más natural de ir, pero si usted desea permanecer en su cadena de función jQuery, puede utilizar una función animado con una duración 0.

Ejemplo:

$("img").delay(1000).animate({'z-index': 1000},0) 

Si desea hacer cualquier otra cosa que los cambios css numéricos, entonces sí es necesario para crear una función, pero que todavía puede suceder dentro de esa llamada animado:

$("img").delay(1000).animate({zoom:1},0,function(){$(this).src('otherImage.png');}) 

Acabo de poner ese zoom: 1 porque si especifica un objeto vacío {} allí, no se considera un efecto real, por lo que no entra en la cola de efectos, por lo que ejecuta inmediatamente la función completa.

0

Intente lo siguiente.

jQuery.fn.extend({ 
    qcss: function(map){ 
     $(this).queue(function(next){ 
      $(this).css(map); 
      next(); 
     }); 

     return this; 
    } 
}); 
14

retardo sólo funciona en elementos de la cola por lo que necesita para agregar su cambio css a la cola de la demora para trabajar. Luego dequeue. El código siguiente ilustra esto:

$('.pressimage img') 
    .delay(1000) 
    .queue(function(){ 
     $(this).css({'z-index','1'}); 
     $(this).dequeue(); 
    }); 
+0

Gracias - eso solucionó mi problema – suspectus

+0

cola funcionó muy bien. Gracias – DeFeNdog