RGB値ではなく16進数のカラー値を取得する方法は?


171

次のjQueryを使用すると、要素の背景色のRGB値が取得されます。

$('#selector').css('backgroundColor');

RGBではなく16進値を取得する方法はありますか?


2
関連のトピックでは、六角とRGBの色の間の変換するにはより多くの(そして、おそらくより良い)方法はここにある:stackoverflow.com/questions/5623838/rgb-to-hex-and-hex-to-rgbこのホイールは十分な回数を再発明されましたロードトレインを構築します。私は、人気のあるJSライブラリの1つが、より少なくシンプルでユーティリティ関数を持つことを望んでいました。
Michael Scheper、2015年

一部のブラウザは、黒ではなく透明であるrgba(0,0,0,0)などのrgba(#、#、#、#)を返すことに注意してください。4番目の値は不透明度で、1.0はフルカラー100%、0.5は50%です。
Twelve24

回答:


141
var hexDigits = new Array
        ("0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"); 

//Function to convert rgb color to hex format
function rgb2hex(rgb) {
 rgb = rgb.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/);
 return "#" + hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]);
}

function hex(x) {
  return isNaN(x) ? "00" : hexDigits[(x - x % 16) / 16] + hexDigits[x % 16];
 }

出典


7
+ 1、Number.toString(16)を使用できます-少なくとも各16進数字(または16未満の場合は0を
埋め込む

19
-1。oripで述べたように、toString(16)を使用できます。他の非効率のために反対投票。すべての関数呼び出しでhexDigitsを宣言する場合は、少なくともrgb2hexの関数本体(16進数の本体ではない)で宣言するので、rgb2hexへの1回の呼び出しで配列が3回再定義されません。また、 'var'の使用方法を学習して、グローバルスコープを汚染しないようにします。
マット

3
この方法では、空白や大文字の違いを許容できません。jsfiddle.net/Xotic750/pSQ7d
Xotic750

1
あなたが本当に徹底的になりたいなら、あなたは正規表現をより寛容にすることができます:rgb.match(/^rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/i)しかし、与えられた正規表現はjQueryを使用するときにブラウザによって与えられたフォーマットに対処するように設計されており、これは異なる空白やキャプティライゼーションの一貫性を持っていませんあなたは話している。同じ正規表現を使用して、すべての空白を削除し、小文字に変換してから、rgbで照合することもできます。PSあなたのフィドルの例: 'rgb(
10、128

私にとっては、jquery css background-colorsの戻りはrgbaの形式で提供されるため、これは機能しません。
ミゲル

159

@Mattの提案に基づいて私が作成した、よりクリーンなソリューションを次に示します。

function rgb2hex(rgb) {
    rgb = rgb.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/);
    function hex(x) {
        return ("0" + parseInt(x).toString(16)).slice(-2);
    }
    return "#" + hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]);
}

一部のブラウザはすでに16進数として色を返します(Internet Explorer 8以下の場合)。これらのケースに対処する必要がある場合は、@ gfrobeniusが提案するように、関数内に条件を追加するだけです。

function rgb2hex(rgb) {
    if (/^#[0-9A-F]{6}$/i.test(rgb)) return rgb;

    rgb = rgb.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/);
    function hex(x) {
        return ("0" + parseInt(x).toString(16)).slice(-2);
    }
    return "#" + hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]);
}

jQueryを使用していて、より完全なアプローチが必要な場合は、この質問に答えたときに示したように、jQuery 1.4.3以降で使用可能なCSSフックを使用できます。


2
私は皆さんにお勧めします。jQueryCSSフックを使用して改善されたバージョンを確認するには、ここで私の応答を見てください。
Erick Petrucelli

1
@ギゴ、申し訳ありませんが、あなたは間違っています。IE8は、現在のスタイルを取得するときに、色を16進数として既に返していますdocument.getElementById("your_id").currentStyle["backgroundColor"]。関数rgb2hex()は必要ありません。ここではjQueryのは、私はすでに別のブラウザで色を回復するために、すべての検証を行いいる、上記に提案することをCSSフックを使用して、プラグインの:stackoverflow.com/questions/6177454/...
エリックPetrucelli

2
@Ghigo、私はあなたが誤解していると思います:HEXで戻るブラウザを使用している場合は、この関数を使用しないでください。この関数はRGBをHEXに変換します。RGBでない場合は使用しないでください。(@ Jim-Fによって作成されたように、値が既にRGBであるかどうかを検出する)より完全なソリューションが必要であるという事実は、このソリューションがOPによって要求されたものを正確に提供するという事実を変えません。あなたの反対票は意味がありません。
エリックペトルチェッリ2013年

4
申し訳ありませんが、同意しません。クロスブラウザー機能は、ブラウザー検出に基づいて実行する必要がある機能よりも常に優れています。opは、$('#selector').css('backgroundColor')hexへのrgb値ではなく、hex への変換を要求しました。IE8では、$('#selector').css('backgroundColor')すでに16進数なので、処理する必要があります。それでおしまい。私を怒らせないでください:)
Ghigo

1
この人たち、私がrgb2hex()関数に追加したシンプルなワンライナー、@ ErickPetruに感謝!私はIE7にコードを戻さないといけないと信じています。.css('backgroundColor')ネイティブobj.style.backgroundColor私は最初の行としてこれを追加してIE7&8は、六角ではなく、RGBを返しますrgb2hex():それはIE7に戻ってすべての方法を動作しますので、付属の回答で機能/* IE7&8 will return hex, so no need to run this function if it is already hex. */ if (/^#[0-9A-F]{6}$/i.test(rgb)) return rgb.substring(1, 7); //I'm doing a subtring here because I do not want the leading # symbolに役立ちます願っています。
gfrobenius 2014年

61

ほとんどのブラウザは、次を使用するとRGB値を返すようです:

$('#selector').css('backgroundColor');

IE(これまでにテストされた6つのみ)のみが16進数値を返します。

IEでエラーメッセージを回避するには、関数をifステートメントでラップします。

function rgb2hex(rgb) {
     if (  rgb.search("rgb") == -1 ) {
          return rgb;
     } else {
          rgb = rgb.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*(\d+))?\)$/);
          function hex(x) {
               return ("0" + parseInt(x).toString(16)).slice(-2);
          }
          return "#" + hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]); 
     }
}

1
Jimはrgbaを考慮に入れるため、これは他のほとんどのものよりも優れており、これはSafari(少なくともMac OS Xでは)が使用するものです。ありがとう、ジム!
パスカルリンデラウフ

1
素晴らしいソリューション。関数は小文字、つまり#FF5544ではなく#ff5544を返すことに注意してください。
Peter

この正規表現は、上記のソリューションでaplhaチャネルもサポートしますrgb = rgb.match(/ ^ rgba?((\ d +)、\ s *(\ d +)、\ s *(\ d +)(?:、\ s * (0 \。\ d +))?)$ /);
Henning Winter

魅力的な作品
ucMedia

22

rgba互換性のために@ErickPetruを更新:

function rgb2hex(rgb) {
    rgb = rgb.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*(\d+))?\)$/);
    function hex(x) {
        return ("0" + parseInt(x).toString(16)).slice(-2);
    }
    return "#" + hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]);
}

定義されている場合、アルファ値と一致するように正規表現を更新しましたが、使用しません。


完全を期すために、私はPowerPointにエクスポートするものに取り組んでいます(質問しないでください...)。これは、アルファチャネルの16進文字列の4番目のバイトを受け入れるため、次のように使用できます。 return hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]) /* Add the alpha channel if it exists */ + (rgb[5] !== undefined ? hex(Math.round(rgb[5] * 255)) : ''); また、#シンボルを削除して、最終的な用途にとらわれないようにしています(出力を取得して0x、たとえば、先頭に追加するか、プレフィックスなしで残すことができます)。それが誰かを助けることを願っています!
オスカーゴメスアルカニス2016年

10

jQueryを使用しないES6ワンライナーは次のとおりです。

var rgb = document.querySelector('#selector').style['background-color'];
return '#' + rgb.substr(4, rgb.indexOf(')') - 4).split(',').map((color) => parseInt(color).toString(16)).join('');

1
おかげで、以前の回答の正規表現のバックスラッシュを取り除いたWordpressページに組み込むことができました。
ジェイソン

5

これも透明性をチェックするバージョンです。私のオブジェクトは結果をスタイル属性に挿入することでしたので、これが必要でした。16進数の色の透明バージョンは、実際には「透明」という単語です。

function rgb2hex(rgb) {
     if (  rgb.search("rgb") == -1 ) {
          return rgb;
     }
     else if ( rgb == 'rgba(0, 0, 0, 0)' ) {
         return 'transparent';
     }
     else {
          rgb = rgb.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*(\d+))?\)$/);
          function hex(x) {
               return ("0" + parseInt(x).toString(16)).slice(-2);
          }
          return "#" + hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]); 
     }
}

4

要素の背景色を16進数で返す関数。

function getBgColorHex(elem){
    var color = elem.css('background-color')
    var hex;
    if(color.indexOf('#')>-1){
        //for IE
        hex = color;
    } else {
        var rgb = color.match(/\d+/g);
        hex = '#'+ ('0' + parseInt(rgb[0], 10).toString(16)).slice(-2) + ('0' + parseInt(rgb[1], 10).toString(16)).slice(-2) + ('0' + parseInt(rgb[2], 10).toString(16)).slice(-2);
    }
    return hex;
}

使用例:

$('#div1').click(function(){
   alert(getBgColorHex($(this));
}

jsfiddle


4

@Jim Fの回答と同じ回答です が、ES6構文なので、指示は少なくなります。

const rgb2hex = (rgb) => {
  if (rgb.search("rgb") === -1) return rgb;
  rgb = rgb.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*(\d+))?\)$/);
  const hex = (x) => ("0" + parseInt(x).toString(16)).slice(-2);
  return "#" + hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]);
};

3

ブートストラップカラーピッカーから取得したカラークラス

// Color object
var Color = function(val) {
    this.value = {
        h: 1,
        s: 1,
        b: 1,
        a: 1
    };
    this.setColor(val);
};

Color.prototype = {
    constructor: Color,

    //parse a string to HSB
    setColor: function(val){
        val = val.toLowerCase();
        var that = this;
        $.each( CPGlobal.stringParsers, function( i, parser ) {
            var match = parser.re.exec( val ),
            values = match && parser.parse( match ),
            space = parser.space||'rgba';
            if ( values ) {
                if (space === 'hsla') {
                    that.value = CPGlobal.RGBtoHSB.apply(null, CPGlobal.HSLtoRGB.apply(null, values));
                } else {
                    that.value = CPGlobal.RGBtoHSB.apply(null, values);
                }
                return false;
            }
        });
    },

    setHue: function(h) {
        this.value.h = 1- h;
    },

    setSaturation: function(s) {
        this.value.s = s;
    },

    setLightness: function(b) {
        this.value.b = 1- b;
    },

    setAlpha: function(a) {
        this.value.a = parseInt((1 - a)*100, 10)/100;
    },

    // HSBtoRGB from RaphaelJS
    // https://github.com/DmitryBaranovskiy/raphael/
    toRGB: function(h, s, b, a) {
        if (!h) {
            h = this.value.h;
            s = this.value.s;
            b = this.value.b;
        }
        h *= 360;
        var R, G, B, X, C;
        h = (h % 360) / 60;
        C = b * s;
        X = C * (1 - Math.abs(h % 2 - 1));
        R = G = B = b - C;

        h = ~~h;
        R += [C, X, 0, 0, X, C][h];
        G += [X, C, C, X, 0, 0][h];
        B += [0, 0, X, C, C, X][h];
        return {
            r: Math.round(R*255),
            g: Math.round(G*255),
            b: Math.round(B*255),
            a: a||this.value.a
        };
    },

    toHex: function(h, s, b, a){
        var rgb = this.toRGB(h, s, b, a);
        return '#'+((1 << 24) | (parseInt(rgb.r) << 16) | (parseInt(rgb.g) << 8) | parseInt(rgb.b)).toString(16).substr(1);
    },

    toHSL: function(h, s, b, a){
        if (!h) {
            h = this.value.h;
            s = this.value.s;
            b = this.value.b;
        }
        var H = h,
        L = (2 - s) * b,
        S = s * b;
        if (L > 0 && L <= 1) {
            S /= L;
        } else {
            S /= 2 - L;
        }
        L /= 2;
        if (S > 1) {
            S = 1;
        }
        return {
            h: H,
            s: S,
            l: L,
            a: a||this.value.a
        };
    }
};

使い方

var color = new Color("RGB(0,5,5)");
color.toHex()

3

読み取り可能&& Reg-expフリー(Reg-expなし)

読みやすい基本関数を使用し、正規表現を使用しない関数を作成しました。
この関数は、16進、rgb、またはrgba CSS形式の色を受け入れ、16 進表現を返します。
編集: rgba()形式の解析にバグがあり、修正されました...

function getHexColor( color ){
    //if color is already in hex, just return it...
    if( color.indexOf('#') != -1 ) return color;
    
    //leave only "R,G,B" :
    color = color
                .replace("rgba", "") //must go BEFORE rgb replace
                .replace("rgb", "")
                .replace("(", "")
                .replace(")", "");
    color = color.split(","); // get Array["R","G","B"]
    
    // 0) add leading #
    // 1) add leading zero, so we get 0XY or 0X
    // 2) append leading zero with parsed out int value of R/G/B
    //    converted to HEX string representation
    // 3) slice out 2 last chars (get last 2 chars) => 
    //    => we get XY from 0XY and 0X stays the same
    return  "#"
            + ( '0' + parseInt(color[0], 10).toString(16) ).slice(-2)
            + ( '0' + parseInt(color[1], 10).toString(16) ).slice(-2)
            + ( '0' + parseInt(color[2], 10).toString(16) ).slice(-2);
}

1
rgba(0,0,0,0)では機能しません。まず、順序を変更する必要があります。.replace("rgba", "") .replace("rgb", "") .replace("(", "") .replace(")", "");それ以外の場合は、a0,0,0,0が残ります。そして、透明ではなく黒である#000000を返します。
Twelve24

rgbaの4番目の値が0(ゼロ)の場合、その「要素」のcssは次のようになります:element {color:#000000、opacity:0.0;}これは透明であるか、条件付きで 'rgba(0,0 、0,0) '呼び出し元に戻ります。
Twelve24

@ Twelve24解析が修正されました-コメントを読む前に実際に気づきましたが、間違いなく感謝します:)、透明度については -関数はHEXA色または「基本色」を返すことになっているため、意図的にそうなっています:)
jave.web

3

試す

// c - color str e.g."rgb(12,233,43)", result color hex e.g. "#0ce92b"
let rgb2hex= c=> '#'+c.match(/\d+/g).map(x=>(+x).toString(16).padStart(2,0)).join``


2

これは少し良く見えます:

var rgb = $('#selector').css('backgroundColor').match(/\d+/g);
var r   = parseInt(rgb[0], 10);
var g   = parseInt(rgb[1], 10);
var b   = parseInt(rgb[2], 10);
var hex = '#'+ r.toString(16) + g.toString(16) + b.toString(16);

より簡潔なワンライナー:

var rgb = $('#selector').css('backgroundColor').match(/\d+/g);
var hex = '#'+ Number(rgb[0]).toString(16) + Number(rgb[1]).toString(16) + Number(rgb[2]).toString(16);

jQueryに常に16進数を返すように強制する:

$.cssHooks.backgroundColor = {
    get: function(elem) {
        if (elem.currentStyle)
            var bg = elem.currentStyle["backgroundColor"];
        else if (window.getComputedStyle) {
            var bg = document.defaultView.getComputedStyle(elem,
                null).getPropertyValue("background-color");
        }
        if (bg.search("rgb") == -1) {
            return bg;
        } else {
            bg = bg.match(/\d+/g);
            function hex(x) {
                return ("0" + parseInt(x).toString(16)).slice(-2);
            }
            return "#" + hex(bg[0]) + hex(bg[1]) + hex(bg[2]);
        }
    }
}

2

上記の@ジャスティンの答えに追加するだけです。

そのはず

var rgb = document.querySelector('#selector').style['background-color'];
return '#' + rgb.substr(4, rgb.indexOf(')') - 4).split(',').map((color) => String("0" + parseInt(color).toString(16)).slice(-2)).join('');

上記の解析int関数は先行ゼロを切り捨てるため、5文字または4文字の誤ったカラーコードが生成される可能性があります。

ありがとう


1

IEでスクリプトエラーをスローしないことがわかった解決策は次のとおりです。http//haacked.com/archive/2009/12/29/convert-rgb-to-hex.aspx


古いバージョンのIEでは、jqueryを使用してオブジェクトのカラー値をフェッチすると、rgbではなく16進数が返されることがありますが、最近のほとんどのブラウザはRGBを返します。関数へのリンクは両方のユースケースを処理します
Paul T

1

Steven Pribilinskiyの答えは、先行ゼロを落とします。たとえば、#ff0000は#ff00になります。

解決策は、先頭の0と最後の2桁からサブストリングを追加することです。

var rgb = $('#selector').css('backgroundColor').match(/\d+/g);
var hex = '#'+ String('0' + Number(rgb[0]).toString(16)).slice(-2) + String('0' + Number(rgb[1]).toString(16)).slice(-2) + String('0' + Number(rgb[2]).toString(16)).slice(-2);

1

質問はJQueryを使用していたため、Daniel Elliottのコードに基づくJQueryプラグインを次に示します。

$.fn.cssAsHex = function(colorProp) {

    var hexDigits = '0123456789abcdef';

    function hex(x) {
        return isNaN(x) ? '00' : hexDigits[(x - x % 16) / 16] + hexDigits[x % 16];
    };

    // Convert RGB color to Hex format
    function rgb2hex(rgb) {
        var rgbRegex = rgb.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/);
        return '#' + hex(rgbRegex[1]) + hex(rgbRegex[2]) + hex(rgbRegex[3]);
    };

    return rgb2hex(this.css(colorProp));
};

次のように使用します。

var hexBackgroundColor = $('#myElement').cssAsHex('background-color');

0

ここに私の解決策もない、あるtoUpperCaseの他の可能なホワイトスペース、指定された文字列で、大文字の引数とチェックの使用による。

var a = "rgb(10, 128, 255)";
var b = "rgb( 10, 128, 255)";
var c = "rgb(10, 128, 255 )";
var d = "rgb ( 10, 128, 255 )";
var e = "RGB ( 10, 128, 255 )";
var f = "rgb(10,128,255)";
var g = "rgb(10, 128,)";

var rgbToHex = (function () {
    var rx = /^rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/i;

    function pad(num) {
        if (num.length === 1) {
            num = "0" + num;
        }

        return num;
    }

    return function (rgb, uppercase) {
        var rxArray = rgb.match(rx),
            hex;

        if (rxArray !== null) {
            hex = pad(parseInt(rxArray[1], 10).toString(16)) + pad(parseInt(rxArray[2], 10).toString(16)) + pad(parseInt(rxArray[3], 10).toString(16));

            if (uppercase === true) {
                hex = hex.toUpperCase();
            }

            return hex;
        }

        return;
    };
}());

console.log(rgbToHex(a));
console.log(rgbToHex(b, true));
console.log(rgbToHex(c));
console.log(rgbToHex(d));
console.log(rgbToHex(e));
console.log(rgbToHex(f));
console.log(rgbToHex(g));

オンjsfiddle

jsperfの速度比較

更なる改善がある可能性があり、文字列trim()rgb

var rxArray = rgb.trim().match(rx),

0

私の美しい非標準ソリューション

HTML

<div id="selector" style="background-color:#f5b405"></div>

jQuery

$("#selector").attr("style").replace("background-color:", "");

結果

#f5b405

1
すべてのスタイルを返します。:c
エディ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.