js實(shí)現(xiàn)顏色階梯漸變效果(Gradient算法)
html中顏色可以使用rgb和hex方式來(lái)表示。
在色彩中,色相、明度、純度也都可以產(chǎn)生漸變效果,并會(huì)表現(xiàn)出具有豐富層次的美感。本文主要講述兩種顏色RGB數(shù)值的梯級(jí)漸變算法。
其中如如16進(jìn)制顏色如#336600分別表示rgb模式中r的值為16進(jìn)制33(即),g的值為16進(jìn)制的66,和b為16進(jìn)制的00,轉(zhuǎn)換后用rgb完整表述為:rgb(51,102,0)。
其中使用16進(jìn)制進(jìn)行加減乘除不方便,尤其還使用了rgb的16進(jìn)制顏色組合(#336600)。因此我們可以將16進(jìn)制轉(zhuǎn)換為rgb單個(gè)進(jìn)行梯級(jí)運(yùn)算在進(jìn)行組合。
已知:RStart=50,REnd=200,RStart、REnd之間平均分成3份(Step=3),求每份的數(shù)值(StepN)分別是多少。
公式:Gradient = RStart+ (REnd-RStart) / Step * N (第N步的顏色rgb中R的值)
實(shí)現(xiàn)方法非常簡(jiǎn)單,只是需要將顏色從rgb到hex的互轉(zhuǎn)。
實(shí)現(xiàn)代碼:
<script type="text/javascript">
/*
// 作者 yanue
// 參數(shù):
// startColor:開(kāi)始顏色hex
// endColor:結(jié)束顏色hex
// step:幾個(gè)階級(jí)(幾步)
*/
function gradientColor(startColor,endColor,step){
startRGB = this.colorRgb(startColor);//轉(zhuǎn)換為rgb數(shù)組模式
startR = startRGB[0];
startG = startRGB[1];
startB = startRGB[2];
endRGB = this.colorRgb(endColor);
endR = endRGB[0];
endG = endRGB[1];
endB = endRGB[2];
sR = (endR-startR)/step;//總差值
sG = (endG-startG)/step;
sB = (endB-startB)/step;
var colorArr = [];
for(var i=0;i<step;i++){
//計(jì)算每一步的hex值
var hex = this.colorHex('rgb('+parseInt((sR*i+startR))+','+parseInt((sG*i+startG))+','+parseInt((sB*i+startB))+')');
colorArr.push(hex);
}
return colorArr;
}
// 將hex表示方式轉(zhuǎn)換為rgb表示方式(這里返回rgb數(shù)組模式)
gradientColor.prototype.colorRgb = function(sColor){
var reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/;
var sColor = sColor.toLowerCase();
if(sColor && reg.test(sColor)){
if(sColor.length === 4){
var sColorNew = "#";
for(var i=1; i<4; i+=1){
sColorNew += sColor.slice(i,i+1).concat(sColor.slice(i,i+1));
}
sColor = sColorNew;
}
//處理六位的顏色值
var sColorChange = [];
for(var i=1; i<7; i+=2){
sColorChange.push(parseInt("0x"+sColor.slice(i,i+2)));
}
return sColorChange;
}else{
return sColor;
}
};
// 將rgb表示方式轉(zhuǎn)換為hex表示方式
gradientColor.prototype.colorHex = function(rgb){
var _this = rgb;
var reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/;
if(/^(rgb|RGB)/.test(_this)){
var aColor = _this.replace(/(?:(|)|rgb|RGB)*/g,"").split(",");
var strHex = "#";
for(var i=0; i<aColor.length; i++){
var hex = Number(aColor[i]).toString(16);
hex = hex<10 ? 0+''+hex :hex;// 保證每個(gè)rgb的值為2位
if(hex === "0"){
hex += hex;
}
strHex += hex;
}
if(strHex.length !== 7){
strHex = _this;
}
return strHex;
}else if(reg.test(_this)){
var aNum = _this.replace(/#/,"").split("");
if(aNum.length === 6){
return _this;
}else if(aNum.length === 3){
var numHex = "#";
for(var i=0; i<aNum.length; i+=1){
numHex += (aNum[i]+aNum[i]);
}
return numHex;
}
}else{
return _this;
}
}
var gradient = new gradientColor('#013548','#554851',10);
console.log(gradient);//控制臺(tái)輸出
alert(gradient);
</script>
以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,同時(shí)也希望多多支持腳本之家!
相關(guān)文章
利用js判斷瀏覽器類(lèi)型(是否為IE,Firefox,Opera瀏覽器)
我們開(kāi)發(fā)的人來(lái)說(shuō)經(jīng)常要加個(gè)判斷,要不可能某些功能沒(méi)法正常使用。要是沒(méi)加個(gè)判斷就會(huì)給大家?guī)?lái)些麻煩2013-11-11
JS實(shí)現(xiàn)title標(biāo)題欄文字不間斷滾動(dòng)顯示效果
這篇文章主要介紹了JS實(shí)現(xiàn)title標(biāo)題欄文字不間斷滾動(dòng)顯示效果,通過(guò)javascript時(shí)間函數(shù)定時(shí)操作動(dòng)態(tài)修改頁(yè)面元素實(shí)現(xiàn)滾動(dòng)效果,需要的朋友可以參考下2016-09-09
confirm的用法示例用于按鈕操作時(shí)確定是否執(zhí)行
這篇文章主要介紹了confirm的用法,confirm一般用于按鈕操作時(shí)確定是否執(zhí)行,需要的朋友可以參考下2014-06-06
如何用JavaScript實(shí)現(xiàn)動(dòng)態(tài)修改CSS樣式表
如何用JavaScript實(shí)現(xiàn)動(dòng)態(tài)修改CSS樣式表?下面小編就為大家?guī)?lái)一篇JavaScript實(shí)現(xiàn)動(dòng)態(tài)修改CSS樣式表的方法。希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2016-05-05
微信小程序?qū)崿F(xiàn)swiper切換卡內(nèi)嵌滾動(dòng)條不顯示的方法示例
這篇文章主要介紹了微信小程序?qū)崿F(xiàn)swiper切換卡內(nèi)嵌滾動(dòng)條不顯示的方法,涉及微信小程序swiper選項(xiàng)卡組件相關(guān)操作技巧,需要的朋友可以參考下2018-12-12
JS實(shí)現(xiàn)數(shù)組內(nèi)值累加常見(jiàn)的3個(gè)方法
這篇文章主要給大家介紹了關(guān)于JS實(shí)現(xiàn)數(shù)組內(nèi)值累加常見(jiàn)的3個(gè)方法,文中通過(guò)實(shí)例代碼將3個(gè)方法介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用js具有一定參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07

