惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 三生石上(FineUI控件)
博客园 - Franky
GbyAI
GbyAI
B
Blog
WordPress大学
WordPress大学
D
Docker
小众软件
小众软件
月光博客
月光博客
博客园 - 【当耐特】
T
The Blog of Author Tim Ferriss
IT之家
IT之家
腾讯CDC
Engineering at Meta
Engineering at Meta
Vercel News
Vercel News
H
Help Net Security
M
MIT News - Artificial intelligence
L
LangChain Blog
云风的 BLOG
云风的 BLOG
S
SegmentFault 最新的问题
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
美团技术团队
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
V
V2EX
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻

博客园 - Think

[开源]jquery.ellipsis根据宽度(不是字数)进行内容截断,支持多行内容 jquery代码链实现延时执行代码【补:几点注意】 jquery代码链实现延时执行代码的较优雅办法 C++11智能指针处理Array对象 低端用户反文化----这个问题真这么简单? 放暑假了 jQuery 1.7.2 animate功能跨浏览器Bug修补 AsyncEnumerator对EAP的支持 大数据块(BLOBs)与流(Stream)操作性能规范 SQL Antipatterns内容介绍 Chromium Embedded Framework中文文档 (使用C API) Chromium Embedded Framework中文文档 (如何链接不同的运行时) Chromium Embedded Framework中文文档 (SVN属性) Chromium Embedded Framework中文文档 (升级到最新的Chrome) Chromium Embedded Framework中文文档之(基本使用) Chromium Embedded Framework 中文文档(简介) 操盘之王 摘要 市场营销经典《引爆点》简摘 强制iphone界面马上旋转
根据用户选的背景色,自动匹配一个前景色
Think · 2012-10-09 · via 博客园 - Think

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

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

}