花潮论坛

搜索
热搜: 活动 交友 discuz
查看: 19|回复: 6

生成可控范围16进制随机颜色

[复制链接]
  • TA的每日心情
    奋斗
    2026-3-11 12:25
  • 签到天数: 1756 天

    [LV.Master]伴坛终老

    3141

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

    发表于 2026-3-11 18:11 | 显示全部楼层 |阅读模式

    请马上登录,朋友们都在花潮里等着你哦:)

    您需要 登录 才可以下载或查看,没有账号?立即注册

    x

    JS 生成16进制随机颜色可以非常简单,就一句代码:

    const color = '#' + Math.random().toString(16).substring(2, 8);
    console.log(color); // → 类似结果:#33ed1f

    但当需要可控范围的16进制随机颜色,上述方法无能为力。要实现此功能——

    首先,需要理解16进制颜色的内部结构。本质上,16进制颜色由 R、G、B 即红、蓝、绿三种颜色按一定比例混合而成,每一种单色用16进制两位数表示,不足两位数的前面补零。完整的16进制颜色的表达方式如下:

    #a6cc9f

    其中:

    # 是用来表示16进制的前缀;

    a6 是 R(红)、cc 是 G(绿)、9f 是B(蓝)

    其次,需要了解单色分量取值范围,0~255,包含头尾数值。

    下面是实现方法:

    (一)设计一个取范围值函数,允许设定单色值范围:

    const getRdNumFromAr = (ar = [0,255]) => {
        ar.sort((a, b) => b > a);
        const n1 = Math.min(Math.max(ar[0], 0), 255), n2 = Math.min(Math.max(ar[1], 0), 255);
        return Math.round(Math.random() * (n2 - n1) + n1);
    };
    

    此函数预设了取值范围为 [0,255],没有传参时使用它。函数内部,先排序传参数组,以确保小数在前、大数在后;接着处理数组里面两个数值元素,用 Math.min 和 Math.max 方法确保数值不越界(0~255);最后,用 Math.random() 和 Math.round 方法取得最两个数值之间的随机数、四舍五入,并返回结果给调用者。

    (二)设计一个创建16进制颜色的函数,允许配置 RGB 范围:

    const rdHexColor = (option) => {
        if (!option) option = { r: [0,255], g: [0,255], b: [0,255] };
        const r = getRdNumFromAr(option.r).toString(16).padStart(2, '0');
        const g = getRdNumFromAr(option.g).toString(16).padStart(2, '0');
        const b = getRdNumFromAr(option.b).toString(16).padStart(2, '0');
        return `#${r}${g}${b}`;
    };
    

    函数首先检测是否有传参,如果没有,创建 RGB 缺省配置;接着分别处理三种单色值,以红色 r 为例加以说明:调用 getRdNumFromAr() 函数处理配置值 r(getRdNumFromAr(option.r)),将其变为16进制(toString(16) 方法),得到的结果如果不足两位的前面补零(patStart() 方法);最后拼凑字串并返回结果。

    完整的示例代码:

    <style>
        #myDiv { margin: auto; margin-top: 40px; width: 400px; height: 240px; border: 1px solid gray; position: relative; }
        #myDiv::before { position: absolute; content: attr(data-c); top: -40px; }
    </style>
    
    <div id="myDiv" data-c="点击下方矩形生成随机颜色"></div>
    
    <script>
        const rdHexColor = (option) => {
            if (!option) option = { r: [0,255], g: [0,255], b: [0,255] };
            const r = getRdNumFromAr(option.r).toString(16).padStart(2, '0');
            const g = getRdNumFromAr(option.g).toString(16).padStart(2, '0');
            const b = getRdNumFromAr(option.b).toString(16).padStart(2, '0');
            return `#${r}${g}${b}`;
        };
        
        const getRdNumFromAr = (ar = [0,255]) => {
            ar.sort((a, b) => b > a);
            const n1 = Math.min(Math.max(ar[0], 0), 255), n2 = Math.min(Math.max(ar[1], 0), 255);
            return Math.round(Math.random() * (n2 - n1) + n1);
        };
    
        const setting = {
            r: [0,0],
            g: [30,200],
            b: [30,200]
        };
    
        myDiv.onclick = () => myDiv.style.background = myDiv.dataset.c = rdHexColor(setting);
    </script>
    

    效果如下:

    修改红蓝绿单色分量配置即 setting 对象,就可以拿到预期的颜色范围。

    评分

    参与人数 2威望 +80 金钱 +160 经验 +80 收起 理由
    红影 + 50 + 100 + 50 匠心独运,细节精致入微!
    杨帆 + 30 + 60 + 30 匠心独运,细节精致入微!

    查看全部评分

  • TA的每日心情
    奋斗
    2026-3-11 12:02
  • 签到天数: 473 天

    [LV.9]以坛为家II

    351

    主题

    3565

    回帖

    2万

    积分

    版主

    Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生鹰傲苍穹飞龙在天王者至尊大将风范花潮版主

    发表于 2026-3-11 18:49 | 显示全部楼层
    很实用的知识,谢谢马老师经典讲授
    ★青春是一个人的精神生命,奋斗是一个人最大的体面,学习是一个人最美的姿态。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2026-3-11 12:25
  • 签到天数: 1756 天

    [LV.Master]伴坛终老

    3141

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2026-3-11 19:52 | 显示全部楼层
    杨帆 发表于 2026-3-11 18:49
    很实用的知识,谢谢马老师经典讲授

    这个应用场景还是很广的
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2026-3-11 12:02
  • 签到天数: 473 天

    [LV.9]以坛为家II

    351

    主题

    3565

    回帖

    2万

    积分

    版主

    Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生鹰傲苍穹飞龙在天王者至尊大将风范花潮版主

    发表于 2026-3-11 20:03 | 显示全部楼层
    马黑黑 发表于 2026-3-11 19:52
    这个应用场景还是很广的

    是啊,五彩缤纷的世界心之所向,只是运用自如并不容易呢
    ★青春是一个人的精神生命,奋斗是一个人最大的体面,学习是一个人最美的姿态。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2026-3-11 12:25
  • 签到天数: 1756 天

    [LV.Master]伴坛终老

    3141

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2026-3-11 20:29 | 显示全部楼层
    杨帆 发表于 2026-3-11 20:03
    是啊,五彩缤纷的世界心之所向,只是运用自如并不容易呢

    投入就有收获
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2026-3-11 12:02
  • 签到天数: 473 天

    [LV.9]以坛为家II

    351

    主题

    3565

    回帖

    2万

    积分

    版主

    Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生鹰傲苍穹飞龙在天王者至尊大将风范花潮版主

    发表于 2026-3-11 22:50 | 显示全部楼层

    至理名言,投入与收获在一起,感恩老师的讲授与指导
    ★青春是一个人的精神生命,奋斗是一个人最大的体面,学习是一个人最美的姿态。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-1 20:32
  • 签到天数: 1052 天

    [LV.10]以坛为家III

    1895

    主题

    32万

    回帖

    38万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮美女虎龙狗猪多彩人生星月交辉海样胸怀火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀相遇之美一往情深花好月圆心香一瓣紫色情节飞龙在天金剪刀天籁妙音妙笔生花风雨同行我心永远天长地久幸福快乐绚丽缤纷喜乐安康中秋征文周年庆指尖上的流年舞会之星分析(喊冤)章总结章杀人王小强章最佳杀刺临屏写诗七夕诗钟活动第五届风云第六届风云情人节花潮管理

    发表于 2026-3-11 23:34 | 显示全部楼层
    这个例子是拿掉了红色,绿色蓝色也被设定在一定的范围里,即使这样,颜色其实仍然还是很多呢
     
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    小黑屋|手机版|Archiver|服务支持:DZ动力|huachaowang.com Inc. ( 蜀ICP备17032287号-1 )

    GMT+8, 2026-3-12 04:07 , Processed in 0.061323 second(s), 26 queries .

    Powered by Discuz! X3.4

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表