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 相关文章推荐
cookie.js 加载顺序问题怎么才有效
Jul 31 Javascript
js/html光标定位的实现代码
Sep 23 Javascript
jQuery 复合选择器应用的几个例子
Sep 11 Javascript
js面向对象之静态方法和静态属性实例分析
Jan 10 Javascript
javascript实现仿腾讯游戏选择
May 14 Javascript
详解JavaScript中setSeconds()方法的使用
Jun 11 Javascript
探析浏览器执行JavaScript脚本加载与代码执行顺序
Jan 12 Javascript
JS定时器用法分析【时钟与菜单中的应用】
Dec 21 Javascript
vue组件与复用详解
Apr 08 Javascript
JavaScript常用截取字符串的三种方式用法区别实例解析
May 15 Javascript
快速解决处理后台返回json数据格式的问题
Aug 07 Javascript
UEditor 自定义图片视频尺寸校验功能的实现代码
Oct 20 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
德生PL990,目前市面上唯一一款便携式插卡蓝牙全波段高性能收音机
2021/03/02 无线电
PHP 5昨天隆重推出--PHP 5/Zend Engine 2.0新特性
2006/10/09 PHP
文件上传的实现
2006/10/09 PHP
使用TinyButStrong模板引擎来做WEB开发
2007/03/16 PHP
PHP中PDO基础教程 入门级
2011/09/04 PHP
phpmyadmin config.inc.php配置示例
2013/08/27 PHP
thinkphp模板赋值与替换实例简述
2014/11/24 PHP
php比较相似字符串的方法
2015/06/05 PHP
PHP CURL或file_get_contents获取网页标题的代码及两者效率的稳定性问题
2015/11/30 PHP
PHP中Enum(枚举)用法实例详解
2015/12/07 PHP
Centos6.5和Centos7 php环境搭建方法
2016/05/27 PHP
PHP registerXPathNamespace()函数讲解
2019/02/03 PHP
(转载)JavaScript中匿名函数,函数直接量和闭包
2007/05/08 Javascript
一组JS创建和操作表格的函数集合
2009/05/07 Javascript
jquery 学习之二 属性(类)
2010/11/25 Javascript
jquery ajax 简单范例(界面+后台)
2013/11/19 Javascript
jQuery中trigger()与bind()用法分析
2015/12/18 Javascript
AngularJS中监视Scope变量以及外部调用Scope方法
2016/01/23 Javascript
Webpack中css-loader和less-loader的使用教程
2017/04/27 Javascript
详解基于Vue+Koa的pm2配置
2017/10/24 Javascript
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【凹多边形的分离轴检测算法】
2018/12/13 Javascript
深入理解js A*寻路算法原理与具体实现过程
2018/12/13 Javascript
Vue scrollBehavior 滚动行为实现后退页面显示在上次浏览的位置
2019/05/27 Javascript
vue2之简易的pc端短信验证码的问题及处理方法
2019/06/03 Javascript
Python 流程控制实例代码
2009/09/25 Python
python访问抓取网页常用命令总结
2017/04/11 Python
用python实现英文字母和相应序数转换的方法
2019/09/18 Python
Python pandas对excel的操作实现示例
2020/07/21 Python
UGG雪地靴德国官网:UGG德国
2016/11/19 全球购物
塔吉特百货公司官网:Target
2017/04/27 全球购物
标记环介质访问控制协议
2016/03/27 面试题
《月球之谜》教学反思
2014/04/10 职场文书
英语分层教学实施方案
2014/06/15 职场文书
少先队活动总结
2014/08/29 职场文书
《游戏王:大师决斗》将推出新卡牌包4月4日上线
2022/03/31 其他游戏
关于的python五子棋的算法
2022/05/02 Python