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 相关文章推荐
jQuery多级弹出菜单插件ZoneMenu
Dec 18 Javascript
JavaScript中的类(Class)详细介绍
Dec 30 Javascript
JS实现控制表格单元格垂直对齐的方法
Mar 30 Javascript
javascript入门教程基础篇
Nov 16 Javascript
JavaScript通过代码调用Flash显示的方法
Feb 02 Javascript
Bootstrap modal使用及点击外部不消失的解决方法
Dec 13 Javascript
three.js快速入门【推荐】
Jan 21 Javascript
原生JS实现隐藏显示图片 JS实现点击切换图片效果
Jan 27 Javascript
微信小程序getPhoneNumber获取用户手机号
Sep 29 Javascript
JS扩展String.prototype.format字符串拼接的功能
Mar 09 Javascript
从零开始搭建vue移动端项目到上线的步骤
Oct 15 Javascript
vue实现多组关键词对应高亮显示功能
Jul 25 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中使用array_filter()函数过滤数组实例讲解
2021/03/03 PHP
jquery的冒泡事件的阻止与允许(三种实现方法)
2013/02/01 Javascript
javascript创建数组之联合数组的使用方法示例
2013/12/26 Javascript
一个网页标题title的闪动提示效果实现思路
2014/03/22 Javascript
jQuery 取值、赋值的基本方法整理
2014/03/31 Javascript
jQuery模拟点击A标记示例参考
2014/04/17 Javascript
纯JavaScript实现获取onclick、onchange等事件的值
2014/12/29 Javascript
Angularjs实现mvvm式的选项卡示例代码
2016/09/08 Javascript
微信小程序 时间格式化(util.formatTime(new Date))详解
2016/11/16 Javascript
javascript事件捕获机制【深入分析IE和DOM中的事件模型】
2016/12/15 Javascript
js实现滑动到页面底部自动加载更多功能
2017/02/15 Javascript
angular.js指令中的controller、compile与link函数的不同之处
2017/05/10 Javascript
通过命令行生成vue项目框架的方法
2017/07/12 Javascript
webpack 模块热替换原理
2018/04/09 Javascript
layui点击导航栏刷新tab页的示例代码
2018/08/14 Javascript
微信小程序之swiper滑动面板用法示例
2018/12/04 Javascript
微信小程序结合Storage实现搜索历史效果
2019/05/18 Javascript
vue.js实现二级菜单效果
2019/10/19 Javascript
[04:02]2014DOTA2国际邀请赛 BBC每日综述中国战队将再度登顶
2014/07/21 DOTA
python代码 if not x: 和 if x is not None: 和 if not x is None:使用介绍
2016/09/21 Python
一个基于flask的web应用诞生 组织结构调整(7)
2017/04/11 Python
对python过滤器和lambda函数的用法详解
2019/01/21 Python
把django中admin后台界面的英文修改为中文显示的方法
2019/07/26 Python
解决Pytorch 加载训练好的模型 遇到的error问题
2020/01/10 Python
python实现批量命名照片
2020/06/18 Python
Python3.7安装PyQt5 运行配置Pycharm的详细教程
2020/10/15 Python
vue.js刷新当前页面的实例讲解
2020/12/29 Python
详解HTML5如何使用可选样式表为网站或应用添加黑暗模式
2020/04/07 HTML / CSS
澳大利亚女性快速时尚零售商:Ally Fashion
2018/04/25 全球购物
linux面试题参考答案(9)
2016/01/29 面试题
飞利信loadrunner和软件测试笔试题
2012/09/22 面试题
30年同学聚会邀请函
2014/01/25 职场文书
民族精神月活动总结
2014/08/28 职场文书
反邪教观后感
2015/06/11 职场文书
《圆明园的毁灭》教学反思
2016/02/16 职场文书
Java8中接口的新特性使用指南
2021/11/01 Java/Android