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 面向对象编程(1) 基础
May 18 Javascript
JQuery.Ajax之错误调试帮助信息介绍
Jul 04 Javascript
jquery 日期控件datepicker属性详细解析
Nov 08 Javascript
JS选取DOM元素的简单方法
Jul 08 Javascript
JS动态加载脚本并执行回调操作
Aug 24 Javascript
将html页面保存成图片,图片写入pdf的实现方法(推荐)
Sep 17 Javascript
JavaScript数组去重的几种方法效率测试
Oct 23 Javascript
JS实现图片预加载之无序预加载功能代码
May 12 Javascript
JS实现移动端触屏拖拽功能
Jul 31 Javascript
layui+jquery支持IE8的表格分页方法
Sep 28 jQuery
vue+elementUI(el-upload)图片压缩,默认同比例压缩操作
Aug 10 Javascript
JavaScript实现音乐导航效果
Nov 19 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
我常用的几个类
2006/10/09 PHP
android上传图片到PHP的过程详解
2015/08/03 PHP
必须收藏的php实用代码片段
2016/02/02 PHP
thinkphp在php7环境下提示Cannot use ‘String’ as class name as it is reserved的解决方法
2016/09/30 PHP
php 常用的系统函数
2017/02/07 PHP
Linux服务器下PHPMailer发送邮件失败的问题解决
2017/03/04 PHP
利用PHPStorm如何开发Laravel应用详解
2017/08/30 PHP
PHP PDOStatement::errorCode讲解
2019/01/31 PHP
浅析Cookie中的Path与domain
2013/12/18 Javascript
Javascript中引用示例介绍
2014/02/21 Javascript
Extjs根据条件设置表格某行背景色示例
2014/07/23 Javascript
Javascript基础教程之数据类型 (布尔型 Boolean)
2015/01/18 Javascript
javascript动态生成树形菜单的方法
2015/11/14 Javascript
React学习之事件绑定的几种方法对比
2017/09/24 Javascript
jquery中done和then的区别(详解)
2017/12/19 jQuery
JavaScript创建对象的常用方式总结
2018/08/10 Javascript
vue头部导航动态点击处理方法
2018/11/02 Javascript
Vue js 的生命周期(看了就懂)(推荐)
2019/03/29 Javascript
一文了解Vue中的nextTick
2019/05/06 Javascript
Node绑定全局TraceID的实现方法
2019/11/14 Javascript
vue实现导航菜单和编辑文本的示例代码
2020/07/04 Javascript
微信小程序选择图片控件
2021/01/19 Javascript
[45:40]Ti4 冒泡赛第二天NEWBEE vs NaVi 1
2014/07/15 DOTA
Python实现的将文件每一列写入列表功能示例【测试可用】
2018/03/19 Python
关于python写入文件自动换行的问题
2018/06/23 Python
Python3数字求和的实例
2019/02/19 Python
Python实现决策树并且使用Graphviz可视化的例子
2019/08/09 Python
python基于selenium爬取斗鱼弹幕
2021/02/20 Python
eBay英国购物网站:eBay.co.uk
2019/06/19 全球购物
幼儿园秋游活动方案
2014/01/21 职场文书
超越自我演讲稿
2014/05/21 职场文书
预备党员对照检查材料思想汇报
2014/09/24 职场文书
钱学森观后感
2015/06/04 职场文书
公务员岗前培训心得体会
2016/01/08 职场文书
Python移位密码、仿射变换解密实例代码
2021/06/27 Python
手把手教你使用TensorFlow2实现RNN
2021/07/15 Python