JS 隨機各種格式的顏色值

隨機顏色

在平時的碼農日常中,經常會用到求隨機顏色的地方,下面是我總結的幾種簡單的實現隨機顏色的方式:

十六進制格式(#000000-#FFFFFF)

第一種是比較簡單的方法,這種方法是先隨機生成ffffff以內16進制數,然後判斷位數,少於6位的用while循環在前面加0,湊夠6位。

function randomHexColor() { //隨機生成十六進制顏色
 var hex = Math.floor(Math.random() * 16777216).toString(16); //生成ffffff以內16進制數
 while (hex.length < 6) { //while循環判斷hex位數,少於6位前面加0湊夠6位
  hex = '0' + hex;
 }
 return '#' + hex; //返回‘#'開頭16進制顏色
}

還有一種比較方便但是比較難懂的方法,需要用到位運算。


function randomHexColor() { //隨機生成十六進制顏色
 return '#' + ('00000' + (Math.random() * 0x1000000 << 0).toString(16)).substr(-6);
}

按執行順序可以分爲以下六步:

  1. 先執行Math.random() * 0x1000000,其中0x1000000=0xffffff+1,因爲Math.random()取不到1,所以+1,這樣就會生成一個1-16777216(不包含)以內的浮點數。
  2. 然後執行<<0,這是取整運算,去掉後面的小數點。這時爲一個16777216(不包含)以內的十進制數。
  3. 之後執行.toString(16) ,把十進制數轉化爲六位以下16進制數。
  4. 再後執行'00000'+,這時因爲之前生成的16進制數最少可能僅一位,在前面加上5個0。
  5. 最後執行.substr(-6) ,是去從-6開始的後面所有字符串,也就是最後6位數。
  6. 前面加上#並retuen。

RGB格式

function randomRgbColor() { //隨機生成RGB顏色
     var r = Math.floor(Math.random() * 256); //隨機生成256以內r值
     var g = Math.floor(Math.random() * 256); //隨機生成256以內g值
     var b = Math.floor(Math.random() * 256); //隨機生成256以內b值
     return `rgb(${r},${g},${b})`; //返回rgb(r,g,b)格式顏色
}

RGBA格式

function randomRgbaColor() { //隨機生成RGBA顏色
 var r = Math.floor(Math.random() * 256); //隨機生成256以內r值
 var g = Math.floor(Math.random() * 256); //隨機生成256以內g值
 var b = Math.floor(Math.random() * 256); //隨機生成256以內b值
 var alpha = Math.random(); //隨機生成1以內a值
 return `rgb(${r},${g},${b},${alpha})`; //返回rgba(r,g,b,a)格式顏色
}

顏色格式轉化

在編碼過程中,經常會遇到要將顏色格式相互轉化的問題,其中十六進制格式和RGB格式是可以相互轉化的,但是RGBA格式由於多了前兩者沒有的Alpha透明屬性,所以和前兩者轉化會丟失Alpha值,不建議進行轉化,下面是我的顏色轉化的方法:

十六進制轉爲RGB

function hex2Rgb(hex) { //十六進制轉爲RGB
 var rgb = []; // 定義rgb數組
 if (/^\#[0-9A-F]{3}$/i.test(hex)) { //判斷傳入是否爲#三位十六進制數
  let sixHex = '#';
  hex.replace(/[0-9A-F]/ig, function(kw) {
   sixHex += kw + kw; //把三位16進制數轉化爲六位
  });
  hex = sixHex; //保存回hex
 }
 if (/^#[0-9A-F]{6}$/i.test(hex)) { //判斷傳入是否爲#六位十六進制數
  hex.replace(/[0-9A-F]{2}/ig, function(kw) {
   rgb.push(eval('0x' + kw)); //十六進制轉化爲十進制並存如數組
  });
  return `rgb(${rgb.join(',')})`; //輸出RGB格式顏色
 } else {
  console.log(`Input ${hex} is wrong!`);
  return 'rgb(0,0,0)';
 }
}

RGB轉爲十六進制

function rgb2Hex(rgb) {
 if (/^rgb\((\d{1,3}\,){2}\d{1,3}\)$/i.test(rgb)) { //test RGB
  var hex = '#'; //定義十六進制顏色變量
  rgb.replace(/\d{1,3}/g, function(kw) { //提取rgb數字
   kw = parseInt(kw).toString(16); //轉爲十六進制
   kw = kw.length < 2 ? 0 + kw : kw; //判斷位數,保證兩位
   hex += kw; //拼接
  });
  return hex; //返回十六進制
 } else {
  console.log(`Input ${rgb} is wrong!`);
  return '#000'; //輸入格式錯誤,返回#000
 }
}

轉自 http://www.jb51.net/article/102109.htm

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章