gogoend / blog

blogs, ideas, etc.
MIT License
9 stars 2 forks source link

颜色的表示:RGB vs HSL || 实现一个颜色选择器 #11

Open gogoend opened 4 years ago

gogoend commented 4 years ago

哇,我的网页变色了

在制作网页的过程中,我们总会用CSS来为网页中各个元素增加颜色,比如文字颜色,背景等等。

作为一只假装在做前端的设计师,笔者对各种颜色的调配自然是略有兴趣啦。在此来整理一下RGB与HSL这两种颜色模式分别是什么。

gogoend commented 4 years ago

颜色的表示方式

首先,在此我们需要一些工具:

image

HSL

HSL,即色相、饱和度、亮度。CSS字符串表示为 hsl( h , s%, l% )

// 下列PDF文件可使用Photoshop打开,以查看图层 HSL.pdf


由此可见,RGB与HSL都能够表示出五彩斑斓的颜色

RGB是根据R、G、B三个分量的亮度,来调配出最终颜色的; HSL是根据颜色的色相、饱和度、亮度这三个属性,来确定最终颜色的。

gogoend commented 4 years ago

颜色的转换

参考自: HSL和HSV色彩空间 - 维基百科,自由的百科全书 JS HEX十六进制与RGB, HSL颜色的相互转换 « 张鑫旭-鑫空间-鑫生活

HSL -> RGB

image 根据从Wikipedia上查到的资料,结合相关博客,尝试用JavaScript来实现:

function hsl2rgb(h, s, l) {
    let r, g, b;
    if (s === 0) r = g = b = l
    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
        }
        let q = l < 0.5 ? l * (1 + s) : l + s - (l * s)
        let p = 2 * l - q

        r = hue2rgb(p, q, h + 1 / 3)
        g = hue2rgb(p, q, h)
        b = hue2rgb(p, q, h - 1 / 3)

        return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)]
    }
}
gogoend commented 4 years ago

RGB -> HSL

image 根据从Wikipedia上查到的资料,尝试用JavaScript来实现:

function rgb2hsl(r, g, b) {
    r /= 255, g /= 255, b /= 255
    let max = Math.max(r, g, b);
    let min = Math.min(r, g, b);

    let h, s, l;
    if (max === min) {
        h = 0
    } else if (max === r && g >= b) {
        h = 60 * (g - b) / (max - min) + 0
    } else if (max === r && g < b) {
        h = 60 * (g - b) / (max - min) + 360
    } else if (max === g) {
        h = 60 * (b - r) / (max - min) + 120
    } else if (max === b) {
        h = 60 * (r - g) / (max - min) + 240
    }

    l = (max + min) / 2

    if (l === 0 || max === min) {
        s = 0
    } else if (l > 0 && l <= (1 / 2)) {
        s = (max - min) / (max + min)
    } else if (l > (1 / 2)) {
        s = (max - min) / (2 - (max + min))
    }

    return [h, s, l]
}
gogoend commented 4 years ago

实现一个 ColorPicker 组件