Automatically change text color to assure readability

前端 未结 8 2034
生来不讨喜
生来不讨喜 2020-12-08 00:42

Users can set the background-color of a button through a textbox that accept RGB hexadecimal notation: ff00ff, ccaa22, etc. So I need to set the te

8条回答
  •  一生所求
    2020-12-08 01:45

    You can invert the background color and use it as foreground color. The following algorithm produces results identical to the "Image > Adjustments > Invert" color command in Photoshop:

    function invertColor(hexTripletColor) {
        var color = hexTripletColor;
        color = color.substring(1);           // remove #
        color = parseInt(color, 16);          // convert to integer
        color = 0xFFFFFF ^ color;             // invert three bytes
        color = color.toString(16);           // convert to hex
        color = ("000000" + color).slice(-6); // pad with leading zeros
        color = "#" + color;                  // prepend #
        return color;
    }
    /*
     * Demonstration
     */
    function randomColor() {
        var color;
        color = Math.floor(Math.random() * 0x1000000); // integer between 0x0 and 0xFFFFFF
        color = color.toString(16);                    // convert to hex
        color = ("000000" + color).slice(-6);          // pad with leading zeros
        color = "#" + color;                           // prepend #
        return color;
    }
    $(function() {
        $(".demolist li").each(function() {
            var c1 = randomColor();
            var c2 = invertColor(c1);
            $(this).text(c1 + " " + c2).css({
                "color": c1,
                "background-color": c2
            });
        });
    });
    body { font: bold medium monospace; }
    .demolist { margin: 0; padding: 0; list-style-type: none; overflow: hidden; }
    .demolist li { float: left; width: 5em; height: 5em; text-align: center; }

    Note that this is not a bullet-proof solution. Colors that are close to 50% brightness and/or saturation will not produce sufficient contrast.

    Demo on jsFiddle

提交回复
热议问题