JS實(shí)現(xiàn)隨機(jī)顏色的3種方法與顏色格式的轉(zhuǎn)化
前言
相信大家都知道在前端的顏色表示方式有多種,一種是以3個(gè)或6個(gè)十六進(jìn)制的數(shù)子表示,一種是RGB的數(shù)字形式,還有一種是直接以顏色的英文來(lái)表示。這三種都是不支持透明色的。所以還有RGBA的表式方式,在RGB的的基礎(chǔ)上加入了Alpha透明,使網(wǎng)頁(yè)可以展現(xiàn)更加復(fù)雜絢麗的效果。
隨機(jī)顏色
在平時(shí)的碼農(nóng)日常中,經(jīng)常會(huì)用到求隨機(jī)顏色的地方,下面是我總結(jié)的幾種簡(jiǎn)單的實(shí)現(xiàn)隨機(jī)顏色的方式:
十六進(jìn)制格式(#000000-#FFFFFF)
第一種是比較簡(jiǎn)單的方法,這種方法是先隨機(jī)生成ffffff以內(nèi)16進(jìn)制數(shù),然后判斷位數(shù),少于6位的用while循環(huán)在前面加0,湊夠6位。
function randomHexColor() { //隨機(jī)生成十六進(jìn)制顏色 var hex = Math.floor(Math.random() * 16777216).toString(16); //生成ffffff以內(nèi)16進(jìn)制數(shù) while (hex.length < 6) { //while循環(huán)判斷hex位數(shù),少于6位前面加0湊夠6位 hex = '0' + hex; } return '#' + hex; //返回‘#'開頭16進(jìn)制顏色 }
還有一種比較方便但是比較難懂的方法,需要用到位運(yùn)算。
function randomHexColor() { //隨機(jī)生成十六進(jìn)制顏色 return '#' + ('00000' + (Math.random() * 0x1000000 << 0).toString(16)).substr(-6); }
按執(zhí)行順序可以分為以下六步:
- 先執(zhí)行
Math.random()
* 0x1000000,其中0x1000000=0xffffff+1,因?yàn)?code>Math.random()取不到1,所以+1,這樣就會(huì)生成一個(gè)1-16777216(不包含)以內(nèi)的浮點(diǎn)數(shù)。 - 然后執(zhí)行<<0,這是取整運(yùn)算,去掉后面的小數(shù)點(diǎn)。這時(shí)為一個(gè)16777216(不包含)以內(nèi)的十進(jìn)制數(shù)。
- 之后執(zhí)行
.toString(16)
,把十進(jìn)制數(shù)轉(zhuǎn)化為六位以下16進(jìn)制數(shù)。 - 再后執(zhí)行'00000'+,這時(shí)因?yàn)橹吧傻?6進(jìn)制數(shù)最少可能僅一位,在前面加上5個(gè)0。
- 最后執(zhí)行
.substr(-6)
,是去從-6開始的后面所有字符串,也就是最后6位數(shù)。 - 前面加上#并retuen。
RGB格式
function randomRgbColor() { //隨機(jī)生成RGB顏色 var r = Math.floor(Math.random() * 256); //隨機(jī)生成256以內(nèi)r值 var g = Math.floor(Math.random() * 256); //隨機(jī)生成256以內(nèi)g值 var b = Math.floor(Math.random() * 256); //隨機(jī)生成256以內(nèi)b值 return `rgb(${r},${g},$)`; //返回rgb(r,g,b)格式顏色 }
RGBA格式
function randomRgbaColor() { //隨機(jī)生成RGBA顏色 var r = Math.floor(Math.random() * 256); //隨機(jī)生成256以內(nèi)r值 var g = Math.floor(Math.random() * 256); //隨機(jī)生成256以內(nèi)g值 var b = Math.floor(Math.random() * 256); //隨機(jī)生成256以內(nèi)b值 var alpha = Math.random(); //隨機(jī)生成1以內(nèi)a值 return `rgb(${r},${g},$,${alpha})`; //返回rgba(r,g,b,a)格式顏色 }
顏色格式轉(zhuǎn)化
在編碼過程中,經(jīng)常會(huì)遇到要將顏色格式相互轉(zhuǎn)化的問題,其中十六進(jìn)制格式和RGB格式是可以相互轉(zhuǎn)化的,但是RGBA格式由于多了前兩者沒有的Alpha透明屬性,所以和前兩者轉(zhuǎn)化會(huì)丟失Alpha值,不建議進(jìn)行轉(zhuǎn)化,下面是我的顏色轉(zhuǎn)化的方法:
十六進(jìn)制轉(zhuǎn)為RGB
function hex2Rgb(hex) { //十六進(jìn)制轉(zhuǎn)為RGB var rgb = []; // 定義rgb數(shù)組 if (/^\#[0-9A-F]{3}$/i.test(hex)) { //判斷傳入是否為#三位十六進(jìn)制數(shù) let sixHex = '#'; hex.replace(/[0-9A-F]/ig, function(kw) { sixHex += kw + kw; //把三位16進(jìn)制數(shù)轉(zhuǎn)化為六位 }); hex = sixHex; //保存回hex } if (/^#[0-9A-F]{6}$/i.test(hex)) { //判斷傳入是否為#六位十六進(jìn)制數(shù) hex.replace(/[0-9A-F]{2}/ig, function(kw) { rgb.push(eval('0x' + kw)); //十六進(jìn)制轉(zhuǎn)化為十進(jìn)制并存如數(shù)組 }); return `rgb(${rgb.join(',')})`; //輸出RGB格式顏色 } else { console.log(`Input ${hex} is wrong!`); return 'rgb(0,0,0)'; } }
RGB轉(zhuǎn)為十六進(jìn)制
function rgb2Hex(rgb) { if (/^rgb\((\d{1,3}\,){2}\d{1,3}\)$/i.test(rgb)) { //test RGB var hex = '#'; //定義十六進(jìn)制顏色變量 rgb.replace(/\d{1,3}/g, function(kw) { //提取rgb數(shù)字 kw = parseInt(kw).toString(16); //轉(zhuǎn)為十六進(jìn)制 kw = kw.length < 2 ? 0 + kw : kw; //判斷位數(shù),保證兩位 hex += kw; //拼接 }); return hex; //返回十六進(jìn)制 } else { console.log(`Input ${rgb} is wrong!`); return '#000'; //輸入格式錯(cuò)誤,返回#000 } }
總結(jié)
以上就是這篇文文章的全部?jī)?nèi)容了,也是我在平時(shí)遇到的關(guān)于顏色處理方面的問題,大家有遇到什么奇怪的問題和更好的解決方法可以交流溝通一下。希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助。
- JS實(shí)現(xiàn)鼠標(biāo)滑過鏈接改變網(wǎng)頁(yè)背景顏色的方法
- 鼠標(biāo)選擇動(dòng)態(tài)改變網(wǎng)頁(yè)背景顏色的JS代碼
- JS實(shí)現(xiàn)文字鏈接感應(yīng)鼠標(biāo)淡入淡出改變顏色的方法
- JavaScript實(shí)現(xiàn)的鼠標(biāo)響應(yīng)顏色漸變效果完整實(shí)例
- js隨機(jī)顏色代碼的多種實(shí)現(xiàn)方式
- js獲取隨機(jī)顏色值的函數(shù)
- javascript生成隨機(jī)顏色示例代碼
- JavaScript隨機(jī)生成顏色的方法
- js實(shí)現(xiàn)點(diǎn)擊按鈕后給Div圖層設(shè)置隨機(jī)背景顏色的方法
- JavaScript實(shí)現(xiàn)鼠標(biāo)移入隨機(jī)變換顏色
相關(guān)文章
JS中的算法與數(shù)據(jù)結(jié)構(gòu)之棧(Stack)實(shí)例詳解
這篇文章主要介紹了JS中的算法與數(shù)據(jù)結(jié)構(gòu)之棧(Stack),結(jié)合實(shí)例形式詳細(xì)分析了js中棧的概念、原理、定義及常見使用方法,需要的朋友可以參考下2019-08-08