2011-03-22 26 views
39

¿Por qué retardo() trabajan aquí:Usando retraso jQuery() con css()

$('#tipper').mouseout(function() { 
    $('#tip').delay(800).fadeOut(100); 
}); 

Pero esto no funciona para retrasar:

$('#tipper').mouseout(function() { 
    $('#tip').delay(800).css('display','none'); 
}); 

// EDITAR - aquí está una solución de trabajo

$('#tipper').mouseleave(function() { 
    setTimeout(function(){ 
    $('#tip').css('display','none'); 
     },800); 
}); 

Respuesta

100

delay() funciona con la animación (fx) queue. Cambiar una propiedad css no funciona a través de ese mecanismo y, por lo tanto, no se ve afectado por la directiva de retraso.

hay una solución - se puede inyectar el cambio de propiedad como una operación en cola, así:

$('#tip') 
    .delay(800) 
    .queue(function (next) { 
    $(this).css('display', 'none'); 
    next(); 
    }); 

Además, es probable que debe utilizar en lugar de .hide().css('display','none').

Aquí está un ejemplo de trabajo: http://jsfiddle.net/redler/DgL3m/

+0

Gracias Ken. Aceptaré cuando me dejen. – jerrygarciuh

+2

Hola, sé que esta es una publicación anterior, pero ¿podría alguien explicar por qué tiene que llamar a la función 'siguiente()' después de configurar el CSS? Estoy usando esto y funciona muy bien. Solo quiero entender cómo funciona. –

+1

@ ChrisG-Jones, lo que ocurre es que la función que estás haciendo cola (en el caso anterior a una función anónima) ha pasado automáticamente a es * otra función * que dequeará el siguiente elemento (moviendo la cola junto).Arriba he llamado a ese argumento "siguiente", aunque puedes ponerle el nombre que quieras. Entonces, dentro de la función anónima, "siguiente" es ahora una función que, cuando se llama, avanza la cola. Si no puedo invocar 'next()' al final de la función anónima, no se ejecutará nada más en la cola (la cola 'fx'). –

11

Agregado a respuesta/sugerencia de Ken Redler:

Además, es probable que debe utilizar .hide() en lugar de css ('display ','ninguna').

que puede hacer:

$('#tip').delay(800).hide(0); 

El 0 es importante aquí. Pasar un valor a .hide() lo agregará implícitamente a la cola fx y, por lo tanto, funcionará como se esperaba.

+0

Gracias. ¿Por qué hide() es mejor que configurar CSS? – jerrygarciuh

0

prueba con todos los navegadores

$(document).ready(function() { 
    var id = $("div#1"); // div id=1 
    var color = "lightblue"; // color to highlight 
    var delayms = "800"; // mseconds to stay color 
    $(id).css("backgroundColor",color) 
    .css("transition","all 1.5s ease") // you may also (-moz-*, -o-*, -ms-*) e.g 
    .css("backgroundColor",color).delay(delayms).queue(function() { 
     $(id).css("backgroundColor",""); 
     $(id).dequeue(); 
    }); 
}); 
18

Una pequeña extensión de jQuery puede ayudar con esto. Se le puede llamar qcss:

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

Esto le permite escribir:

$('.an_element') 
    .delay(750) 
    .qcss({ backgroundColor: 'skyblue' }) 
    .delay(750) 
    .qcss({ backgroundColor: 'springgreen' }) 
    .delay(750) 
    .qcss({ backgroundColor: 'pink' }) 
    .delay(750) 
    .qcss({ backgroundColor: 'slategray' }) 

Esta puede ser una manera bastante elegante para definir una animación encadenado. Tenga en cuenta que en esta forma tan simple, qcss solo admite un único argumento de objeto que contiene propiedades de CSS. (Tendría que hacer un poco más de trabajo para admitir .qcss('color', 'blue'), por ejemplo.)

Aquí está an example en jsfiddle.

+0

¡Muy bueno! Absolutamente limpio! Felicitaciones a usted. en cola css = 'qcss' .. ¡ja! ¡Veo lo que hiciste alli! : D Esto debe ir a la próxima versión de jQuery. – ADTC

+0

Gracias por sus amables palabras :) –