Je peux animer de transparent à couleur, mais lorsque je demande à jQuery d’animer l’arrière-plan backgroundColor: «transparent», il devient simplement blanc. Une idée comment résoudre ce problème?
Transparent n'est pas vraiment une couleur. Donc, vous ne pouvez pas l'animer. Vous pourrez peut-être obtenir l'effet que vous recherchez en utilisant un élément distinct pour l'arrière-plan et en animant l'opacité.
HTML:
<body style="background-color:yellow">
<!-- by default, "see through" to parent's background color -->
<div id="container">
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Aenean nec magna. Nulla eu mi sit amet nibh pellentesque vehicula.
Vivamus congue purus non purus. Nam cursus mollis lorem.
</div>
</body>
Scénario:
// on load...
$(function()
{
var container = $("#container");
container
.hover(
// fade background div out when cursor enters,
function()
{
$(".background", this).stop().animate({opacity:0});
},
// fade back in when cursor leaves
function()
{
$(".background", this).stop().animate({opacity:1})
})
// allow positioning child div relative to parent
.css('position', 'relative')
// create and append background div
// (initially visible, obscuring parent's background)
.append( $("<div>")
.attr('class', 'background')
.css({
backgroundColor:'blue',
position: 'absolute',
top:0,
left:0,
zIndex:-1,
width:container.width(),
height:container.height()
})
);
});
Le commentaire de Kingjeffrey indique que cette réponse est quelque peu dépassée - les navigateurs prennent désormais en charge les valeurs de couleur RGBA, de sorte que vous pouvez animer uniquement l'arrière-plan. Cependant, jQuery ne supporte pas cela dans le noyau - vous aurez besoin d’un plugin . Voir aussi: jQuery + animations couleur RGBA
Je voulais faire cela et comme je ne pouvais pas le trouver, je l'ai piraté ensemble. Ceci est uniquement pour le blanc, convient à vos besoins:
function animate_bg(ele, from, to) {
ele.css("background-color", "rgba(255, 255, 255, " + (from += from > to ? -1 : 1) / 10 + ")");
if(from != to)
setTimeout(function() { animate_bg(ele, from, to) }, 20);
}
Utilisation:
</ pre>
$("a").hover(
function() {return animate_bg($(this), 0, 10)},
function() {return animate_bg($(this), 10, 0)}
);
$(selector)
.css({backgroundColor:"#f00"})
.animate({backgroundColor:"transparent"}, 2000, null,
function() { this.style.backgroundColor='transparent'; });
Pas aussi propre car il fade le bg en blanc avant de le rendre transparent, mais c'est une option.
Vous pouvez utiliser la couleur rgba (61, 31, 17, 0.5) où 0.5 est l'opacité. Ensuite, si vous voulez transparent, définissez l'opacité sur 0.0
$('.myClass').animate({ "backgroundColor" : "rgba(61, 31, 17, 0.0)" }, 1000);
Utiliser la transition CSS:
$('smth').css('transition','background-color 1s').css('background-color','transparent')
ou
$('h1').css({'transition':'background-color 1s','background-color':'red'})
J'ai utilisé la réponse de Linus mais j'ai rencontré IE. Changé un peu pour fonctionner aussi dans IE:
function animate_bg(ele, from, to) {
from += from > to ? -1 : 1;
if(!$.support.opacity){
if(from != to){
var opStr = (Math.round(from * 25.5)).toString(16);
//alert(opStr)
ele.css({background:'transparent',filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#" + opStr + "FFFF00, endColorstr=#" + opStr + "FFFF00)"});
}else{
ele.css({background:'transparent',filter:"none"});
}
}else{
ele.css("backgroundColor", "rgba(255, 255, 0, " + (from) / 10 + ")");
}
if(from != to)
setTimeout(function() { animate_bg(ele, from, to) }, 50);
}
L'utilisation est la même:
$("a").hover(
function() {return animate_bg($(this), 0, 10)},
function() {return animate_bg($(this), 10, 0)}
);
J'ai un peu modifié le code de Shog9 pour l'adapter à mes besoins ... C'est un peu comme le jQuery UI Highlight, sauf qu'il ne s'estompe pas en blanc. Ce n'est pas parfait, mais cela fonctionne sur la plupart des éléments
function highlight(element, color, speed) {
if (speed == null) speed = "fast";
var e;
var position;
element.each(function() {
e = $(this);
position = e.css('position');
if (position != 'absolute')
e.css('position', 'relative');
log(position);
e.append($("<div>")
.css({
backgroundColor: color,
position: 'absolute',
top: 0,
left: 0,
zIndex: -1,
display: "none",
width: e.width(),
height: e.height()
}).fadeIn(speed).fadeOut(speed, function() { $(this).remove(); e.css('position', position); })
);
}); }
J'ai utilisé le paramètre de fonction pour supprimer le style une fois l'animation terminée:
$('[orgID=' + orgID + 'bg]').animate({ backgroundColor: "white" }, 300, "linear", function()
{
$('[orgID=' + orgID + 'bg]').css('background-color', '');
});
Cela a très bien fonctionné.
Vous devez l'enchaîner.
Par exemple, vous ne pouvez pas faire ceci:
$('#panel').animate({'backgroundColor' : 'rgba(255,255,0,0.7', 'opacity': 1}, 3000);
ou même
$('#panel').animate({'background-color' : 'yellow', 'opacity': 1}, 3000);
mais vous pouvez faire ceci:
$('#panel').css('background-color', 'rgba(255,255,0,0.7)').animate({'opacity': 1}, 3000);
Utilisez le plugin jQuery Color: https://github.com/jquery/jquery-color
Vos animations transparentes et rgba fonctionneront correctement.
Utilisez background au lieu de backgroundColor:
$('#myDiv').animate({background: "transparent"});
Ma solution consistait à animer la couleur vue par l'utilisateur (c'est-à-dire la couleur de l'élément parent), puis à la couleur d'origine (qui peut ou non être "transparente") une fois l'animation terminée.
var $t = $(some selector);
var seenColour = findColour($t, 'background-color');
var origColour = $t.css('background-color');
$t.css('background-color', '#ffff99');
$t.animate(
{backgroundColor: seenColour},
4000,
function(){ $t.css('background-color', origColour)}
);
function findColour($elem, colourAttr)
{
var colour = $elem.css(colourAttr);
if (colour === 'transparent')
{
var $parent = $elem.parent();
if ($parent)
{
return findColour($parent, colourAttr);
}
// Default to white
return '#FFFFFF';
}
return colour;
}