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 相关文章推荐
Mootools 1.2教程 Fx.Tween的使用
Sep 15 Javascript
href下载文件根据id取url并下载
May 28 Javascript
jQuery实现返回顶部功能适合不支持js的浏览器
Aug 19 Javascript
jQuery验证插件 Validate详解
Nov 20 Javascript
JavaScript动态插入CSS的方法
Dec 10 Javascript
jquery输入数字随机抽奖特效的简单实现代码
Jun 10 Javascript
vue.js树形组件之删除双击增加分支实例代码
Feb 28 Javascript
JavaScript与Java正则表达式写法的区别介绍
Aug 15 Javascript
Vue中computed与methods的区别详解
Mar 24 Javascript
jquery UI实现autocomplete在获取焦点时得到显示列表功能示例
Jun 04 jQuery
vue 实现 rem 布局或vw 布局的方法
Nov 13 Javascript
微信小程序实现滑动翻页效果(完整代码)
Dec 06 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获取表单数据与HTML嵌入PHP脚本的实现
2017/02/09 PHP
jquery 简单图片导航插件jquery.imgNav.js
2010/03/17 Javascript
通过正则表达式实现表单验证是否为中文
2014/02/18 Javascript
JavaScript中的值类型转换介绍
2014/12/31 Javascript
分析了一下JQuery中的extend方法实现原理
2015/02/27 Javascript
jQuery中animate动画第二次点击事件没反应
2015/05/07 Javascript
在JavaScript的AngularJS库中进行单元测试的方法
2015/06/23 Javascript
seajs学习之模块的依赖加载及模块API的导出
2016/10/20 Javascript
详解nodejs爬虫程序解决gbk等中文编码问题
2017/04/06 NodeJs
JavaScript实现旋转轮播图
2020/08/18 Javascript
详解Vue.js组件可复用性的混合(mixin)方式和自定义指令
2017/09/06 Javascript
JavaScript生成指定范围的时间列表
2018/03/19 Javascript
JS插件clipboard.js实现一键复制粘贴功能
2020/12/04 Javascript
javascript的this关键字详解
2019/05/20 Javascript
JS随机密码生成算法
2019/09/23 Javascript
jQuery实现推拉门效果
2020/10/19 jQuery
详解Python中列表和元祖的使用方法
2015/04/25 Python
怎么使用pipenv管理你的python项目
2018/03/12 Python
python自动重试第三方包retrying模块的方法
2018/04/24 Python
浅谈django rest jwt vue 跨域问题
2018/10/26 Python
python 内置模块详解
2019/01/01 Python
在Python中合并字典模块ChainMap的隐藏坑【推荐】
2019/06/27 Python
Django用户认证系统 Web请求中的认证解析
2019/08/02 Python
python打开使用的方法
2019/09/30 Python
在Django下创建项目以及设置settings.py教程
2019/12/03 Python
基于Python实现体育彩票选号器功能代码实例
2020/09/16 Python
移动通信行业实习自我鉴定
2013/09/28 职场文书
高中生活自我鉴定
2014/01/18 职场文书
公司管理建议书范文
2014/03/12 职场文书
幼儿园家长寄语
2014/04/02 职场文书
小学学校评估方案
2014/06/08 职场文书
义务教育学校标准化建设汇报材料
2014/08/16 职场文书
庆祝新中国成立65周年“向国旗敬礼”网上签名寄语
2014/09/27 职场文书
会议新闻稿
2015/07/17 职场文书
Go语言切片前或中间插入项与内置copy()函数详解
2021/04/27 Golang
SpringBoot中HttpSessionListener的简单使用方式
2022/03/17 Java/Android