RGB颜色值与十六进制颜色码怎么相互转换?

简介: RGB颜色值与十六进制颜色码怎么相互转换?

问题

我们经常看到网上的在线工具里有RGB颜色值与十六进制颜色码转换工具,那么这个是怎么实现的呢?

5c6f16121e014fe99068ff16b5db86eb.png


实现

rgb(255, 255, 255) => "#" + "FF" + "FF" + "FF";
"#" + "FF" + "FF" + "FF" => rgb(255, 255, 255);

可以理解为 FF0000 + FF00 + FF,如果左移是基于十六进制计算的,则可以理解为FF << 4,FF << 2,FF。

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>RGB颜色值与十六进制颜色码转换</title>
        <style>
            input {
                width: 100px;
            }
            .hex-color,.rgb-color {
                width: 100px;
                height: 100px;
                border: 1px solid salmon;
            }
        </style>
    </head>
    <body>
        <h1>kaimo 测试</h1>
        <div>
            <h3>RGB颜色值转换成十六进制颜色码:</h3>
            <div>
                <input type="text" name="rgbNum" value="0" maxlength="3">
                <input type="text" name="rgbNum" value="0" maxlength="3">
                <input type="text" name="rgbNum" value="0" maxlength="3">
                <button onclick="hexAdecimalColorCode()">转换</button>
            </div>
            <div>
                <h4>
                    转换后的十六进制颜色码:<span class="hex-code"></span>
                </h4>
                <div class="hex-color"></div>
            </div>
        </div>
        <div>
            <h3>十六进制颜色码转换成RGB颜色值:</h3>
            <div>
                <input type="text" name="hexStr" value="#000000">
                <button onclick="rgbColorCode()">转换</button>
            </div>
            <div>
                <h4>
                    转换后的RGB颜色码:<span class="rgb-code"></span>
                </h4>
                <div class="rgb-color"></div>
            </div>
        </div>
        <script>
            function hexAdecimalColorCode() {
                let rgbNumDom = document.getElementsByName("rgbNum");
                let arr = [];
                for (let i = 0; i < 3; i++) {
                    let rn = rgbNumDom[i].value;
                    if (isNaN(parseInt(rn))) {
                        return alert("请输入数字");
                    } else if(parseInt(rn) > 255 || parseInt(rn) < 0) {
                        return alert("数字在0-255之间");
                    }
                    arr.push(rn);
                }
                if(arr.length !== 3) {
                    return alert("RGB颜色值不合法");
                }
                // 核心转换为16进制的操作
                let hexStr = (arr[0] << 16 | arr[1] << 8 | arr[2]).toString(16);
                // 补零
                if(hexStr.length < 6) {
                    hexStr = `0${new Array((6 - hexStr.length)).join("0")}${hexStr}`;
                    console.log("进入补零:", hexStr);
                }
                let hexCode = `#${hexStr}`;
                document.querySelector(".hex-code").innerHTML = hexCode;
                document.querySelector(".hex-color").style.backgroundColor = hexCode;
                return hexCode;
            }
            function rgbColorCode() {
                let hs = document.getElementsByName("hexStr")[0].value;
                if (hs.substr(0, 1) === "#"){
                    hs = hs.substring(1);
                    if (hs.length !== 3 && hs.length !== 6){
                        return alert("十六进制颜色码为三位或六位");
                    } else if (/[^0-9a-f]/i.test(hs)){
                        return alert("请输入正确的十六进制颜色码");
                    }
                } else {
                    return alert("十六进制颜色码不合法");
                }
                let hsArr = hs.toLowerCase().split("");
                console.log("hsArr--->", hsArr);
                let arr = [];
                if(hs.length === 3) {
                    // 十六进制转为十进制
                    arr = hsArr.map(el => parseInt((el + el), 16));
                    console.log("arr--->", arr);
                } else {
                    const [a, b, c, d, e, f] = hsArr;
                    arr = [a + b, c + d, e + f].map(el => parseInt(el, 16));
                    console.log("arr--6-->", arr);
                }
                let rgbCode = `rgb(${arr.join(",")})`;
                console.log(rgbCode);
                document.querySelector(".rgb-code").innerHTML = rgbCode;
                document.querySelector(".rgb-color").style.backgroundColor = rgbCode;
                return rgbCode;
            }
        </script>
    </body>
</html>


效果如下:

aedf6fed8df94e0ca0a2bae0a98e0d2b.png




目录
相关文章
如何解决vscode中文路径的问题
如何解决vscode中文路径的问题
1217 0
|
分布式计算 Serverless 调度
EMR Serverless Spark:结合实时计算 Flink 基于 Paimon 实现流批一体
本文演示了使用实时计算 Flink 版和 Serverless Spark 产品快速构建 Paimon 数据湖分析的流程,包括数据入湖 OSS、交互式查询,以及离线Compact。Serverless Spark完全兼容Paimon,通过内置的DLF的元数据实现了和其余云产品如实时计算Flink版的元数据互通,形成了完整的流批一体的解决方案。同时支持灵活的作业运行方式和参数配置,能够满足实时分析、生产调度等多项需求。
61078 107
|
JavaScript API 索引
js中的reduce()方法 讲解 和实现
`reduce()` 方法对数组元素依次应用一个回调函数,将结果累计并最终返回单一值。语法为 `reduce(callback(accumulator, currentValue, currentIndex, array), initialValue)`。参数包括累计器(初次为初始值或首元素)、当前元素值、索引及数组自身。此方法需返回值供下一轮迭代使用。常见应用场景包括计算数组总和与平均值、统计元素频率、过滤与转换数组内容及去除重复项等。例如,可通过 `reduce()` 快速计算 `[1, 2, 3, 4, 5]` 的总和或对对象属性值求和。此外,还可自定义实现 `reduce()` 方法
3483 1
|
API Python
【Python】已解决:urllib.error.HTTPError: HTTP Error 403: Forbidden
【Python】已解决:urllib.error.HTTPError: HTTP Error 403: Forbidden
3535 2
|
编译器 Linux C语言
Windows下编译并使用64位GMP
Windows下编译并使用64位GMP
549 0
|
TensorFlow 算法框架/工具 Python
最新版tensorflow安装教程,pip安装+手动安装
最新版tensorflow安装教程,pip安装+手动安装
5303 1
|
NoSQL 关系型数据库 MySQL
Redis入门到通关之Redis实现Session共享
Redis入门到通关之Redis实现Session共享
475 0
|
关系型数据库 MySQL 数据库
MySQL 字符串截取函数 SUBSTR() 详解
MySQL 字符串截取函数 SUBSTR() 详解
633 0
MySQL 字符串截取函数 SUBSTR() 详解
|
前端开发
关于css的zoom属性
zoom属性及应用场景
490 0
|
Java 容器 安全
ReentrantLock详解
本博客主要讲述ReentrantLock的实现原理,主要内容包括: AQS原理以及实现过程。 ReenetrantLock获取锁、释放锁流程,以及原理。 ReenetrantLock源码分析。
6345 1