วิธีรับค่าสีฐานหกแทนที่จะเป็นค่า RGB


171

การใช้ jQuery ต่อไปนี้จะได้รับค่า RGB ของสีพื้นหลังขององค์ประกอบ:

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

มีวิธีรับค่า hex มากกว่า RGB หรือไม่?


2
ในหัวข้อที่เกี่ยวข้องมีวิธีการแปลง (และดีกว่า arguably) ระหว่างสี hex และ RGB เพิ่มเติมได้ที่นี่: stackoverflow.com/questions/5623838/rgb-to-hex-and-hex-to-rgbสำหรับล้อสีนี้ เพื่อสร้างถนนรถไฟ ฉันหวังว่าหนึ่งในไลบรารี JS ยอดนิยมที่เรียบง่ายกว่าจะมีฟังก์ชันยูทิลิตี้
Michael Scheper

โปรดจำไว้ว่าบางเบราว์เซอร์จะส่งคืน rgba (#, #, #, #) เช่น rgba (0,0,0,0) ซึ่งมีความโปร่งใสไม่ใช่สีดำ ค่าที่สี่คือความทึบโดย 1.0 เป็นสีเต็ม 100% และ 0.5 เป็น 50%
สิบสอง 24

คำตอบ:


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) - อย่างน้อยสำหรับแต่ละเลขฐานสิบหก (หรือแผ่นที่มี 0 ถ้าต่ำกว่า 16)
orip

19
-1 ตามที่กล่าวโดย orip คุณสามารถใช้ toString (16) ลงคะแนนสำหรับความไร้ประสิทธิภาพอื่น ๆ หากคุณจะประกาศ hexDigits ทุกครั้งที่มีการเรียกใช้ฟังก์ชันให้ทำอย่างน้อยในส่วนของฟังก์ชั่น rgb2hex (ไม่ใช่ตัวฐานสิบหก) ดังนั้นอาร์เรย์จะไม่นิยามใหม่ 3 ครั้งต่อ 1 การเรียกไปยัง rgb2hex เรียนรู้การใช้ 'var' ด้วยดังนั้นคุณจะไม่สร้างความเสียหายให้กับขอบเขตทั่วโลก
แมตต์

3
วิธีนี้ดูเหมือนจะไม่ยอมให้มีการแบ่งพื้นที่สีขาวหรือตัวพิมพ์ใหญ่มาก jsfiddle.net/Xotic750/pSQ7d
Xotic750

1
หากคุณต้องการเป็นคนที่คลั่งไคล้คุณสามารถทำให้ regex มีสิทธิ์ได้มากขึ้น: rgb.match(/^rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$/i)อย่างไรก็ตาม regex ที่ได้รับนั้นถูกออกแบบมาเพื่อรับมือกับรูปแบบที่เบราว์เซอร์ให้เมื่อใช้ jQuery และสิ่งนี้ไม่ได้มีพื้นที่สีขาวที่แตกต่างกัน คุณกำลังพูดถึง คุณสามารถใช้ regex เดียวกันและเพียงแค่ลบช่องว่างทั้งหมดและแปลงเป็นตัวพิมพ์เล็กก่อนที่จะจับคู่กับ rgb PS ตัวอย่างซอของคุณ: 'rgb (10, 128,)' ฉันไม่คิดว่ามันมีเหตุผลที่จะทดสอบใน
binderbound

และสำหรับฉันการกลับมาของ jquery css background-colors มาในรูปแบบกับ rgba ดังนั้นสิ่งนี้จึงใช้ไม่ได้
Miguel

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

เบราว์เซอร์บางตัวมีสีเป็นเลขฐานสิบหกอยู่แล้ว (ตั้งแต่ 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 และต้องการวิธีการที่สมบูรณ์ยิ่งขึ้นคุณสามารถใช้CSS Hooksได้ตั้งแต่ jQuery 1.4.3 ดังที่ฉันแสดงเมื่อตอบคำถามนี้: ฉันสามารถบังคับให้ jQuery.css ("backgroundColor") กลับมาเป็นรูปแบบเลขฐานสิบหกได้หรือไม่


2
ฉันขอแนะนำให้ทุกคน: ดูที่การตอบสนองของฉันที่นี่เพื่อดูรุ่นที่ดีขึ้นโดยใช้jQuery CSS เบ็ด
Erick Petrucelli

1
@Ghigo ขอโทษ แต่คุณคิดผิด IE8 document.getElementById("your_id").currentStyle["backgroundColor"]แล้วส่งกลับสีเป็นเลขฐานสิบหกเมื่อได้รับรูปแบบในปัจจุบันวิธีนี้: rgb2hex()ไม่จำเป็นต้องใช้ฟังก์ชั่น นี่คือปลั๊กอิน jQuery โดยใช้ CSS Hooks ที่ฉันแนะนำไว้ข้างต้นซึ่งทำการตรวจสอบทั้งหมดเพื่อกู้คืนสีในเบราว์เซอร์ที่แตกต่างกันอยู่แล้ว: stackoverflow.com/questions/6177454/…
Erick Petrucelli

2
@Ghigo ฉันคิดว่าคุณเข้าใจผิด: คุณไม่ควรใช้ฟังก์ชั่นนี้หากคุณอยู่ในเบราว์เซอร์ที่กลับมาเป็น HEX ฟังก์ชั่นนี้แปลง RGB เป็น HEX และเพียงแค่นั้น อย่าใช้มันเมื่อไม่ได้อยู่ใน RGB ความจริงที่ว่าคุณต้องการโซลูชันที่สมบูรณ์มากขึ้น (ซึ่งตรวจพบว่าค่านั้นเป็น RGB อยู่แล้วโดย @ Jim-F) ไม่ได้เปลี่ยนความจริงที่ว่าโซลูชันนี้มีสิ่งที่ร้องขอโดย OP Downvote ของคุณไม่มีเหตุผลขอโทษ
Erick Petrucelli

4
ฉันขอโทษ แต่ฉันไม่เห็นด้วย ฟังก์ชั่นข้ามเบราว์เซอร์ดีกว่าหนึ่งที่ต้องดำเนินการตามการตรวจสอบเบราว์เซอร์ Op ขอให้แปลง$('#selector').css('backgroundColor')เป็น hex ไม่ใช่ค่า rgb เป็น hex และใน IE8 $('#selector').css('backgroundColor')นั้นมีเลขฐานสิบหกอยู่แล้วดังนั้นจึงต้องจัดการ แค่นั้นแหละ. อย่าโกรธฉันเลย :)
Ghigo

1
ทำแบบนี้กับซับง่ายๆที่ฉันเพิ่มเข้าไปในrgb2hex()ฟังก์ชั่นขอบคุณ @ErickPetru! ฉันต้องโค้ดกลับไปที่ IE7 เชื่อหรือไม่ ด้วย.css('backgroundColor')และพื้นเมืองobj.style.backgroundColorIE7 & 8 จะคืนค่า hex ไม่ใช่ 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

61

เบราว์เซอร์ส่วนใหญ่ดูเหมือนจะคืนค่า RGB เมื่อใช้:

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

เฉพาะ IE (ทดสอบเพียง 6 ครั้งเท่านั้น) จะส่งกลับค่า Hex

เพื่อหลีกเลี่ยงข้อความแสดงข้อผิดพลาดใน 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) ใช้ ขอบคุณจิม!
Pascal Lindelauf

1
ทางออกที่ดี โปรดทราบว่าฟังก์ชั่นส่งคืนตัวอักษรตัวพิมพ์เล็กเช่น # ff5544 ไม่ใช่ # FF5544
ปีเตอร์

regex นี้จะสนับสนุนแชนเนล aplha ด้วยในโซลูชัน rgb = rgb.match (/ ^ rgba? ((\ d +), \ s * (\ d +), \ s * (\ d +) (?:, \ s * (0 \ \ + d.))) $ /);
Henning Winter

ทำงานอย่างมีเสน่ห์
ucMedia

22

อัปเดต @ErickPetru เพื่อความเข้ากันได้ของ rgba:

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

ฉันอัพเดต regex ให้ตรงกับค่า alpha ถ้ากำหนดไว้ แต่ไม่ได้ใช้


เพื่อความสมบูรณ์: ฉันกำลังทำงานกับสิ่งที่จะส่งออกไปยัง PowerPoint (ไม่ต้องถาม ... ) และมันก็ยอมรับไบต์ที่สี่บนสตริงเลขฐานสิบหกสำหรับช่องอัลฟาดังนั้นเราจึงสามารถใช้ประโยชน์ได้ดังนี้: 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ตัวอย่างหรือทิ้งไว้โดยไม่มีคำนำหน้า) หวังว่ามันจะช่วยให้ใครบางคน!
ÓscarGómezAlcañiz

10

นี่คือซับใน ES6 หนึ่งที่ไม่ใช้ jQuery:

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 ซึ่งตัดออกแบ็กสแลช regex ในคำตอบก่อนหน้า
เจสัน

5

นี่คือรุ่นที่ตรวจสอบความโปร่งใสฉันต้องการสิ่งนี้เนื่องจากวัตถุของฉันคือการแทรกผลลัพธ์ลงในแอตทริบิวต์ของสไตล์โดยที่รุ่นโปร่งใสของสี hex เป็นคำที่ "โปร่งใส"

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

ฟังก์ชันที่ส่งคืนสีพื้นหลังขององค์ประกอบในรูปหกเหลี่ยม

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)

ฉันได้สร้างฟังก์ชันที่ใช้ฟังก์ชั่นพื้นฐานที่อ่านได้และไม่มี reg-exps
ฟังก์ชั่นยอมรับสีในรูปแบบhex, rgb หรือ rgba CSS และส่งกลับค่าการแสดงฐานสิบหก
แก้ไข:มีข้อผิดพลาดในการแยกวิเคราะห์รูปแบบ 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 ซึ่งเป็นสีดำแทนที่จะเป็นแบบโปร่งใส
สิบสอง 24

หากค่าที่ 4 ใน rgba คือ 0 (ศูนย์) ดังนั้นสำหรับ css สำหรับ 'องค์ประกอบ' นั้นจะเป็น: องค์ประกอบ {color: # 000000, ความทึบ: 0.0;} ซึ่งมีความโปร่งใสหรือเพียงแค่ส่งคืน 'rgba (0,0 ตามเงื่อนไข) , 0,0) กลับไปที่ผู้โทร
สิบสอง 24

@ 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 ส่งคืนเลขฐานสิบหกเสมอ:

$.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

เพียงเพิ่มคำตอบของ @ Justin ด้านบน ..

มันควรจะเป็น

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 ตัวอาจเป็น ... เช่นสำหรับ rgb (216, 160, 10) จะสร้าง # d8a0a ในขณะที่ควรเป็น # d8a00a

ขอบคุณ


1

นี่เป็นวิธีแก้ปัญหาที่ฉันพบว่าไม่ทิ้งข้อผิดพลาดของสคริปต์ใน IE: http://haacked.com/archive/2009/12/29/convert-rgb-to-hex.aspx


ใน IE เวอร์ชันเก่าการดึงค่าสีของวัตถุที่ใช้ jquery บางครั้งสามารถคืนค่า hex แทน rgb ในขณะที่เบราว์เซอร์สมัยใหม่ส่วนใหญ่จะส่งคืน 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 นี่คือปลั๊กอิน JQuery ตามรหัสของ Daniel Elliott:

$.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
Eddie
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.