jQuery animare backgroundColor


327

Sto cercando di animare un cambiamento in backgroundColor usando jQuery al passaggio del mouse.

Ho controllato qualche esempio e mi sembra che abbia ragione, funziona con altre proprietà come fontSize, ma con backgroundColor ottengo e l'errore js "Proprietà non valida". L'elemento con cui sto lavorando è un div.

$(".usercontent").mouseover(function() {
    $(this).animate({ backgroundColor: "olive" }, "slow");
});

Qualche idea?


Per jquery 1.4.2 con effetto jquery 1.8 devo ammettere che la soluzione Andrew funziona perfettamente. Vedi il suo post qui sotto.
Patrick Desjardins,

1
Nota: questo plug-in sta rilevando il colore di sfondo corrente dell'elemento - il browser Chrome restituisce rgba(0, 0, 0, 0)invece il valore vuoto / nullo previsto quando non è definito alcun colore di sfondo. Per "risolvere" questo, l'elemento deve avere il colore di sfondo iniziale.
Shadow Wizard è Ear For You il

La pagina collegata sembra spezzata (almeno la pagina del progetto e la pagina demo).
Paolo Stefan,

Risposte:


333

Il plug-in a colori è solo 4kb molto più economico della libreria UI. Ovviamente ti consigliamo di utilizzare una versione decente del plug-in e non qualche vecchia cosa buggy che non gestisce Safari e si arresta in modo anomalo quando le transizioni sono troppo veloci. Poiché non viene fornita una versione minimizzata, è possibile che si desideri testare vari compressori e creare la propria versione minima. YUI ottiene la migliore compressione in questo caso che richiede solo 2317 byte e poiché è così piccolo - eccolo:

(function (d) {
    d.each(["backgroundColor", "borderBottomColor", "borderLeftColor", "borderRightColor", "borderTopColor", "color", "outlineColor"], function (f, e) {
        d.fx.step[e] = function (g) {
            if (!g.colorInit) {
                g.start = c(g.elem, e);
                g.end = b(g.end);
                g.colorInit = true
            }
            g.elem.style[e] = "rgb(" + [Math.max(Math.min(parseInt((g.pos * (g.end[0] - g.start[0])) + g.start[0]), 255), 0), Math.max(Math.min(parseInt((g.pos * (g.end[1] - g.start[1])) + g.start[1]), 255), 0), Math.max(Math.min(parseInt((g.pos * (g.end[2] - g.start[2])) + g.start[2]), 255), 0)].join(",") + ")"
        }
    });

    function b(f) {
        var e;
        if (f && f.constructor == Array && f.length == 3) {
            return f
        }
        if (e = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(f)) {
            return [parseInt(e[1]), parseInt(e[2]), parseInt(e[3])]
        }
        if (e = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(f)) {
            return [parseFloat(e[1]) * 2.55, parseFloat(e[2]) * 2.55, parseFloat(e[3]) * 2.55]
        }
        if (e = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(f)) {
            return [parseInt(e[1], 16), parseInt(e[2], 16), parseInt(e[3], 16)]
        }
        if (e = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(f)) {
            return [parseInt(e[1] + e[1], 16), parseInt(e[2] + e[2], 16), parseInt(e[3] + e[3], 16)]
        }
        if (e = /rgba\(0, 0, 0, 0\)/.exec(f)) {
            return a.transparent
        }
        return a[d.trim(f).toLowerCase()]
    }
    function c(g, e) {
        var f;
        do {
            f = d.css(g, e);
            if (f != "" && f != "transparent" || d.nodeName(g, "body")) {
                break
            }
            e = "backgroundColor"
        } while (g = g.parentNode);
        return b(f)
    }
    var a = {
        aqua: [0, 255, 255],
        azure: [240, 255, 255],
        beige: [245, 245, 220],
        black: [0, 0, 0],
        blue: [0, 0, 255],
        brown: [165, 42, 42],
        cyan: [0, 255, 255],
        darkblue: [0, 0, 139],
        darkcyan: [0, 139, 139],
        darkgrey: [169, 169, 169],
        darkgreen: [0, 100, 0],
        darkkhaki: [189, 183, 107],
        darkmagenta: [139, 0, 139],
        darkolivegreen: [85, 107, 47],
        darkorange: [255, 140, 0],
        darkorchid: [153, 50, 204],
        darkred: [139, 0, 0],
        darksalmon: [233, 150, 122],
        darkviolet: [148, 0, 211],
        fuchsia: [255, 0, 255],
        gold: [255, 215, 0],
        green: [0, 128, 0],
        indigo: [75, 0, 130],
        khaki: [240, 230, 140],
        lightblue: [173, 216, 230],
        lightcyan: [224, 255, 255],
        lightgreen: [144, 238, 144],
        lightgrey: [211, 211, 211],
        lightpink: [255, 182, 193],
        lightyellow: [255, 255, 224],
        lime: [0, 255, 0],
        magenta: [255, 0, 255],
        maroon: [128, 0, 0],
        navy: [0, 0, 128],
        olive: [128, 128, 0],
        orange: [255, 165, 0],
        pink: [255, 192, 203],
        purple: [128, 0, 128],
        violet: [128, 0, 128],
        red: [255, 0, 0],
        silver: [192, 192, 192],
        white: [255, 255, 255],
        yellow: [255, 255, 0],
        transparent: [255, 255, 255]
    }
})(jQuery);

2
Va bene, vai al link proposto da Andrew. Scarica il file Devi aggiungerlo al tuo progetto. Puoi ancora avere jquery.effects.core nel tuo progetto che funzionerà perfettamente. Grazie per la risposta. +1
Patrick Desjardins,

3
Ho semplicemente incollato quanto sopra nel mio file "jquery-ui-1.8.2.min.js" esistente e ... tutto funzionava ancora :-)
Dave Everitt,

7
Vorrei notare che nell'ultimo anno (2011) l'autore di questo plugin ha rilasciato una versione 2 che ha molte caratteristiche interessanti, ma non sono necessarie per le funzionalità di base che questa libreria di solito è ricercata. Ora è grande di 20 + kb. È possibile selezionare il v1ramo per ottenere la versione precedente (che funziona ancora) ma è molto più leggera.
Aren,

6
FWIW: è possibile rimuovere le mappature da colore a RGB nel codice e ridurne ulteriormente le dimensioni: raw.github.com/gist/1891361/… . Il rovescio della medaglia è che non è possibile utilizzare i nomi dei colori per l'animazione. Dovrai utilizzare i valori rgb.
Niyaz,

4
jQuery 1.8 interrompe questo plug-in tra l'altro. curCSS non è più in jQuery.
Rich Bradshaw,

68

Ho avuto lo stesso problema e risolto includendo l'interfaccia utente di jQuery. Ecco lo script completo:

<!-- include Google's AJAX API loader -->
<script src="http://www.google.com/jsapi"></script>
<!-- load JQuery and UI from Google (need to use UI to animate colors) -->
<script type="text/javascript">
google.load("jqueryui", "1.5.2");
</script>


<script type="text/javascript">
$(document).ready(function() {
$('#menu ul li.item').hover(
    function() {
        $(this).stop().animate({backgroundColor:'#4E1402'}, 300);
        }, function () {
        $(this).stop().animate({backgroundColor:'#943D20'}, 100);
    });
});
</script>

61

Fallo con CSS3-Transitions. Il supporto è eccezionale (tutti i browser moderni, anche IE). Con Compass e SASS questo viene fatto rapidamente:

#foo {background:red; @include transition(background 1s)}
#foo:hover {background:yellow}

CSS puro:

#foo {
background:red;
-webkit-transition:background 1s;
-moz-transition:background 1s;
-o-transition:background 1s;
transition:background 1s
}
#foo:hover {background:yellow}

Ho scritto un articolo tedesco su questo argomento: http://www.solife.cc/blog/animation-farben-css3-transition.html


6
Gioca con i passaggi hover e click a: jsfiddle.net/K5Qyx
Dem Pilafian


13

È possibile utilizzare l'interfaccia utente di jQuery per aggiungere questa funzionalità. Puoi prendere quello che ti serve, quindi se vuoi animare il colore, tutto ciò che devi includere è il seguente codice. Ho ottenuto dall'ultima interfaccia utente jQuery (attualmente 1.8.14)

/******************************************************************************/
/****************************** COLOR ANIMATIONS ******************************/
/******************************************************************************/

// override the animation for color styles
$.each(['backgroundColor', 'borderBottomColor', 'borderLeftColor',
    'borderRightColor', 'borderTopColor', 'borderColor', 'color', 'outlineColor'],
function(i, attr) {
    $.fx.step[attr] = function(fx) {
        if (!fx.colorInit) {
            fx.start = getColor(fx.elem, attr);
            fx.end = getRGB(fx.end);
            fx.colorInit = true;
        }

        fx.elem.style[attr] = 'rgb(' +
            Math.max(Math.min(parseInt((fx.pos * (fx.end[0] - fx.start[0])) + fx.start[0], 10), 255), 0) + ',' +
            Math.max(Math.min(parseInt((fx.pos * (fx.end[1] - fx.start[1])) + fx.start[1], 10), 255), 0) + ',' +
            Math.max(Math.min(parseInt((fx.pos * (fx.end[2] - fx.start[2])) + fx.start[2], 10), 255), 0) + ')';
    };
});

// Color Conversion functions from highlightFade
// By Blair Mitchelmore
// http://jquery.offput.ca/highlightFade/

// Parse strings looking for color tuples [255,255,255]
function getRGB(color) {
        var result;

        // Check if we're already dealing with an array of colors
        if ( color && color.constructor == Array && color.length == 3 )
                return color;

        // Look for rgb(num,num,num)
        if (result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(color))
                return [parseInt(result[1],10), parseInt(result[2],10), parseInt(result[3],10)];

        // Look for rgb(num%,num%,num%)
        if (result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(color))
                return [parseFloat(result[1])*2.55, parseFloat(result[2])*2.55, parseFloat(result[3])*2.55];

        // Look for #a0b1c2
        if (result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(color))
                return [parseInt(result[1],16), parseInt(result[2],16), parseInt(result[3],16)];

        // Look for #fff
        if (result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(color))
                return [parseInt(result[1]+result[1],16), parseInt(result[2]+result[2],16), parseInt(result[3]+result[3],16)];

        // Look for rgba(0, 0, 0, 0) == transparent in Safari 3
        if (result = /rgba\(0, 0, 0, 0\)/.exec(color))
                return colors['transparent'];

        // Otherwise, we're most likely dealing with a named color
        return colors[$.trim(color).toLowerCase()];
}

function getColor(elem, attr) {
        var color;

        do {
                color = $.curCSS(elem, attr);

                // Keep going until we find an element that has color, or we hit the body
                if ( color != '' && color != 'transparent' || $.nodeName(elem, "body") )
                        break;

                attr = "backgroundColor";
        } while ( elem = elem.parentNode );

        return getRGB(color);
};

Sono solo 1.43kb dopo la compressione con YUI:

$.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor","borderTopColor","borderColor","color","outlineColor"],function(b,a){$.fx.step[a]=function(c){if(!c.colorInit){c.start=getColor(c.elem,a);c.end=getRGB(c.end);c.colorInit=true}c.elem.style[a]="rgb("+Math.max(Math.min(parseInt((c.pos*(c.end[0]-c.start[0]))+c.start[0],10),255),0)+","+Math.max(Math.min(parseInt((c.pos*(c.end[1]-c.start[1]))+c.start[1],10),255),0)+","+Math.max(Math.min(parseInt((c.pos*(c.end[2]-c.start[2]))+c.start[2],10),255),0)+")"}});function getRGB(b){var a;if(b&&b.constructor==Array&&b.length==3){return b}if(a=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(b)){return[parseInt(a[1],10),parseInt(a[2],10),parseInt(a[3],10)]}if(a=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(b)){return[parseFloat(a[1])*2.55,parseFloat(a[2])*2.55,parseFloat(a[3])*2.55]}if(a=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(b)){return[parseInt(a[1],16),parseInt(a[2],16),parseInt(a[3],16)]}if(a=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(b)){return[parseInt(a[1]+a[1],16),parseInt(a[2]+a[2],16),parseInt(a[3]+a[3],16)]}if(a=/rgba\(0, 0, 0, 0\)/.exec(b)){return colors.transparent}return colors[$.trim(b).toLowerCase()]}function getColor(c,a){var b;do{b=$.curCSS(c,a);if(b!=""&&b!="transparent"||$.nodeName(c,"body")){break}a="backgroundColor"}while(c=c.parentNode);return getRGB(b)};

Puoi anche animare i colori usando le transizioni CSS3 ma è supportato solo dai browser moderni.

a.test {
  color: red;
  -moz-transition-property: color;  /* FF4+ */
  -moz-transition-duration: 1s;
  -webkit-transition-property: color;  /* Saf3.2+, Chrome */
  -webkit-transition-duration: 1s;
  -o-transition-property: color;  /* Opera 10.5+ */
  -o-transition-duration: 1s;
  -ms-transition-property: color;  /* IE10? */
  -ms-transition-duration: 1s;
  transition-property: color;  /* Standard */
  transition-duration: 1s;
  }

  a.test:hover {
  color: blue;
  }

Utilizzando la proprietà stenografia:

/* shorthand notation for transition properties */
/* transition: [transition-property] [transition-duration] [transition-timing-function] [transition-delay]; */

a.test {
  color: red;
  -moz-transition: color 1s;
  -webkit-transition: color 1s;
  -o-transition: color 1s;
  -ms-transition: color 1s;
  transition: color 1s;
  }

a.test {
  color: blue;
 }

A differenza delle normali transizioni javascript, le transizioni CSS3 sono accelerate dall'hardware e quindi più fluide. Puoi usare Modernizr, per scoprire se il browser supporta le transizioni CSS3, in caso contrario puoi usare jQuery come fallback:

if ( !cssTransitions() ) {
    $(document).ready(function(){
        $(".test").hover(function () {
                $(this).stop().animate({ backgroundColor: "red" },500)
             }, function() {
                 $(this).stop().animate({ backgroundColor: "blue" },500)}    
             );
    }); 
}

Ricorda di usare stop () per interrompere l'animazione corrente prima di avviarne una nuova, altrimenti quando passi sopra l'elemento troppo velocemente, l'effetto continua a lampeggiare per un po '.


11

Per chiunque lo trovi. È meglio usare la versione dell'interfaccia utente jQuery perché funziona su tutti i browser. Il plugin colore ha problemi con Safari e Chrome. Funziona solo a volte.


6
-1 L'ultima versione del plug-in a colori funziona perfettamente in Chrome.
Andrew,

3
È pesante includere script aggiuntivi per animare solo lo sfondo
oneiros

11

Puoi usare 2 div:

Potresti mettere un clone sopra di esso e sbiadire l'originale mentre si sbiadisce il clone.

Al termine delle dissolvenze, ripristinare l'originale con il nuovo bg.

$(function(){
    var $mytd = $('#mytd'), $elie = $mytd.clone(), os = $mytd.offset();

      // Create clone w other bg and position it on original
    $elie.toggleClass("class1, class2").appendTo("body")
         .offset({top: os.top, left: os.left}).hide();

    $mytd.mouseover(function() {            
          // Fade original
        $mytd.fadeOut(3000, function() {
            $mytd.toggleClass("class1, class2").show();
            $elie.toggleClass("class1, class2").hide();            
        });
          // Show clone at same time
        $elie.fadeIn(3000);
    });
});​

Esempio jsFiddle


.toggleClass()
.offset()
.fadeIn()
.fadeOut()


forse ha funzionato ad un certo punto, almeno no, non sembra fare ciò che ci si aspetta da esso.
Epeleg,

@epeleg - Funziona in mac chrome per me. Fai clic sul rettangolo colorato e cambia colore (
2013-07-15

Non so come, ma in effetti ora funziona sul mio Windows 7 Chrome. forse in relazione all'aggiornamento di Chrome che ho fatto ieri ?! comunque, come ho detto, in effetti ora funziona.
Epeleg,

8

Ho usato una combinazione di transizioni CSS con JQuery per l'effetto desiderato; ovviamente i browser che non supportano le transizioni CSS non si animano ma è un'opzione leggera che funziona bene per la maggior parte dei browser e per i miei requisiti è un degrado accettabile.

Jquery per cambiare il colore di sfondo:

   $('.mylinkholder a').hover(
        function () {
            $(this).css({ backgroundColor: '#f0f0f0' }); 
        },
        function () {
            $(this).css({ backgroundColor: '#fff' });
        }
    );

CSS utilizzando la transizione per sfumare il cambiamento del colore di sfondo

   .mylinkholder a
   {
   transition: background-color .5s ease-in-out;
   -moz-transition: background-color .5s ease-in-out;
   -webkit-transition: background-color .5s ease-in-out; 
  -o-transition: background-color .5s ease-in-out; 
   }

6

In questi giorni il plugin colore jQuery supporta i seguenti colori con nome:

aqua:[0,255,255],
azure:[240,255,255],
beige:[245,245,220],
black:[0,0,0],
blue:[0,0,255],
brown:[165,42,42],
cyan:[0,255,255],
darkblue:[0,0,139],
darkcyan:[0,139,139],
darkgrey:[169,169,169],
darkgreen:[0,100,0],
darkkhaki:[189,183,107],
darkmagenta:[139,0,139],
darkolivegreen:[85,107,47],
darkorange:[255,140,0],
darkorchid:[153,50,204],
darkred:[139,0,0],
darksalmon:[233,150,122],
darkviolet:[148,0,211],
fuchsia:[255,0,255],
gold:[255,215,0],
green:[0,128,0],
indigo:[75,0,130],
khaki:[240,230,140],
lightblue:[173,216,230],
lightcyan:[224,255,255],
lightgreen:[144,238,144],
lightgrey:[211,211,211],
lightpink:[255,182,193],
lightyellow:[255,255,224],
lime:[0,255,0],
magenta:[255,0,255],
maroon:[128,0,0],
navy:[0,0,128],
olive:[128,128,0],
orange:[255,165,0],
pink:[255,192,203],
purple:[128,0,128],
violet:[128,0,128],
red:[255,0,0],
silver:[192,192,192],
white:[255,255,255],
yellow:[255,255,0]

1
Potresti per favore citare la fonte. Grazie per l'elenco tra il btw.
Shrikant Sharat,

Questo elenco proviene dal plug-in a colori jQuery: plugins.jquery.com/project/color
spoulson,

2
-1 L'elenco dei colori fa riferimento a una versione non aggiornata. La versione attuale ha almeno un colore in più che ho notato.
Andrew,

5

Mi piace usare delay () per farlo, ecco un esempio:

jQuery(element).animate({ backgroundColor: "#FCFCD8" },1).delay(1000).animate({ backgroundColor: "#EFEAEA" }, 1500);

Questo può essere chiamato da una funzione, con "elemento" come elemento classe / nome / ecc. L'elemento apparirà immediatamente con lo sfondo # FCFCD8, tienilo premuto per un secondo, quindi si dissolve in #EFEAEA.



2

Mi sono imbattuto in questa pagina con lo stesso problema, ma i seguenti problemi:

  1. Non riesco a includere un file aggiuntivo del plugin jQuery con la mia configurazione attuale.
  2. Non mi sento a mio agio nel incollare grandi blocchi di codice che non ho tempo di leggere e convalidare.
  3. Non ho accesso al CSS.
  4. Non avevo quasi tempo per l'implementazione (era solo un miglioramento visivo di una pagina di amministrazione)

Con quanto sopra che praticamente ha escluso ogni risposta. Considerando che la mia dissolvenza di colore era molto semplice, ho usato invece il seguente trucco rapido:

element
  .css('color','#FF0000')
;
$('<div />')
  .css('width',0)
  .animate(
    {'width':100},
    {
      duration: 3000,
      step:function(now){
        var v = (255 - 255/100 * now).toString(16);
        v = (v.length < 2 ? '0' : '') + v.substr(0,2);
        element.css('color','#'+v+'0000');
      }
    }
  )
;

Quanto sopra crea un div temporaneo che non viene mai inserito nel flusso di documenti. Quindi uso l'animazione integrata di jQuery per animare una proprietà numerica di quell'elemento, in questo casowidth - che può rappresentare una percentuale (da 0 a 100). Quindi, usando la funzione step, trasferisco questa animazione numerica al colore del testo con una semplice cacluation esadecimale.

Lo stesso avrebbe potuto essere ottenuto con setInterval, ma usando questo metodo puoi beneficiare dei metodi di animazione di jQuery - come .stop()- e puoi usare easingeduration .

Ovviamente è utile solo per sfumature di colore semplici, per conversioni di colori più complicate dovrai usare una delle risposte sopra - o codificare la tua matematica di dissolvenza del colore :)


2

Prova questo:

(function($) {  

            var i = 0;  

            var someBackground = $(".someBackground");  
            var someColors = [ "yellow", "red", "blue", "pink" ];  


            someBackground.css('backgroundColor', someColors[0]);  

            window.setInterval(function() {  
                i = i == someColors.length ? 0 : i;  
                someBackground.animate({backgroundColor: someColors[i]}, 3000);  
                i++;  
            }, 30);  

})(jQuery);  

puoi visualizzare l'anteprima dell'esempio qui: http://jquerydemo.com/demo/jquery-animate-background-color.aspx



1

Se non vuoi animare il tuo sfondo usando solo la funzionalità jQuery di base, prova questo:

jQuery(".usercontent").mouseover(function() {
      jQuery(".usercontent").animate({backgroundColor:'red'}, 'fast', 'linear', function() {
            jQuery(this).animate({
                backgroundColor: 'white'
            }, 'normal', 'linear', function() {
                jQuery(this).css({'background':'none', backgroundColor : ''});
            });
        });

0

Prova ad usarlo

-moz-transition: background .2s linear;
-webkit-transition: background .2s linear;
-o-transition: background .2s linear;
transition: background .2s linear;

0

Prova questo:

jQuery(".usercontent").hover(function() {
    jQuery(this).animate({backgroundColor:"pink"}, "slow");
},function(){
    jQuery(this).animate({backgroundColor:"white"}, "slow");
});

Modo rivisto con effetti:

jQuery(".usercontent").hover(function() {

    jQuery(this).fadeout("slow",function(){
        jQuery(this).animate({"color","yellow"}, "slow");
    });
});
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.