根据用户选的背景色,自动匹配一个前景色

最近又写代码啦,感觉挺好。

ok,一个页面,说要玩自定义,懒得让美工一套一套模版设计了,直接让用户自己调颜色了。搜了下,发现jquery miniColors效果不错。然后又想让用户选好背景再选前景比较烦,可能配出来又比较丑,那就自动根据用户选的背景色匹配一个同色系前景色吧。

如果直接rgb来算,比较麻烦,但是颜色有另一种表示方法:HSL,最三个参数L是亮度,如果用户选的是个暗色,那把L调高就可以得到一个可以反衫的亮色,如果用户选的是个亮色,那把L调低就可以得到一个暗色来对比。基于这个思路,找一个HSL<->RGB的算法很容易,比如 http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript

然后一小段代码就可以 :

function getContrastColor(rgb) {
    var hsl = rgbToHsl(rgb.r, rgb.g, rgb.b);
    hsl[2] = (hsl[2] + 0.5) % 1.0;
    var new_rgb = hslToRgb.apply(this, hsl);
    return ['rgb(',parseInt(new_rgb[0]),',',parseInt(new_rgb[1]),',',parseInt(new_rgb[2]),')'].join('');
}

//

完整示例如下:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
    <link rel="stylesheet" type="text/css" href="http://labs.abeautifulsite.net/jquery-miniColors/jquery.miniColors.css"></link>
    <style type="text/css">
        #stage 
{
            margin-left
:300px;
            width
:200px;
            height
:100px;
            font-size
:32px;
        
}
        
    
</style>
    <script src="Scripts/jquery-1.8.2.js"></script>
    <script src="http://labs.abeautifulsite.net/jquery-miniColors/jquery.miniColors.js"></script>
    <script src="Scripts/HSL2RGB.js"></script>
    <script type="text/javascript">
        function getContrastColor(rgb) {
            var hsl = rgbToHsl(rgb.r, rgb.g, rgb.b);
            hsl[2] = (hsl[2] + 0.5) % 1.0;
            var new_rgb = hslToRgb.apply(this, hsl);
            return ['rgb(',parseInt(new_rgb[0]),',',parseInt(new_rgb[1]),',',parseInt(new_rgb[2]),')'].join('');
        }

        function colorHandler(hex, rgb) {
            $('#stage').css({ 'color': hex, 'backgroundColor': getContrastColor(rgb) });
        }

        $(function () {
            $('.color-picker').miniColors({
                change: colorHandler,
                open: colorHandler,
                close: colorHandler
            });
        });
    </script>

</head>
<body>
    <input type="text" name="color1" class="color-picker" size="7" autocomplete="on" value="#fff" />
    <div id="stage">
        welcome!
    </div>
</body>
</html>

HSL2RGB.js :

View Code 
/**

 * Converts an RGB color value to HSL. Conversion formula

 * adapted from http://en.wikipedia.org/wiki/HSL_color_space.

 * Assumes r, g, and b are contained in the set [0, 255] and

 * returns h, s, and l in the set [0, 1].

 *

 * @param   Number  r       The red color value

 * @param   Number  g       The green color value

 * @param   Number  b       The blue color value

 * @return  Array           The HSL representation

 
*/

function rgbToHsl(r, g, b) {

    r /= 255, g /= 255, b /= 255;

    var max = Math.max(r, g, b), min = Math.min(r, g, b);

    var h, s, l = (max + min) / 2;



    if (max == min) {

        h = s = 0; // achromatic

    } else {

        var d = max - min;

        s = l > 0.5 ? d / (2 - max - min) : d / (max + min);

        switch (max) {

            case r: h = (g - b) / d + (g < b ? 6 : 0); break;

            case g: h = (b - r) / d + 2; break;

            case b: h = (r - g) / d + 4; break;

        }

        h /= 6;

    }



    return [h, s, l];

}



/**

 * Converts an HSL color value to RGB. Conversion formula

 * adapted from http://en.wikipedia.org/wiki/HSL_color_space.

 * Assumes h, s, and l are contained in the set [0, 1] and

 * returns r, g, and b in the set [0, 255].

 *

 * @param   Number  h       The hue

 * @param   Number  s       The saturation

 * @param   Number  l       The lightness

 * @return  Array           The RGB representation

 
*/

function hslToRgb(h, s, l) {

    var r, g, b;



    if (s == 0) {

        r = g = b = l; // achromatic

    } else {

        function hue2rgb(p, q, t) {

            if (t < 0) t += 1;

            if (t > 1) t -= 1;

            if (t < 1 / 6) return p + (q - p) * 6 * t;

            if (t < 1 / 2) return q;

            if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;

            return p;

        }



        var q = l < 0.5 ? l * (1 + s) : l + s - l * s;

        var p = 2 * l - q;

        r = hue2rgb(p, q, h + 1 / 3);

        g = hue2rgb(p, q, h);

        b = hue2rgb(p, q, h - 1 / 3);

    }



    return [r * 255, g * 255, b * 255];

}



/**

 * Converts an RGB color value to HSV. Conversion formula

 * adapted from http://en.wikipedia.org/wiki/HSV_color_space.

 * Assumes r, g, and b are contained in the set [0, 255] and

 * returns h, s, and v in the set [0, 1].

 *

 * @param   Number  r       The red color value

 * @param   Number  g       The green color value

 * @param   Number  b       The blue color value

 * @return  Array           The HSV representation

 
*/

function rgbToHsv(r, g, b) {

    r = r / 255, g = g / 255, b = b / 255;

    var max = Math.max(r, g, b), min = Math.min(r, g, b);

    var h, s, v = max;



    var d = max - min;

    s = max == 0 ? 0 : d / max;



    if (max == min) {

        h = 0; // achromatic

    } else {

        switch (max) {

            case r: h = (g - b) / d + (g < b ? 6 : 0); break;

            case g: h = (b - r) / d + 2; break;

            case b: h = (r - g) / d + 4; break;

        }

        h /= 6;

    }



    return [h, s, v];

}



/**

 * Converts an HSV color value to RGB. Conversion formula

 * adapted from http://en.wikipedia.org/wiki/HSV_color_space.

 * Assumes h, s, and v are contained in the set [0, 1] and

 * returns r, g, and b in the set [0, 255].

 *

 * @param   Number  h       The hue

 * @param   Number  s       The saturation

 * @param   Number  v       The value

 * @return  Array           The RGB representation

 
*/

function hsvToRgb(h, s, v) {

    var r, g, b;



    var i = Math.floor(h * 6);

    var f = h * 6 - i;

    var p = v * (1 - s);

    var q = v * (1 - f * s);

    var t = v * (1 - (1 - f) * s);



    switch (i % 6) {

        case 0: r = v, g = t, b = p; break;

        case 1: r = q, g = v, b = p; break;

        case 2: r = p, g = v, b = t; break;

        case 3: r = p, g = q, b = v; break;

        case 4: r = t, g = p, b = v; break;

        case 5: r = v, g = p, b = q; break;

    }



    return [r * 255, g * 255, b * 255];

}
posted @ 2012-10-09 00:12 Think 阅读(...) 评论(...) 编辑 收藏