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

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

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 :

ExpandedBlockStart.gif 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];

}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值