2013-02-11 11 views
5

Sto cercando di ottenere un effetto in cui un colore di sfondo viene pulsato quando una condizione sono io. Così ho:Effetto pulsato con transizioni jQuery e CSS

<div class="box">...</div> 

.box { 
    background-color: #fff; 
    transition: background-color 0.5s ease-out; 
} 
.box.active { 
    background-color: #ccc; 
} 

Così ora voglio usare jQuery per aggiungere e rimuovere quella classe un paio di volte per creare un effetto di background-color pulsante. Qualcosa di simile:

$('.box').addClass('active').delay(1000).removeClass('active').delay(1000).addClass('active'); 

Questo, in teoria, dovrebbe creare l'effetto pulsante ma non lo fa. Quello che succede è che la classe 'attiva' viene aggiunta e non viene mai rimossa o aggiunta di nuovo. È quasi come se il primo 'removeClass' non venga mai attivato.

Mi manca qualcosa, ma non sono sicuro di cosa. Forse ha qualcosa a che fare con i tempi di transizione CSS, ma dovrebbero essere indipendenti l'uno dall'altro, giusto?

Grazie per qualsiasi idea.

+0

Avete visto questo [http://docs.jquery.com/UI/Effects/Pulsate](http://docs.jquery.com/UI/Effects/ Pulsare)? – Morpheus

+0

Sì, ma per quanto ne so, è solo per l'opacità. Mi piacerebbe anche farlo senza usare jQueryUI. – dmathisen

risposta

16

Il ritardo funziona solo con le animazioni, senza aggiungere e rimuovere classi. Inoltre, puoi pulsare utilizzando i fotogrammi chiave in CSS:

@keyframes pulse { 
    50% { background-color: #ccc } 
} 

.box { 
    animation: pulse .5s ease-out 2; 
} 
+0

> Il ritardo funziona solo con le animazioni Non lo sapevo - grazie! – dmathisen

+0

D'accordo, l'uso della proprietà 'animation-iteration-count' è di gran lunga la soluzione più semplice in questa istanza; per inciso [ecco una demo che stavo mettendo insieme] (http://jsfiddle.net/davidThomas/NZdVK/2/) per la mia risposta (ora non necessaria). –

+0

Dai anche un'occhiata a http://docs.jquery.com/Release:jQuery_1.2/Effects#Color_Animations per un altro codice di esempio. – RandomUs1r

0

Penso che questo è quello che ti serve, una funzione che si chiama ogni x secondi e altera una proprietà css, see live demo.

var state = true; 
function changeColor() { 
    state = !state; 
    if(state){ 
     $("div").css("background","red"); 
    }else{ 
     $("div").css("background","blue"); 
    } 
    setTimeout(function() { 
     changeColor(); 
    }, 1000); 
} 

changeColor(); 
+0

Cattiva idea, al giorno d'oggi lasciamo fare ai CSS tutto il lavoro duro –

4

Cerca di ottenere questo effetto con le animazioni CSS3.

@-webkit-keyframes pulsate 
{ 
     0% {background-color: #fff;} 
     50% {background: #ccc;} 
     100% {background: #fff;} 
} 

Applicare quindi i fotogrammi chiave al box elemento

.box{ 
    animation: pulsate 2s infinite; 
} 

http://jsfiddle.net/taltmann/jaQmz/

+2

Tecnicamente, si potrebbe andare senza lo 0% e il 100% degli stati poiché sono predefiniti allo stato originale dell'elemento. – moettinger

+0

Inoltre, @dmathison, hai specificato (per parafrasare) "pulsa un paio di volte" questa risposta pulsa * all'infinito *. –

+0

@DavidThomas, giusto. Sembra che possa modificare in _animation: pulsate 2s 2; _ – dmathisen

1

La funzione delay viene effettivamente utilizzato solo per le animazioni. L'aggiunta e la rimozione di una classe non è un'animazione, ma puoi utilizzare il metodo queue o la funzione setTimeout per ottenere ciò che desideri.

Questa domanda ha un sacco di buone risposte su un altro thread che potrebbe rendere una lettura interessante per voi.

2

in fondo se si vuole che pulsare sempre si dovrebbe usare setInterval() ho creato un esempio per voi qui http://jsfiddle.net/UftRT/

function pulssate() { 
if ($('.box').hasClass('active')) { 
    $('.box').removeClass('active') 
} else { 
    $('.box').addClass('active') 
} 
} 
window.setInterval(function() { pulssate(); },1000); 

se si vuole fermare solo impostare l'intervallo in una variabile quindi chiamare window.clearInterval (int), come questo int = window.setInterval(function() { pulssate(); },1000);