js随机颜色代码的多种实现方式


Posted in Javascript onApril 23, 2013

JS随机颜色有很多地方要用到:比如大家看到很多标签连接都是五颜六色。那就需要到这个了。下面开始:      

方法思路总共有二。一是准备一组漂亮的候选颜色,二是随机生成颜色

实现1

var getRandomColor = function(){      return  '#' +    
    (function(color){    
    return (color +=  '0123456789abcdef'[Math.floor(Math.random()*16)])    
      && (color.length == 6) ?  color : arguments.callee(color);    
  })('');    
}

随机生成6个字符然后再串到一起,闭包调用自身与三元运算符让程序变得内敛,初心者应该好好学习这种写法。

实现2

var getRandomColor = function(){      return (function(m,s,c){    
    return (c ? arguments.callee(m,s,c-1) : '#') +    
      s[m.floor(m.random() * 16)]    
  })(Math,'0123456789abcdef',5)    
}

把Math对象,用于生成hex颜色值的字符串提取出来,并利用第三个参数来判断是否还继续调用自身。

实现3

以下为引用的内容:
Array.prototype.map = function(fn, thisObj) { 
  var scope = thisObj || window; 
  var a = []; 
  for ( var i=0, j=this.length; i < j; ++i ) { 
    a.push(fn.call(scope, this[i], i, this)); 
  } 
  return a; 
}; 
var getRandomColor = function(){ 
  return '#'+'0123456789abcdef'.split('').map(function(v,i,a){ 
    return i>5 ? null : a[Math.floor(Math.random()*16)] }).join(''); 
}

这个要求我们对数组做些扩展,map将返回一个数组,然后我们再用join把它的元素串成字符。

实现4

以下为引用的内容:
var getRandomColor = function(){ 
  return '#'+Math.floor(Math.random()*16777215).toString(16); 
}

这个实现非常逆天,虽然有点小bug。我们知道hex颜色值是从#000000到#ffffff,后面那六位数是16进制数,相当于“0x000000”到“0xffffff”。这实现的思路是将hex的最大值ffffff先转换为10进制,进行random后再转换回16进制。我们看一下,如何得到16777215 这个数值的。
以下为引用的内容:
<!doctype html>
<meta charset="utf-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=8"/>
<title>hex的最大值</title>
<script type="text/javascript" charset="utf-8">
  window.onload = function () {
     alert(parseInt("0xffffff",16).toString(10));
  };
</script>
<div id="text"></div>

实现5
以下为引用的内容:
var getRandomColor = function(){ 
  return '#'+(Math.random()*0xffffff<<0).toString(16); 
}

基本实现4的改进,利用左移运算符把0xffffff转化为整型。这样就不用记16777215了。由于左移运算符的优先级比不上乘号,因此随机后再左移,连Math.floor也不用了。

实现6

以下为引用的内容:
var getRandomColor = function(){ 
  return '#'+(function(h){ 
    return new Array(7-h.length).join("0")+h 
  })((Math.random()*0x1000000<<0).toString(16)) 
}

修正上面版本的bug(无法生成纯白色与hex位数不足问题)。0x1000000相当0xffffff+1,确保会抽选到0xffffff。在闭包里我们处理hex值不足5位的问题,直接在未位补零。

实现7

以下为引用的内容:
var getRandomColor = function(){ 
  return '#'+('00000'+(Math.random()*0x1000000<<0).toString(16)).substr(-6); 
}

这次在前面补零,连递归检测也省了。

实战一下:

以下为引用的内容:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="zh-cn">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>初级饼图</title>
    <script src="http://bloghighlighter.googlecode.com/files/raphael-min.js" type="text/javascript" ></script>
    <script type="text/javascript" charset="utf-8">
      var getRandomColor = function(){
        return '#'+('00000'+(Math.random()*0x1000000<<0).toString(16)).substr(-6);
      }
window.onload = function () {
        var paper = Raphael("canvas", 700, 700);
        paper.rect(0, 0, 640, 480,10).attr({fill: "#F2F1D7",stroke: "none"});//设置画板
function drawSector(cx,cy,r,paper,oc,startAngle){
          var angleplus = 360 * oc / 100,//360度乘以40%
          startAngle = startAngle || 0,
          endAngle =startAngle+angleplus,
          rad = Math.PI / 180,
          x1 = cx + r * Math.cos(-startAngle * rad),
          x2 = cx + r * Math.cos(-endAngle * rad),
          y1 = cy + r * Math.sin(-startAngle * rad),
          y2 = cy + r * Math.sin(-endAngle * rad);
          var path = ["M", cx, cy, "L", x1, y1, "A", r, r, 0, +(endAngle - startAngle > 180), 0, x2, y2, "z"],
          path = path.join(" ");
          paper.path({fill:getRandomColor()},path);
          return endAngle
        }
        var ocs = [40,25,17,10,8];
        for(var i=0,l=ocs.length,startAngle;i<l;i++){
          startAngle = drawSector(300,300,100,paper,ocs[i],startAngle);
        }
};
    </script>
    <style type="text/css" media="screen">
      #canvas {
        width: 700px;
        height: 700px;
      }
    </style>
    <title>初级2324234饼图</title>
  </head>
  <body>
    <p>初级23232饼图</p>
    <div id="canvas"></div>
  </body>
</html>
Javascript 相关文章推荐
javascript 写类方式之九
Jul 05 Javascript
E3 tree 1.6在Firefox下显示问题的修复方法
Jan 30 Javascript
不同Jquery版本引发的问题解决
Oct 14 Javascript
JS使用getComputedStyle()方法获取CSS属性值
Apr 23 Javascript
通过jquery 获取URL参数并进行转码
Aug 18 Javascript
详解JavaScript正则表达式中的global属性的使用
Jun 16 Javascript
javascript从定义到执行 你不知道的那些事
Jan 04 Javascript
理解js回收机制通俗易懂版
Feb 29 Javascript
javascript的列表切换【实现代码】
May 03 Javascript
JS基于正则表达式的替换操作(replace)用法示例
Apr 28 Javascript
javascript实现fetch请求返回的统一拦截
Dec 22 Javascript
详解vue-router的Import异步加载模块问题的解决方案
May 13 Javascript
js对象与打印对象分析比较
Apr 23 #Javascript
你必须知道的Javascript知识点之&quot;深入理解作用域链&quot;的介绍
Apr 23 #Javascript
你必须知道的Javascript知识点之&quot;字面量和对应类型&quot;说明介绍
Apr 23 #Javascript
你必须知道的Javascript知识点之&quot;单线程事件驱动&quot;的使用
Apr 23 #Javascript
你必须知道的Javascript知识点之&quot;this指针&quot;的应用
Apr 23 #Javascript
jquery清空textarea等输入框实现代码
Apr 22 #Javascript
js计算精度问题小结
Apr 22 #Javascript
You might like
在PHP中读取和写入WORD文档的代码
2008/04/09 PHP
PHP错误提示的关闭方法详解
2013/06/23 PHP
几个javascript操作word的参考代码
2009/10/26 Javascript
javascript学习笔记(二) js一些基本概念
2012/06/18 Javascript
JavaScript的arguments对象应用示例
2014/09/15 Javascript
jQuery+ajax中getJSON() 用法实例
2014/12/22 Javascript
Javascript对象Clone实例分析
2015/06/09 Javascript
jQuery zclip插件实现跨浏览器复制功能
2015/11/02 Javascript
jQuery实现的兼容性浮动层示例
2016/08/02 Javascript
详解使用vuex进行菜单管理
2017/12/21 Javascript
nodejs中Express与Koa2对比分析
2018/02/06 NodeJs
Vue.js上传图片到阿里云OSS存储的方法示例
2018/12/13 Javascript
vue项目中axios请求网络接口封装的示例代码
2018/12/18 Javascript
vue接入腾讯防水墙代码
2019/05/07 Javascript
js将URL网址转为16进制加密与解密函数
2020/03/04 Javascript
原生JS利用transform实现banner的无限滚动示例代码
2020/06/15 Javascript
vue递归获取父元素的元素实例
2020/08/07 Javascript
vue keep-alive实现多组件嵌套中个别组件存活不销毁的操作
2020/10/30 Javascript
Python实现将文本生成二维码的方法示例
2017/07/18 Python
python在线编译器的简单原理及简单实现代码
2018/02/02 Python
解决python super()调用多重继承函数的问题
2019/06/26 Python
利用Pandas和Numpy按时间戳将数据以Groupby方式分组
2019/07/22 Python
欧洲高端品牌直销店:Fashionesta
2016/08/31 全球购物
台湾前三大B2C购物网站:MOMO购物网
2017/04/27 全球购物
德国baby-markt婴儿用品瑞士网站:baby-markt.ch
2017/06/09 全球购物
Solaris操作系统的线程机制
2012/12/23 面试题
前台文员我鉴定
2014/01/12 职场文书
《春笋》教学反思
2014/04/15 职场文书
机关办公室岗位职责
2014/04/16 职场文书
2014年维修电工工作总结
2014/11/20 职场文书
2015年宣传工作总结
2015/04/08 职场文书
文明礼貌主题班会
2015/08/14 职场文书
pytorch 6 batch_train 批训练操作
2021/05/28 Python
关于python爬虫应用urllib库作用分析
2021/09/04 Python
Python几种酷炫的进度条的方式
2022/04/11 Python
Android中View.post和Handler.post的关系
2022/06/05 Java/Android