JS实现随机颜色的3种方法与颜色格式的转化


Posted in Javascript onJanuary 05, 2017

前言

相信大家都知道在前端的颜色表示方式有多种,一种是以3个或6个十六进制的数子表示,一种是RGB的数字形式,还有一种是直接以颜色的英文来表示。这三种都是不支持透明色的。所以还有RGBA的表式方式,在RGB的的基础上加入了Alpha透明,使网页可以展现更加复杂绚丽的效果。

随机颜色

在平时的码农日常中,经常会用到求随机颜色的地方,下面是我总结的几种简单的实现随机颜色的方式:

十六进制格式(#000000-#FFFFFF)

第一种是比较简单的方法,这种方法是先随机生成ffffff以内16进制数,然后判断位数,少于6位的用while循环在前面加0,凑够6位。

function randomHexColor() { //随机生成十六进制颜色
 var hex = Math.floor(Math.random() * 16777216).toString(16); //生成ffffff以内16进制数
 while (hex.length < 6) { //while循环判断hex位数,少于6位前面加0凑够6位
  hex = '0' + hex;
 }
 return '#' + hex; //返回‘#'开头16进制颜色
}

还有一种比较方便但是比较难懂的方法,需要用到位运算。

function randomHexColor() { //随机生成十六进制颜色
 return '#' + ('00000' + (Math.random() * 0x1000000 << 0).toString(16)).substr(-6);
}

按执行顺序可以分为以下六步:

  1. 先执行Math.random() * 0x1000000,其中0x1000000=0xffffff+1,因为Math.random()取不到1,所以+1,这样就会生成一个1-16777216(不包含)以内的浮点数。
  2. 然后执行<<0,这是取整运算,去掉后面的小数点。这时为一个16777216(不包含)以内的十进制数。
  3. 之后执行.toString(16) ,把十进制数转化为六位以下16进制数。
  4. 再后执行'00000'+,这时因为之前生成的16进制数最少可能仅一位,在前面加上5个0。
  5. 最后执行.substr(-6) ,是去从-6开始的后面所有字符串,也就是最后6位数。
  6. 前面加上#并retuen。

RGB格式

function randomRgbColor() { //随机生成RGB颜色
 var r = Math.floor(Math.random() * 256); //随机生成256以内r值
 var g = Math.floor(Math.random() * 256); //随机生成256以内g值
 var b = Math.floor(Math.random() * 256); //随机生成256以内b值
 return `rgb(${r},${g},${b})`; //返回rgb(r,g,b)格式颜色
}

RGBA格式

function randomRgbaColor() { //随机生成RGBA颜色
 var r = Math.floor(Math.random() * 256); //随机生成256以内r值
 var g = Math.floor(Math.random() * 256); //随机生成256以内g值
 var b = Math.floor(Math.random() * 256); //随机生成256以内b值
 var alpha = Math.random(); //随机生成1以内a值
 return `rgb(${r},${g},${b},${alpha})`; //返回rgba(r,g,b,a)格式颜色
}

颜色格式转化

在编码过程中,经常会遇到要将颜色格式相互转化的问题,其中十六进制格式和RGB格式是可以相互转化的,但是RGBA格式由于多了前两者没有的Alpha透明属性,所以和前两者转化会丢失Alpha值,不建议进行转化,下面是我的颜色转化的方法:

十六进制转为RGB

function hex2Rgb(hex) { //十六进制转为RGB
 var rgb = []; // 定义rgb数组
 if (/^\#[0-9A-F]{3}$/i.test(hex)) { //判断传入是否为#三位十六进制数
  let sixHex = '#';
  hex.replace(/[0-9A-F]/ig, function(kw) {
   sixHex += kw + kw; //把三位16进制数转化为六位
  });
  hex = sixHex; //保存回hex
 }
 if (/^#[0-9A-F]{6}$/i.test(hex)) { //判断传入是否为#六位十六进制数
  hex.replace(/[0-9A-F]{2}/ig, function(kw) {
   rgb.push(eval('0x' + kw)); //十六进制转化为十进制并存如数组
  });
  return `rgb(${rgb.join(',')})`; //输出RGB格式颜色
 } else {
  console.log(`Input ${hex} is wrong!`);
  return 'rgb(0,0,0)';
 }
}

RGB转为十六进制

function rgb2Hex(rgb) {
 if (/^rgb\((\d{1,3}\,){2}\d{1,3}\)$/i.test(rgb)) { //test RGB
  var hex = '#'; //定义十六进制颜色变量
  rgb.replace(/\d{1,3}/g, function(kw) { //提取rgb数字
   kw = parseInt(kw).toString(16); //转为十六进制
   kw = kw.length < 2 ? 0 + kw : kw; //判断位数,保证两位
   hex += kw; //拼接
  });
  return hex; //返回十六进制
 } else {
  console.log(`Input ${rgb} is wrong!`);
  return '#000'; //输入格式错误,返回#000
 }
}

总结

以上就是这篇文文章的全部内容了,也是我在平时遇到的关于颜色处理方面的问题,大家有遇到什么奇怪的问题和更好的解决方法可以交流沟通一下。希望本文的内容对大家的学习或者工作能带来一定的帮助。

Javascript 相关文章推荐
WEB页子窗口(showModalDialog和showModelessDialog)使用说明
Oct 25 Javascript
javascript scrollTop正解使用方法
Nov 14 Javascript
JS中怎样判断undefined(比较不错的方法)
Mar 27 Javascript
jquery的clone方法应用于textarea和select的bug修复
Jun 26 Javascript
使用delegate方法为一个tr标签加一个链接
Jun 27 Javascript
jquery+正则实现统一的表单验证
Sep 20 Javascript
JS 终止执行的实现方法
Nov 24 Javascript
记录一次完整的react hooks实践
Mar 11 Javascript
vue下的@change事件的实现
Oct 25 Javascript
uni-app 组件里面获取元素宽高的实现
Dec 27 Javascript
vue elementui 实现搜索栏公共组件封装的实例代码
Jan 20 Javascript
JavaScript实现刮刮乐效果
Nov 01 Javascript
jQuery选择器实例应用
Jan 05 #Javascript
使用smartupload组件实现jsp+jdbc上传下载文件实例解析
Jan 05 #Javascript
javascript解析ajax返回的xml和json格式数据实例详解
Jan 05 #Javascript
Node.js中文件操作模块File System的详细介绍
Jan 05 #Javascript
Extjs让combobox写起来简洁又漂亮
Jan 05 #Javascript
JS实现给对象动态添加属性的方法
Jan 05 #Javascript
bootstrap datetimepicker实现秒钟选择下拉框
Jan 05 #Javascript
You might like
yii框架中的Url生产问题小结
2012/01/16 PHP
PHP APC的安装与使用详解
2013/06/13 PHP
有关PHP性能优化的介绍
2013/06/20 PHP
php中$_POST与php://input的区别实例分析
2015/01/07 PHP
php 删除指定文件夹的实例讲解
2017/07/25 PHP
php常用字符串查找函数strstr()与strpos()实例分析
2019/06/21 PHP
jQuery版仿Path菜单效果
2011/12/15 Javascript
javascript包装对象实例分析
2015/03/27 Javascript
jquery ajax分页插件的简单实现
2016/01/27 Javascript
Bootstrap中CSS的使用方法
2016/02/17 Javascript
浅谈Javascript中的12种DOM节点类型
2016/08/19 Javascript
微信小程序 详解下拉加载与上拉刷新实现方法
2017/01/13 Javascript
基于JS实现bookstore静态页面的实例代码
2017/02/22 Javascript
javascript字体颜色控件的开发 JS实现字体控制
2017/11/27 Javascript
vue-router配合ElementUI实现导航的实例
2018/02/11 Javascript
jQuery中图片展示插件highslide.js的简单dom
2018/04/22 jQuery
js如何获取访问IP、地区、当前操作浏览器
2019/07/23 Javascript
layui使用button按钮 点击出现弹层 弹层中加载表单的实例
2019/09/04 Javascript
浅谈vue 锚点指令v-anchor的使用
2019/11/13 Javascript
Python ORM框架SQLAlchemy学习笔记之数据添加和事务回滚介绍
2014/06/10 Python
Pythont特殊语法filter,map,reduce,apply使用方法
2016/02/27 Python
Django REST Framework序列化外键获取外键的值方法
2019/07/26 Python
django商品分类及商品数据建模实例详解
2020/01/03 Python
Python统计学一数据的概括性度量详解
2020/03/03 Python
彻底解决pip下载pytorch慢的问题方法
2021/03/01 Python
美国电视购物:QVC
2017/02/06 全球购物
澳大利亚正品化妆品之家:Cosmetic Capital
2017/07/03 全球购物
高中三年学习生活的自我评价
2013/10/10 职场文书
公司投资建议书
2014/05/16 职场文书
老干部工作先进集体事迹材料
2014/05/21 职场文书
中考标语大全
2014/06/05 职场文书
Python基础学习之奇异的GUI对话框
2021/05/27 Python
php将xml转化对象的实例详解
2021/11/17 PHP
mysql的单列多值存储实例详解
2022/04/05 MySQL
Nginx 常用配置
2022/05/15 Servers
Spring Cloud OAuth2实现自定义token返回格式
2022/06/25 Java/Android