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 相关文章推荐
Node.js和PHP根据ip获取地理位置的方法
Mar 14 Javascript
jQuery移除元素自动解绑事件实现思路及代码
May 31 Javascript
AngularJS入门心得之directive和controller通信过程
Jan 25 Javascript
原生javascript实现的一个简单动画效果
Mar 30 Javascript
从零学习node.js之简易的网络爬虫(四)
Feb 22 Javascript
jQuery插件FusionCharts绘制的2D帕累托图效果示例【附demo源码】
Mar 28 jQuery
详解JSON Web Token 入门教程
Jul 30 Javascript
vue实现点击按钮下载文件功能
Oct 11 Javascript
Vue-cli4 配置 element-ui 按需引入操作
Sep 11 Javascript
详解Vue中Axios封装API接口的思路及方法
Oct 10 Javascript
Vue的生命周期一起来看看
Feb 24 Vue.js
js 实现Material UI点击涟漪效果示例
Sep 23 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
计数器详细设计
2006/10/09 PHP
用php+javascript实现二级级联菜单的制作
2008/05/06 PHP
php调用C代码的实现方法
2014/03/11 PHP
php使用include 和require引入文件的区别
2017/02/16 PHP
jquery简单体验
2007/01/10 Javascript
javascript引用对象的方法
2007/01/11 Javascript
理解Javascript_05_原型继承原理
2010/10/13 Javascript
JS实现商品倒计时实现代码
2013/05/03 Javascript
10分钟学会写Jquery插件实例教程
2014/09/06 Javascript
js实现感应鼠标图片透明度变化的方法
2015/02/20 Javascript
AngularJs定制样式插入到ueditor中的问题小结
2016/08/01 Javascript
[原创]JavaScript语法高亮插件highlight.js用法详解【附highlight.js本站下载】
2016/11/01 Javascript
学习vue.js中class与style绑定
2016/12/03 Javascript
微信小程序开发之视频播放器 Video 弹幕 弹幕颜色自定义实例
2016/12/08 Javascript
JavaScript触发onScroll事件的函数节流详解
2016/12/14 Javascript
vue实现移动端图片裁剪上传功能
2020/08/18 Javascript
vue.js整合vux中的上拉加载下拉刷新实例教程
2018/01/09 Javascript
webpack项目使用eslint建立代码规范实现
2019/05/16 Javascript
vue实现Input输入框模糊查询方法
2021/01/29 Javascript
Node.js操作MongoDB数据库实例分析
2020/01/19 Javascript
python实现给数组按片赋值的方法
2015/07/28 Python
Python制作简易注册登录系统
2016/12/15 Python
django-filter和普通查询的例子
2019/08/12 Python
导入tensorflow:ImportError: libcublas.so.9.0 报错
2020/01/06 Python
用python绘制樱花树
2020/10/09 Python
物业门卫岗位职责
2013/12/28 职场文书
婚礼新郎父母答谢词
2014/01/16 职场文书
业务员简历自我评价
2014/03/06 职场文书
2014年世界艾滋病日宣传活动总结
2014/11/18 职场文书
2014年保洁员工作总结
2014/11/19 职场文书
办公室岗位职责
2015/02/04 职场文书
高中教师个人工作总结
2015/02/10 职场文书
2015年政务公开工作总结
2015/05/19 职场文书
2015年四年级班主任工作总结
2015/10/22 职场文书
送给自己的励志语句:要安静的优秀,悄无声息的坚强
2019/11/26 职场文书
微软Win11 全新照片应用面向 Dev预览版推出 新版本上手体验图集
2022/09/23 数码科技