jQuery: вычисления HEX в RGB отличаются в разных браузерах? - PullRequest
2 голосов
/ 24 ноября 2010

Следующий фрагмент кода отлично работает во всех браузерах, кроме IE.По-прежнему.Вот что должно произойти:

  1. При наведении на ссылку, получите этот цвет ссылки.
  2. Получите значение RGB этого цвета, так как базовый CSS всегда будет установлендо значения HEX;
  3. Используйте новое значение RGB и выполните расчет, чтобы определить более светлый оттенок этого цвета
  4. Анимируйте этот более светлый оттенок за период 0,5 с
  5. При удалении мыши восстановите цвет к исходному значению

Как я уже сказал, пока код работает абсолютно нормально, кроме IE.Может ли кто-нибудь со свежим взглядом (и неповрежденной линией волос) взглянуть на это?Можно ли это сделать иначе?

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

Я с нетерпением жду, чтобы услышать от вас, Гуру.

Ответы [ 2 ]

7 голосов
/ 24 ноября 2010

У вас нет IE, чтобы протестировать его, но если проблема отображается только в первый раз, попробуйте использовать setTimeout с очень небольшим тайм-аутом (10 мс или около того) для вызова вашего кода во второй раз.

Кроме того, возможно, стоит просто выяснить, какая часть кода не работает - я полагаю, $oldColour = $(this).css('color');, но добавьте немного console.log и выясните, это, вероятно, поможет, и вы даже можете узнать,что-то еще происходит, что вы не видите прямо сейчас.

РЕДАКТИРОВАТЬ: Примерно так:

$oldColour = $(this).css('color');
var rgb;
if($oldColour.substring(0, 3) == 'rgb') {
   rgb = getRGB($oldColour);
} else { // it's a hex
   rgb = getFromHex($oldColour);
}

где getFromHex может быть что-то вроде того, что из http://www.richieyan.com/blog/article.php?artID=32, измененыработать так, как вы ожидаете:

function hex2rgb(hexStr){
    // note: hexStr should be #rrggbb
    var hex = parseInt(hexStr.substring(1), 16);
    var r = (hex & 0xff0000) >> 16;
    var g = (hex & 0x00ff00) >> 8;
    var b = hex & 0x0000ff;
    return [r, g, b];
}
0 голосов
/ 24 ноября 2010

С помощью icyrock вот так выглядит окончательный код:

function getRGB(color) {
    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;

$('a').not('aside.meta a.notes_link, aside.meta ul li a, section.social_media a, footer a').hover(function() {
    //code when hover over
    $(this).stop(true, true);
    $oldColour = $(this).css('color');

    var rgb;

    function hex2rgb(hexStr){
        // note: hexStr should be #rrggbb
        var hex = parseInt(hexStr.substring(1), 16);
        var r = (hex & 0xff0000) >> 16;
        var g = (hex & 0x00ff00) >> 8;
        var b = hex & 0x0000ff;
        return [r, g, b];
    }


    if($oldColour.substring(0, 3) == 'rgb') {
       rgb = getRGB($oldColour);
    } else { // it's a hex
       rgb = hex2rgb($oldColour);
    }

    for (var i = 0; i < rgb.length; i++)
        rgb[i] = Math.min(rgb[i] + 30, 255);
        var newColor = 'rgb(' + rgb[0] + ',' + rgb[1] + ',' + rgb[2] + ')';

    $(this).animate({'color': newColor}, 500);

}, function() {
    //code when hovering away
    $(this).stop(true, true);
    $(this).animate({'color': $oldColour}, 500);
});
...