在制作餅圖或標(biāo)簽云時,我們通常需要很多顏色,方法有二。一是準(zhǔn)備一組漂亮的候選顏色,二是隨機生成顏色。在數(shù)量很多或不明確時,我想后者就是唯一的出路了。谷歌了一下,整理如下,按由淺入深的順序排列。
實現(xiàn)1
以下為引用的內(nèi)容:
2. return '#' +
3. ( function (color){
4. return (color += '0123456789abcdef' [Math.floor(Math.random()*16)])
5. && (color.length == 6) ? color : arguments.callee(color);
6. })( '' );
7. }
|
隨機生成6個字符然后再串到一起,閉包調(diào)用自身與三元運算符讓程序變得內(nèi)斂,初心者應(yīng)該好好學(xué)習(xí)這種寫法。
實現(xiàn)2
以下為引用的內(nèi)容:
2. return ( function (m,s,c){
3. return (c ? arguments.callee(m,s,c-1) : '#' ) +
4. s[m.floor(m.random() * 16)]
5. })(Math, '0123456789abcdef' ,5)
6. }
|
把Math對象,用于生成hex顏色值的字符串提取出來,并利用第三個參數(shù)來判斷是否還繼續(xù)調(diào)用自身。
實現(xiàn)3
以下為引用的內(nèi)容:
02. var scope = thisObj || window;
03. var a = [];
04. for ( var i=0, j= this .length; i < j; ++i ) {
05. a.push(fn.call(scope, this [i], i, this ));
06. }
07. return a;
08. };
09. var getRandomColor = function (){
10. return '#' + '0123456789abcdef' .split( '' ).map( function (v,i,a){
11. return i>5 ? null : a[Math.floor(Math.random()*16)] }).join( '' );
12. }
|
這個要求我們對數(shù)組做些擴展,map將返回一個數(shù)組,然后我們再用join把它的元素串成字符。
實現(xiàn)4
以下為引用的內(nèi)容:
2. return '#' +Math.floor(Math.random()*16777215).toString(16);
3. }
|
這個實現(xiàn)非常逆天,雖然有點小bug。我們知道hex顏色值是從#000000到#ffffff,后面那六位數(shù)是16進制數(shù),相當(dāng)于“0x000000”到“0xffffff”。這實現(xiàn)的思路是將hex的最大值ffffff先轉(zhuǎn)換為10進制,進行random后再轉(zhuǎn)換回16進制。我們看一下,如何得到16777215 這個數(shù)值的。
以下為引用的內(nèi)容: <!doctype html> |
實現(xiàn)5
以下為引用的內(nèi)容:
2. return '#' +(Math.random()*0xffffff<<0).toString(16);
3. }
|
基本實現(xiàn)4的改進,利用左移運算符把0xffffff轉(zhuǎn)化為整型。這樣就不用記16777215了。由于左移運算符的優(yōu)先級比不上乘號,因此隨機后再左移,連Math.floor也不用了。
實現(xiàn)6
以下為引用的內(nèi)容:
2. return '#' +( function (h){
3. return new Array(7-h.length).join( "0" )+h
4. })((Math.random()*0x1000000<<0).toString(16))
5. }
|
修正上面版本的bug(無法生成純白色與hex位數(shù)不足問題)。0x1000000相當(dāng)0xffffff+1,確保會抽選到0xffffff。在閉包里我們處理hex值不足5位的問題,直接在未位補零。
實現(xiàn)7
以下為引用的內(nèi)容:
2. return '#' +( '00000' +(Math.random()*0x1000000<<0).toString(16)).substr(-6);
3. }
|
這次在前面補零,連遞歸檢測也省了。
實戰(zhàn)一下:
以下為引用的內(nèi)容: <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> window.onload = function () { function drawSector(cx,cy,r,paper,oc,startAngle){ }; |
原文地址:http://www.cnblogs.com/rubylouvre/archive/2009/09/24/1572977.html
如對本文有疑問,請?zhí)峤坏浇涣髡搲?,廣大熱心網(wǎng)友會為你解答??! 點擊進入論壇