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 相关文章推荐
List Installed Hot Fixes
Jun 12 Javascript
JavaScript 页面坐标相关知识整理
Jan 09 Javascript
JS父页面与子页面相互传值方法
Mar 05 Javascript
JavaScript实现Java中StringBuffer的方法
Feb 09 Javascript
easyui-combobox 实现简单的自动补全功能示例
Nov 08 Javascript
js调用刷新界面的几种方式
May 03 Javascript
基于jquery日历价格、库存等设置插件
Jul 05 jQuery
解决vuejs项目里css引用背景图片不能显示的问题
Sep 13 Javascript
解决Vue使用swiper动态加载数据,动态轮播数据显示白屏的问题
Sep 27 Javascript
Vue.js+cube-ui(Scroll组件)实现类似头条效果的横向滚动导航条
Jun 24 Javascript
js 实现 list转换成tree的方法示例(数组到树)
Aug 18 Javascript
javascript开发实现贪吃蛇游戏
Jul 31 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
php和数据库结合的一个简单的web实例 代码分析 (php初学者)
2011/07/28 PHP
php实现utf-8和GB2312编码相互转换函数代码
2013/02/07 PHP
2014年最新推荐的10款 PHP 开发框架
2014/08/01 PHP
PHP加密解密字符串汇总
2015/04/26 PHP
超级简单的图片防盗(HTML),好用
2007/04/08 Javascript
按钮JS复制文本框和表格的代码
2011/04/01 Javascript
JS自定义对象实现Java中Map对象功能的方法
2015/01/20 Javascript
基于jquery实现在线选座订座之影院篇
2015/08/24 Javascript
js实现改进的仿蓝色论坛导航菜单效果代码
2015/09/06 Javascript
JS实现部分HTML固定页面顶部随屏滚动效果
2015/12/24 Javascript
JavaScript中0和&quot;&quot;比较引发的问题
2016/05/26 Javascript
基于Bootstrap 3 JQuery及RegExp的表单验证功能
2017/02/16 Javascript
微信小程序 下拉列表的实现实例代码
2017/03/08 Javascript
bootstrap select插件封装成Vue2.0组件
2017/04/17 Javascript
ES6深入理解之“let”能替代”var“吗?
2017/06/28 Javascript
Vue用v-for给src属性赋值的方法
2018/03/03 Javascript
以v-model与promise两种方式实现vue弹窗组件
2018/05/21 Javascript
使用apifm-wxapi模块中的问题及解决方法
2019/08/05 Javascript
微信小程序页面间传递数组对象方法解析
2019/11/06 Javascript
python使用正则搜索字符串或文件中的浮点数代码实例
2014/07/11 Python
Python实现获取某天是某个月中的第几周
2015/02/11 Python
对pandas replace函数的使用方法小结
2018/05/18 Python
Python3.6基于正则实现的计算器示例【无优化简单注释版】
2018/06/14 Python
详解Python 数据库的Connection、Cursor两大对象
2018/06/25 Python
Flask模拟实现CSRF攻击的方法
2018/07/24 Python
解决pycharm的Python console不能调试当前程序的问题
2019/01/20 Python
解决Djang2.0.1中的reverse导入失败的问题
2019/08/16 Python
基于pandas中expand的作用详解
2019/12/17 Python
Selenium 安装和简单使用的实现
2020/12/04 Python
中粮集团旗下食品网上购物网站:我买网
2016/09/22 全球购物
新西兰航空中国官网:Air New Zealand China
2018/07/24 全球购物
武汉某公司的C#笔试题面试题
2015/12/25 面试题
服装发布会策划方案
2014/05/22 职场文书
虚拟机linux端mysql数据库无法远程访问的解决办法
2021/05/26 MySQL
python中if和elif的区别介绍
2021/11/07 Python
vue-cli3.x配置全局的scss的时候报错问题及解决
2022/04/30 Vue.js