views:

39860

answers:

14

I am trying to animate a change in backgroundColor using jQuery on mouseover.

I have checked some example and I seem to have it right, it works with other properties like fontSize, but with backgroundColor I get and "Invalid Property" js error. The element I am working with is a div.

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

Any ideas?

+29  A: 

Use the color plugin.

John Millikin
That color plugin is buggy.
Andrew
For jquery 1.4.2 with jquery effect 1.8 I have to admit that Andrew solution work perfect. See his post below.
Daok
A: 

jQuert probably doesn't support "named" colors by default. Try using hex values instead.

Sergey Ilinsky
jQuery doesn't support animating color changes at all unless a plugin is used. The plugin comes with a mapping of predefined symbolic names, which includes "olive". See http://dev.jquery.com/browser/trunk/plugins/color/jquery.color.js
John Millikin
+18  A: 

You will need to include the jQuery color animations plugin. Here is an example how to use it:

$(this).animate({ backgroundColor: "#f6f6f6" }, 'fast');

Don't forget to minify it before including it in the HTML, as it decreases the page size and saves bandwidth.

DrJokepu
-1 The color plugin is buggy and the minifier you suggest performs poorly and isn't safe to use.
Andrew
@Andrew: The color animations plugin was written for jQuery 1.2 and was never updated for 1.3 or 1.4. The latest jQuery release at the time of writing this answer was 1.2.6 and it worked perfectly with the aforementionned plugin. Unfortunately, it is indeed buggy with 1.3 and 1.4, as you can experience it every day on StackOverflow as well.
DrJokepu
@DrJokepu: The color plugin referenced in my answer was most recently updated in Feb 2010. It works fine for me on jQuery 1.4.2 pulled from the Google CDN. I had previously experienced troubles and made my own modifications to fix it but discovered that the author had re-released so I dumped my version and switched to the latest official version by the original author.
Andrew
Use http://jscompress.com for minifying.
George Edison
+14  A: 

This functionality is included in jQuery UI version 1.5.2. You can check out the documentation here.

brad
jQuery UI is heavy. Color plugin is only 957 bytes when minified.
Andrew
+3  A: 

For anyone finding this. Your better off using the jQuery UI version because it works on all browsers. The color plugin has issues with Safari and Chrome. It only works sometimes.

Donny V.
-1 The latest version of the colour plugin works perfectly in Chrome.
Andrew
+10  A: 

I had the same problem and fixed it by including jQuery UI. Here is the complete script :

<!-- include Google's AJAX API loader -->
<script src="http://www.google.com/jsapi"&gt;&lt;/script&gt;
<!-- 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>
marc-andre menard
+1 This solved my problem quite nicely
Achilles
A: 

Dudes... you have to include jquery color animation plugin for this to work. download and include this jquery plugin.. http://plugins.jquery.com/project/color

+1  A: 

These days jQyery color plugin supports following named colors:

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]
Could you please quote the source. Thanks for the listing btw.
Shrikant Sharat
This list came from the jQuery color plugin: http://plugins.jquery.com/project/color
spoulson
-1 You colour list refers to an out of date version. Current version has at least one extra colour that I noticed.
Andrew
+39  A: 

The color plugin is only 4kb so much cheaper than the UI library. Of course you'll want to use a decent version of the plugin and not some buggy old thing which doesn't handle Safari and crashes when the transitions are too fast. Since a minified version isn't supplied you might like test various compressors and make your own min version. YUI gets the best compression in this case needing only 957 bytes and since it is so small - here it is:

(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.curCSS(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);
Andrew
The best answer is here ! Thanks :)
Alysko
Alright, go to the link Andrew propose. Download the file. You need to add it to your project. You can still have jquery.effects.core in your project this will work perfectly. Thank you for the answer. +1
Daok
thanks for the already minified code - very handy!
JamWaffles
+1  A: 

I made a version that supports rgba, based off the github version. However, it won't work in IE since it only does rgba. http://dl.dropbox.com/u/57502/jquery.color.js

crazy2be
However, it means that "transparent" actually makes the background transparent, not white. (transitions it to rgba(255,255,255,0))
crazy2be
+1  A: 

Hey guys take a look at this cool Jquery Animation named SuperNova, its using the background color animation techniques -- http://motyar.blogspot.com/2010/07/animate-color-using-jquery.html

Motyar
A: 

You can use 2 divs:

You could put a clone on top of it and fade the original out while fading the clone in.

When the fades are done, restore the original with the new 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);
    });
});​

jsFiddle example


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

Peter Ajtai
A: 

Thanks for sharing.

ricky