Le morceau de code suivant fonctionne parfaitement dans tous les navigateurs, barre IE. Comme d'habitude. Ce est ce qui doit arriver:jQuery: Calcul HEX à RGB différent entre les navigateurs?
- Lorsque vous survolez un lien, obtenir cette couleur de lien .
- Obtenir la valeur RVB de cette couleur, étant donné que la base CSS sera toujours définie sur une valeur HEX;
- utiliser la nouvelle valeur RGB et effectuer un calcul pour déterminer une teinte plus claire de cette couleur
- Animate cette nouvelle nuance plus claire sur une période de 0,5 secondes
- Lors du déplacement de la souris loin, restaurer la couleur de la valeur d'origine
Comme je l'ai dit, jusqu'à présent, le code fonctionne parfaitement bien, sauf dans IE. Est-ce que n'importe qui avec un nouvel ensemble d'yeux (et une ligne de cheveux intacte) peut regarder ceci? Peut-il être fait différent?
function getRGB(color) {
// Function used to determine the RGB colour value that was passed as HEX
var result;
// 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]), parseInt(result[2]), parseInt(result[3])];
// 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)];
}
var $oldColour;
// Get all the links I want to target
$('a').not('aside.meta a.notes_link, aside.meta ul li a, section.social_media a, footer a').hover(function() {
//code when hover over
//set the old colour as a variable so we can animate to that value when hovering away
$oldColour = $(this).css('color');
//run the getRGB function to get RGB value of the link we're hovering over
var rgb = getRGB($(this).css('color'));
for (var i = 0; i < rgb.length; i++)
//for each of the 3 HEX values, determine if the value + an increment of 30 (for a lighter colour) is lighter than the max (255)
//if it is, use the HEX value plus the increment, else use the max value
rgb[i] = Math.min(rgb[i] + 30, 255);
//join the new three new hex pairs together to form a sinle RGB statement
var newColor = 'rgb(' + rgb[0] + ',' + rgb[1] + ',' + rgb[2] + ')';
//animate the text link color to the new color.
$(this).animate({'color': newColor}, 500);
}, function() {
//code when hovering away
//animate the colour back using the old colour determined above
$(this).animate({'color': $oldColour}, 500);
});
J'ai hâte de vous entendre Guru's.
@icyrock - merci pour l'entrée, je vais essayer le setTimeou t idée ... Quant à l'idée console.log, console.logged moi-même à la mort: Les navigateurs non IE voient $ oldColour comme une valeur RVB, tandis que IE le voit comme un HEX. Après le premier survol, IE voit alors comme une valeur RVB. Soupir. –
OK, si c'est le seul problème, pourquoi ne vérifiez-vous pas simplement la chaîne 'rgb' et, si c'est au début, parser rgb, sinon parse hex (exemple de fonction ici: http://www.linuxtopia.org/ online_books/javascript_guides/javascript_faq/rgbtohex.htm)? L'autre bidouillage que vous pouvez essayer est de "réserver" un élément stupide, chargez tout ce que $ (...). Css() 'vous donne, mettez l'attribut CSS' color' de cet élément à cette valeur et essayez de lire depuis il - cela pourrait vous donner des valeurs rgb. –
Eish, clairement, je suis un jQuery noob ... En théorie, je comprends ce que vous voulez dire, mais je suis un peu désemparé quant à la façon de le faire :) –