Javascript 顏色漸變效果的實(shí)現(xiàn)代碼
下面就是博主的一些思路和解決辦法,如果對(duì)此沒興趣,想直接使用jquery插件的同學(xué),可以點(diǎn)這里
思路
每一種顏色由RGB組成,每兩位為一個(gè)16進(jìn)制數(shù)
當(dāng)前顏色代碼和目標(biāo)顏色代碼,轉(zhuǎn)換成10進(jìn)制數(shù)后,是有差值的,利用差值,設(shè)定總執(zhí)行次數(shù)的步長,計(jì)算每一步變更顏色的10進(jìn)制數(shù)
利用定時(shí)器執(zhí)行
簡(jiǎn)單的講,就是將6位顏色代碼以每兩位轉(zhuǎn)換為10進(jìn)制數(shù),然后計(jì)算兩對(duì)RGB值的差,根據(jù)設(shè)定的步長(執(zhí)行次數(shù)),計(jì)算每一步需要增加或減少的RGB值,最后變?yōu)槟繕?biāo)顏色的RGB值
需要解決的問題
將6位顏色代碼轉(zhuǎn)換為10進(jìn)制
根據(jù)步長計(jì)算每一步增加或減少數(shù)值
使用定時(shí)器執(zhí)行這個(gè)增加或減少的過程
1、將6位顏色代碼轉(zhuǎn)換為10進(jìn)制
關(guān)于16進(jìn)制轉(zhuǎn)為10進(jìn)制,學(xué)校課本上就已經(jīng)講過了。個(gè)位*16的0次方,十位*16的1次方,以此類推。顏色是由RGB組成,每兩位為一組,如:#123456,R=12,G=34,B=56,但實(shí)際上RGB值是10進(jìn)制,所以,R=12只能說是對(duì)應(yīng)的位置,12轉(zhuǎn)為10進(jìn)制:2*1+1*16=18,34:4*1+3*16=52,56:6*1+5*16=96,所以RGB=[18,52,96]。
這是數(shù)字的,但16進(jìn)制還有A-F,所以還得先將A-F轉(zhuǎn)為10-15,可以先用一個(gè)數(shù)組來保存整個(gè)16進(jìn)制對(duì)應(yīng)的數(shù)
var f=new Array();
f['0']=0;
f['1']=1;
f['2']=2;
f['3']=3;
f['4']=4;
f['5']=5;
f['6']=6;
f['7']=7;
f['8']=8;
f['9']=9;
f['A']=10;
f['B']=11;
f['C']=12;
f['D']=13;
f['E']=14;
f['F']=15;
因?yàn)轭伾a是不區(qū)分大小寫的,所以可以先把顏色全部轉(zhuǎn)換為大寫
code=code.toLocaleUpperCase();//轉(zhuǎn)換為大寫
接著就是16進(jìn)制轉(zhuǎn)為10進(jìn)制
//code即為6位顏色代碼,如:f07786;
var r=f[code[0]]*16+f[code[1]];
var g=f[code[2]]*16+f[code[3]];
var b=f[code[4]]*16+f[code[5]];
整個(gè)轉(zhuǎn)換的代碼,寫成一個(gè)方法
function colorConversion(code){
var len=code.length;
var f=new Array();
f['0']=0;
f['1']=1;
f['2']=2;
f['3']=3;
f['4']=4;
f['5']=5;
f['6']=6;
f['7']=7;
f['8']=8;
f['9']=9;
f['A']=10;
f['B']=11;
f['C']=12;
f['D']=13;
f['E']=14;
f['F']=15;
code=code.toLocaleUpperCase();//轉(zhuǎn)換為大寫
var s=code.substr(0,1);
if(s=='#'){
code=code.substr(1,6);
}
var r=f[code[0]]*16+f[code[1]];
var g=f[code[2]]*16+f[code[3]];
var b=f[code[4]]*16+f[code[5]];
return [r,g,b];
}
代碼中的s,是用來判斷顏色代碼是否帶有#號(hào),有就去掉,最后返回一個(gè)包含RGB值的數(shù)組
計(jì)算增加或減少的步長
比如,設(shè)定顏色變化次數(shù)為10次,那就需要計(jì)算這10次變化,每一次RGB值的增減數(shù)值是多少。利用當(dāng)前顏色的RGB值和目標(biāo)顏色的RGB的差取絕對(duì)值,然后除以10,可以得到一個(gè)步長,但這個(gè)值很可能是小數(shù),可以把小數(shù)舍去,那么在最后一步增減數(shù)值的時(shí)候,直接變到目標(biāo)顏色的RGB值就行了
var _step=10;
var _R_step=parseInt(Math.abs(_thisRGB[0]-_toRGB[0])/_step); //R的增減步長
var _G_step=parseInt(Math.abs(_thisRGB[1]-_toRGB[1])/_step); //G的增減步長
var _B_step=parseInt(Math.abs(_thisRGB[2]-_toRGB[2])/_step); //B的增減步長
每次執(zhí)行增減
如果執(zhí)行次數(shù)為10,也就是要連續(xù)的執(zhí)行10次,當(dāng)_step=1的時(shí)候,就算執(zhí)行完成。那么在增減步長上,就會(huì)出現(xiàn),如果_step=10,那么增減就是1倍步長,如果_step=9,也就是執(zhí)行到第二步,那增減的就是2倍步長,一直到_step=1,增減9倍步長。這里可以使用這么一句簡(jiǎn)單的計(jì)算
var step=10;
var _step=step;
//循環(huán)體內(nèi)
var s=(step-_step)+1;
_step--;
接著判斷當(dāng)前顏色RGB值和目標(biāo)RGB的是增加還是減少
var r=_step==1?_toRGB[0]:(_thisRGB[0]>_toRGB[0]?_thisRGB[0]-_R_step*s:_thisRGB[0]+_R_step*s);
var g=_step==1?_toRGB[1]:(_thisRGB[1]>_toRGB[1]?_thisRGB[1]-_G_step*s:_thisRGB[1]+_G_step*s);
var b=_step==1?_toRGB[2]:(_thisRGB[2]>_toRGB[2]?_thisRGB[2]-_B_step*s:_thisRGB[2]+_B_step*s);
最后,將顏色輸出
obj.css({'background-color':'rgb('+r+','+g+','+b+')'});
這里輸出的是rgb()的方式,沒關(guān)系,和顏色代碼同理,如果覺得還是輸出6位代碼,那就將10進(jìn)制轉(zhuǎn)成16進(jìn)制就好了
最后就是用定時(shí)器來執(zhí)行,中間還有對(duì)速度和計(jì)算,這里就不講了。最后的執(zhí)行代碼:
/*
參數(shù):
obj:目標(biāo)對(duì)象
thisRGB:當(dāng)前背景顏色的6位代碼
toRGB:目標(biāo)背景顏色的6位代碼
thisColor:當(dāng)前文字顏色的6位代碼
toColor:目標(biāo)文字顏色的6位代碼
step:執(zhí)行次數(shù)
speed:執(zhí)行速度
*/
function colorGradient(obj,thisRGB,toRGB,thisColor,toColor,step,speed){
var _thisRGB=colorConversion(thisRGB); //16進(jìn)制轉(zhuǎn)換10進(jìn)制
var _toRGB=colorConversion(toRGB);
if(thisColor&&toColor){
var _thisColor=colorConversion(thisColor,1);
var _toColor=colorConversion(toColor,1);
}
var step=step?step:3;
var _step=step;
var _speed=speed?parseInt(speed/step):30; //根據(jù)總時(shí)間計(jì)算每次執(zhí)行的速度
var _R_step=parseInt(Math.abs(_thisRGB[0]-_toRGB[0])/_step);
var _G_step=parseInt(Math.abs(_thisRGB[1]-_toRGB[1])/_step);
var _B_step=parseInt(Math.abs(_thisRGB[2]-_toRGB[2])/_step);
var timer=setInterval(function(){
if(_step>0){
var s=(step-_step)+1;
var r=_step==1?_toRGB[0]:(_thisRGB[0]>_toRGB[0]?_thisRGB[0]-_R_step*s:_thisRGB[0]+_R_step*s);
var g=_step==1?_toRGB[1]:(_thisRGB[1]>_toRGB[1]?_thisRGB[1]-_G_step*s:_thisRGB[1]+_G_step*s);
var b=_step==1?_toRGB[2]:(_thisRGB[2]>_toRGB[2]?_thisRGB[2]-_B_step*s:_thisRGB[2]+_B_step*s);
obj.css({'background-color':'rgb('+r+','+g+','+b+')'});
if(thisColor&&toColor){
var cr=_step==1?_toColor[0]:(_thisColor[0]>_toColor[0]?_thisColor[0]-_R_step*s:_thisColor[0]+_R_step*s);
var cg=_step==1?_toColor[1]:(_thisColor[1]>_toColor[1]?_thisColor[1]-_G_step*s:_thisColor[1]+_G_step*s);
var cb=_step==1?_toColor[2]:(_thisColor[2]>_toColor[2]?_thisColor[2]-_B_step*s:_thisColor[2]+_B_step*s);
obj.css({'color':'rgb('+cr+','+cg+','+cb+')'});
}
_step--;
}else{
clearInterval(timer);
return true;
}
},_speed);
}
這個(gè)方法很簡(jiǎn)單,但漸變的平滑度一般,特別是在一組對(duì)象連續(xù)執(zhí)行的時(shí)候。只能說,這是一種很吊絲,很笨的方法,大神都是用Tween算法
jQuery顏色漸變插件
jquery.animate-colors-min.js
使用方法,直接使用jquery的animate就可以了,只是不用指定當(dāng)前顏色,程序會(huì)自動(dòng)取當(dāng)前顏色,不過必須在樣式里設(shè)定background
obj.animate({'background-color':'#ff0000','color':'#000000'});
- JS Tween 顏色漸變
- 利用遞增的數(shù)字返回循環(huán)漸變的顏色的js代碼
- js+HTML5實(shí)現(xiàn)canvas多種顏色漸變效果的方法
- js實(shí)現(xiàn)按鈕顏色漸變動(dòng)畫效果
- javascript實(shí)現(xiàn)顏色漸變的方法
- JS實(shí)現(xiàn)的顏色實(shí)時(shí)漸變效果完整實(shí)例
- 神奇!js+CSS+DIV實(shí)現(xiàn)文字顏色漸變效果
- 漂亮! js實(shí)現(xiàn)顏色漸變效果
- JavaScript 顏色梯度和漸變效果
- js實(shí)現(xiàn)顏色階梯漸變效果(Gradient算法)
相關(guān)文章
JavaScript遍歷數(shù)組的方法代碼實(shí)例
這篇文章主要介紹了JavaScript遍歷數(shù)組的方法代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01通過js示例講解時(shí)間復(fù)雜度與空間復(fù)雜度
這篇文章主要給大家介紹了關(guān)于如何通過js示例講解時(shí)間復(fù)雜度與空間復(fù)雜度的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用js具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08JavaScript設(shè)計(jì)模式之構(gòu)造器模式(生成器模式)定義與用法實(shí)例分析
這篇文章主要介紹了JavaScript設(shè)計(jì)模式之構(gòu)造器模式(生成器模式)定義與用法,結(jié)合實(shí)例形式分析了javascript構(gòu)造器模式的概念、原理、與工廠模式的區(qū)別以及相關(guān)使用方法,需要的朋友可以參考下2018-07-07for循環(huán) + setTimeout 結(jié)合一些示例(前端面試題)
最近在學(xué)習(xí)node.js開發(fā)資料,正好碰到了for循環(huán)+settimeout的經(jīng)典例子,下面小編給大家分享for循環(huán) + setTimeout 結(jié)合一些示例代碼,需要的朋友參考下吧2017-08-08微信小程序入口場(chǎng)景的問題集合與相關(guān)解決方法
這篇文章主要介紹了微信小程序入口場(chǎng)景的問題集合與相關(guān)解決方法,從零開始開發(fā)一個(gè)小程序,大多數(shù)坑點(diǎn)都是在微信小程序的各個(gè)入口場(chǎng)景處。所以這里整理一下微信小程序的各個(gè)入口場(chǎng)景會(huì)面臨的問題以及解決方案,需要的朋友可以參考下2019-06-06頁面下沉抖動(dòng)效果-網(wǎng)站HTTP連接沒有效果-PC上有效果
頁面下沉抖動(dòng)效果實(shí)現(xiàn)代碼,代碼少,功能還可以2008-05-05動(dòng)態(tài)讀取JSON解析鍵值對(duì)的方法
這篇文章主要介紹了動(dòng)態(tài)讀取JSON解析鍵值對(duì)的方法,需要的朋友可以參考下2014-06-06JavaScript雙向鏈表實(shí)現(xiàn)LRU緩存算法的示例代碼
本文主要介紹了JavaScript雙向鏈表實(shí)現(xiàn)LRU緩存算法的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01