Вопрос

Я пытаюсь анимировать изменение цвета фона с помощью jQuery при наведении курсора мыши.

Я проверил несколько примеров и, похоже, все правильно: он работает с другими свойствами, такими как FontSize, но с фоновым цветом я получаю ошибку js «Недопустимое свойство».Элемент, с которым я работаю, — это div.

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

Есть идеи?

Это было полезно?

Решение

Цветовой плагин всего на 4 КБ намного дешевле, чем библиотека пользовательского интерфейса. Конечно, вы захотите использовать достойную версию плагина, а не старая глючная штука , которая не обрабатывает Safari и вылетает, когда переходы выполняются слишком быстро. Поскольку минимизированная версия не поставляется, вы можете протестировать различные компрессоры и создать собственную минимальную версию. YUI получает лучшее сжатие в этом случае, требующее только 2317 байт, и, поскольку оно настолько мало, вот оно:

(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);

Другие советы

У меня была та же проблема, и я исправил ее, включив пользовательский интерфейс jQuery Вот полный сценарий:

<!-- 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>

Сделайте это с помощью CSS3-переходов. Поддержка отличная (все современные браузеры, даже IE). С помощью Compass и SASS это быстро делается:

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

Чистый CSS:

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

Я написал немецкую статью на эту тему: http: //www.solife. куб.см / блог / анимация-Farben-css3-transition.html

Bitstorm имеет лучший плагин цветной анимации jquery, который я когда-либо видел. Это улучшение цветового проекта jquery. Он также поддерживает rgba.

http://www.bitstorm.org/jquery/color-animation/

Вы можете использовать пользовательский интерфейс jQuery для добавления этой функциональности. Вы можете получить только то, что вам нужно, поэтому, если вы хотите анимировать цвет, все, что вам нужно включить, это следующий код. Я получил, если из последнего пользовательского интерфейса jQuery (в настоящее время 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);
};

Это всего 1,43 КБ после сжатия с помощью 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)};

Вы также можете анимировать цвета с помощью переходов CSS3, но это поддерживается только современными браузерами.

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;
  }

Использование сокращенного свойства:

/* 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;
 }

В отличие от обычных переходов javascript, переходы CSS3 аппаратно ускоряются и, следовательно, более плавные. Вы можете использовать Modernizr, чтобы узнать, поддерживает ли браузер переходы CSS3, если нет, то вы можете использовать jQuery в качестве запасного варианта:

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

Не забудьте использовать stop (), чтобы остановить текущую анимацию перед запуском новой, в противном случае, если вы слишком быстро пропустите элемент, эффект будет мигать некоторое время.

Для любого, кто найдет это. Вам лучше использовать версию jQuery UI, потому что она работает во всех браузерах. Плагин цвета имеет проблемы с Safari и Chrome. Это работает только иногда.

Вы можете использовать 2 div:

Вы можете поместить поверх него клон и затемнить оригинал, одновременно усиливая клон.

Когда затухание будет завершено, восстановите оригинал с новым фоном.

$(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


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

Я использовал комбинацию CSS-переходов с JQuery для желаемого эффекта; Очевидно, что браузеры, которые не поддерживают переходы CSS, не будут анимироваться, но это облегченная опция, которая хорошо работает для большинства браузеров и для моих требований - приемлемое ухудшение.

Jquery для изменения цвета фона:

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

CSS с использованием перехода к уменьшению изменения цвета фона

   .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; 
   }

В наши дни плагин цветов jQuery поддерживает следующие именованные цвета:

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]

Мне нравится использовать delay (), чтобы сделать это, вот пример:

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

Это может быть вызвано функцией с " элементом " будучи элементом класса / имени / и т.д. Элемент мгновенно появится с фоном # FCFCD8, удерживается секунду, а затем исчезает в #EFEAEA.

Просто добавьте следующий фрагмент кода ниже в свой скрипт jquery и наслаждайтесь:

<script src="https://cdn.jsdelivr.net/jquery.color-animation/1/mainfile"></script>

См. пример

Справка для получения дополнительной информации

Я наткнулся на эту страницу с той же проблемой, но со следующими проблемами:

<Ол>
  • Я не могу включить дополнительный файл плагина jQuery в мою текущую настройку.
  • Мне неудобно вставлять большие блоки кода, которые я не успеваю перечитать и проверить.
  • У меня нет доступа к CSS.
  • У меня почти не было времени для реализации (это было только визуальное улучшение страницы администратора)
  • С учетом вышесказанного, в значительной степени исключается каждый ответ. Учитывая, что мое увлечение цветом было очень простым, я использовал вместо этого следующий быстрый взлом:

    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');
          }
        }
      )
    ;
    

    Приведенное выше описание создает временный элемент div, который никогда не помещается в поток документов. Затем я использую встроенную анимацию jQuery для анимации числового свойства этого элемента - в данном случае width - которое может представлять процент (от 0 до 100). Затем, используя функцию шага, я переношу эту числовую анимацию в цвет текста с простой шестнадцатеричной подсчетом.

    То же самое можно было бы достичь с помощью setInterval , но с помощью этого метода вы можете использовать методы анимации jQuery, такие как .stop () , и можете использовать < код> замедление и длительность .

    Очевидно, что он используется только для простых цветовых переходов, для более сложных преобразований цветов вам нужно использовать один из приведенных выше ответов - или написать свою собственную математику цветовых переходов:)

    Попробуйте это:

    (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);  
    

    вы можете просмотреть пример здесь: http://jquerydemo.com/demo/ JQuery-одушевленные-фон-color.aspx

    Плагин ColorBlend делает именно то, что вам нужно

    http://plugins.jquery.com/project/colorBlend

    Вот мой основной код

    $("#container").colorBlend([{
        colorList:["white",  "yellow"], 
        param:"background-color",
        cycles: 1,
        duration: 500
    }]);
    

    Если вы не хотите анимировать свой фон, используя только основные функции jQuery, попробуйте следующее:

    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 : ''});
                });
            });
    

    Попробуйте использовать его

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

    Попробуйте это:

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

    Пересмотренный способ с эффектами:

    jQuery(".usercontent").hover(function() {
    
        jQuery(this).fadeout("slow",function(){
            jQuery(this).animate({"color","yellow"}, "slow");
        });
    });
    
    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top