jQuery анімований фонColor


327

Я намагаюся оживити зміну backgroundColor за допомогою jQuery при переході на мишу.

Я перевірив якийсь приклад, і, здається, він має рацію, він працює з іншими властивостями, такими як fontSize, але з фономColor я отримую помилку js "Недійсна властивість". Елемент, з яким я працюю, - це дів.

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

Будь-які ідеї?


Для jquery 1.4.2 з ефектом jquery 1.8 я повинен визнати, що рішення Ендрю працює ідеально. Дивіться його пост нижче.
Патрік Дежардінс

1
Примітка. Цей плагін виявляє поточний колір фону елемента - браузер Chrome повертається rgba(0, 0, 0, 0)замість очікуваного значення порожнього / нульового значення, коли не визначено колір тла. Щоб "виправити" це, елемент повинен мати початковий колір фону.
Shadow Wizard - це вухо для вас

Зв'язана сторінка здається зламаною (принаймні сторінка проекту та демонстраційна сторінка).
Паоло Стефан

Відповіді:


333

Кольоровий плагін лише на 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);

2
Добре, перейдіть за посиланням, яке пропонує Андрій. Завантажте файл. Вам потрібно додати його до свого проекту. Ви все ще можете мати jquery.effects.core у своєму проекті, це буде працювати чудово. Дякую за відповідь. +1
Патрік Дежардінс

3
Я просто вставив вищезазначене у свій існуючий файл 'jquery-ui-1.8.2.min.js' і ... все ще працювало :-)
Дейв Еверітт

7
Я хотів би зазначити, що в минулому році (2011) автор цього плагіна випустив версію 2, в якій є багато приємних функцій, але вони не потрібні для базового функціоналу, до якого зазвичай потрібна ця ліб. Зараз це величина 20 + кб. Ви можете вибрати v1гілку, щоб отримати стару версію (Яка досі працює), але набагато меншу вагу.
Арен

6
FWIW - ви можете видалити відображення кольорів до rgb у коді та зменшити розмір далі: raw.github.com/gist/1891361/… . Мінусом є те, що ви не можете використовувати назви кольорів для анімації. Вам доведеться використовувати значення rgb.
Ніяз

4
jQuery 1.8 розбиває цей штепсель у btw. curCSS вже не в jQuery.
Річ Бредшоу

68

У мене була така ж проблема і виправлено її, включивши інтерфейс 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>

61

Зробіть це за допомогою CSS3-Transitions. Підтримка чудова (всі сучасні браузери, навіть IE). З компасом та 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.cc/blog/animation-farben-css3-transition.html


6
Скрипки з наведенням і кліком переходами на: jsfiddle.net/K5Qyx
Dem Pilafian

30

У Bitstorm є найкращий плагін для кольорової анімації jquery, який я бачив. Це вдосконалення проекту кольорів jquery. Він також підтримує rgba.

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


1
Я не можу вам подякувати достатньо за те, що він підтримує 'rgba', саме це я шукав
Onimusha

13

Ви можете використовувати інтерфейс 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);
};

Після стискання з YUI це лише 1,43 кбіт:

$.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 () для зупинки поточної анімації перед тим, як почати нову, інакше, коли ви перейдете елемент надто швидко, ефект триває деякий час блимати.


11

Для тих, хто це знайде. Вам краще використовувати версію інтерфейсу jQuery UI, оскільки він працює у всіх браузерах. Кольоровий плагін має проблеми із Safari та Chrome. Це працює лише іноді.


6
-1 Остання версія версії кольорового плагіна відмінно працює в Chrome.
Андрій

3
Важко включити додатковий сценарій, щоб просто оживити тло
oneiros

11

Ви можете використовувати 2 діви:

Ви можете покласти на нього клон і згасати оригінал, затухаючи клон.

Коли зникнення буде зроблено, відновіть оригінал за допомогою нового 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


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


можливо, це спрацювало в якийсь момент, принаймні правильно, не здається, що робить те, що від нього очікується.
epeleg

@epeleg - Для мене працює mac chrome. Ви натискаєте на кольоровий прямокутник, і він змінює колір (2013 - 07 - 15)
Peter Ajtai

Я не знаю як, але насправді зараз це працює на моїх хромах Windows7. можливо, пов’язане з хромованим оновленням, яке я робив у день події ?! у будь-якому випадку, як я вже сказав, це справді працює зараз.
epeleg

8

Я використовував комбінацію переходів 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; 
   }

6

Цього дня кольоровий плагін 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]

1
Скажіть, будь ласка, джерело. Дякуємо за перелік btw.
Шрікант Шарат

Цей список з’явився з кольорового плагіна jQuery: plugins.jquery.com/project/color
spoulson

2
-1 Ваш кольоровий список посилається на застарілу версію. Поточна версія має хоча б один додатковий колір, який я помітив.
Андрій

5

Мені подобається використовувати затримку (), щоб зробити це, ось приклад:

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

Це може бути викликано функцією, причому "елемент" є класом елемента / ім'ям і т.д. Елемент миттєво з’явиться з фоном # FCFCD8, затримається на секунду, а потім зникне в #EFEAEA.


4

Просто додайте наступний фрагмент нижче свого сценарію jquery і насолоджуйтесь:

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

Дивіться приклад

Довідка для отримання додаткової інформації


Будь ласка, вкажіть приклади, щоб вони не схильні до гниття посилань.
Еге Оскан

2

Я наткнувся на цю сторінку з тим же питанням, але такі проблеми:

  1. Я не можу включити додатковий файл плагіна jQuery з моєю поточною настройкою.
  2. Мені не комфортно вставляти великі блоки коду, які я не встигаю прочитати і перевірити.
  3. У мене немає доступу до css.
  4. Я майже не мав часу на реалізацію (це було лише візуальне вдосконалення сторінки адміністратора)

З урахуванням сказаного, це майже виключає кожну відповідь. Вважаючи, що зникнення кольору було дуже простим, я замість цього застосував такий швидкий злом:

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()- і ви можете використовувати easingіduration .

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


2

Спробуйте це:

(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-animate-background-color.aspx



1

Якщо ви не хочете анімувати фон, використовуючи лише основні функції 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 : ''});
            });
        });

0

Спробуйте використати його

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

0

Спробуйте це:

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");
    });
});
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.