亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

Javascript 顏色漸變效果的實現代碼

2019-11-20 21:55:25
字體:
來源:轉載
供稿:網友

下面就是博主的一些思路和解決辦法,如果對此沒興趣,想直接使用jquery插件的同學,可以點這里

思路

每一種顏色由RGB組成,每兩位為一個16進制數
當前顏色代碼和目標顏色代碼,轉換成10進制數后,是有差值的,利用差值,設定總執行次數的步長,計算每一步變更顏色的10進制數
利用定時器執行
簡單的講,就是將6位顏色代碼以每兩位轉換為10進制數,然后計算兩對RGB值的差,根據設定的步長(執行次數),計算每一步需要增加或減少的RGB值,最后變為目標顏色的RGB值

需要解決的問題

將6位顏色代碼轉換為10進制
根據步長計算每一步增加或減少數值
使用定時器執行這個增加或減少的過程
1、將6位顏色代碼轉換為10進制

關于16進制轉為10進制,學校課本上就已經講過了。個位*16的0次方,十位*16的1次方,以此類推。顏色是由RGB組成,每兩位為一組,如:#123456,R=12,G=34,B=56,但實際上RGB值是10進制,所以,R=12只能說是對應的位置,12轉為10進制:2*1+1*16=18,34:4*1+3*16=52,56:6*1+5*16=96,所以RGB=[18,52,96]。

這是數字的,但16進制還有A-F,所以還得先將A-F轉為10-15,可以先用一個數組來保存整個16進制對應的數

復制代碼 代碼如下:

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();//轉換為大寫
接著就是16進制轉為10進制

//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]];

整個轉換的代碼,寫成一個方法

復制代碼 代碼如下:

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();//轉換為大寫
    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,是用來判斷顏色代碼是否帶有#號,有就去掉,最后返回一個包含RGB值的數組

計算增加或減少的步長

比如,設定顏色變化次數為10次,那就需要計算這10次變化,每一次RGB值的增減數值是多少。利用當前顏色的RGB值和目標顏色的RGB的差取絕對值,然后除以10,可以得到一個步長,但這個值很可能是小數,可以把小數舍去,那么在最后一步增減數值的時候,直接變到目標顏色的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的增減步長

每次執行增減

如果執行次數為10,也就是要連續的執行10次,當_step=1的時候,就算執行完成。那么在增減步長上,就會出現,如果_step=10,那么增減就是1倍步長,如果_step=9,也就是執行到第二步,那增減的就是2倍步長,一直到_step=1,增減9倍步長。這里可以使用這么一句簡單的計算

復制代碼 代碼如下:

var step=10;
var _step=step;
//循環體內
var s=(step-_step)+1;
_step--;

接著判斷當前顏色RGB值和目標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()的方式,沒關系,和顏色代碼同理,如果覺得還是輸出6位代碼,那就將10進制轉成16進制就好了

最后就是用定時器來執行,中間還有對速度和計算,這里就不講了。最后的執行代碼:

復制代碼 代碼如下:

/*
參數:
obj:目標對象
thisRGB:當前背景顏色的6位代碼
toRGB:目標背景顏色的6位代碼
thisColor:當前文字顏色的6位代碼
toColor:目標文字顏色的6位代碼
step:執行次數
speed:執行速度
*/
function colorGradient(obj,thisRGB,toRGB,thisColor,toColor,step,speed){
    var _thisRGB=colorConversion(thisRGB); //16進制轉換10進制
    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;  //根據總時間計算每次執行的速度
    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);
}

這個方法很簡單,但漸變的平滑度一般,特別是在一組對象連續執行的時候。只能說,這是一種很吊絲,很笨的方法,大神都是用Tween算法

jQuery顏色漸變插件
jquery.animate-colors-min.js

使用方法,直接使用jquery的animate就可以了,只是不用指定當前顏色,程序會自動取當前顏色,不過必須在樣式里設定background

復制代碼 代碼如下:

obj.animate({'background-color':'#ff0000','color':'#000000'});

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
夜色77av精品影院| 亚洲精品国产电影| 国产成人精品a视频一区www| 欧美成年人在线观看| 欧美精品在线观看| 精品偷拍一区二区三区在线看| 中文字幕一区二区精品| 国产专区精品视频| 51ⅴ精品国产91久久久久久| 国产精品久久久久久久久粉嫩av| 精品久久久久久亚洲精品| 岛国av午夜精品| 欧美三级欧美成人高清www| 国产精品精品视频| 精品久久久久久久久国产字幕| 亚洲毛茸茸少妇高潮呻吟| 久久久精品2019中文字幕神马| 久久综合伊人77777蜜臀| 国产精品影院在线观看| 欧美激情18p| 亚洲综合国产精品| 欧美成人午夜激情视频| 亚洲精品综合精品自拍| 欧美日韩精品国产| 欧美日韩国产影院| 中文字幕综合在线| 日韩精品免费观看| 国产中文欧美精品| 国产精品国产三级国产专播精品人| 亚洲国产精品va在看黑人| 亚洲区bt下载| 91亚洲精华国产精华| 国产精品av网站| 欧美午夜宅男影院在线观看| 亚洲剧情一区二区| 97婷婷涩涩精品一区| 国产成人av网| 国内成人精品视频| 欧美性做爰毛片| 欧美激情三级免费| 精品magnet| 中文字幕久热精品在线视频| 欧美日韩中文字幕日韩欧美| 欧美自拍视频在线观看| 日韩成人激情在线| 欧美人在线观看| 欧美亚洲激情视频| 亚洲精品久久久久久久久久久久久| 91精品久久久久久久久久久| 久久精品国产亚洲精品2020| 日韩国产欧美区| 国产精品欧美一区二区三区奶水| 国产精品视频网站| 欧美美最猛性xxxxxx| 国产精品免费久久久久影院| 日韩av影院在线观看| 91国在线精品国内播放| 亚洲丝袜av一区| 黑人巨大精品欧美一区二区免费| 97视频色精品| 国产精品福利在线观看| 亚洲自拍偷拍区| 九九热视频这里只有精品| 亚洲精品aⅴ中文字幕乱码| 亚洲精品国产精品国产自| 国产精品久久久av久久久| 欧美成人午夜免费视在线看片| 97超视频免费观看| 欧美性猛交xxxx免费看漫画| 久久精品国产亚洲精品2020| 欧美与黑人午夜性猛交久久久| 亚洲成人国产精品| 国产成+人+综合+亚洲欧洲| 欧美激情第99页| 91久久嫩草影院一区二区| 国产亚洲一区二区在线| 亚洲国产日韩欧美在线动漫| 亚洲乱码av中文一区二区| 国产精品激情av电影在线观看| 国产成人精品最新| 在线观看欧美成人| 久久精品色欧美aⅴ一区二区| 一区二区国产精品视频| 久热精品视频在线观看一区| 久久久国产一区二区| 韩国欧美亚洲国产| 亚洲一区二区在线| 国产精品久久久久久久久久东京| 国产免费久久av| 精品中文字幕久久久久久| 欧美精品激情blacked18| 国产精品九九九| 久久av资源网站| 久久久久999| 欧美人成在线视频| 亚洲娇小xxxx欧美娇小| 一区二区三区回区在观看免费视频| 揄拍成人国产精品视频| 最新69国产成人精品视频免费| 伊人伊成久久人综合网站| 欧美日韩另类视频| 亚洲男人天堂网站| 丝袜美腿亚洲一区二区| 久久av.com| 一本色道久久综合狠狠躁篇怎么玩| 亚洲成人中文字幕| 国产成人自拍视频在线观看| 中文字幕亚洲字幕| 欧美猛交免费看| 久久久久久久一区二区| 日韩视频精品在线| 亚洲性夜色噜噜噜7777| 亚洲国产一区二区三区在线观看| 久久久亚洲成人| 97在线视频免费| 欧美日韩国产成人在线| 久久久久久久久网站| 2019中文字幕全在线观看| 精品视频久久久久久久| 国产精品狼人色视频一区| 国产精品视频久| 国产欧美日韩视频| 在线一区二区日韩| 38少妇精品导航| 欧美国产亚洲精品久久久8v| 亚洲已满18点击进入在线看片| 欧美美最猛性xxxxxx| 日韩h在线观看| 91亚洲国产精品| 91久久嫩草影院一区二区| 中文字幕亚洲一区二区三区| 国产成人欧美在线观看| 亚洲精品在线视频| 久久久久久久久中文字幕| 欧美色欧美亚洲高清在线视频| 日韩av中文字幕在线免费观看| 97国产真实伦对白精彩视频8| 成人在线中文字幕| 日本不卡高字幕在线2019| 日韩精品免费在线| 成人xvideos免费视频| 国语自产偷拍精品视频偷| 91日本在线观看| 68精品国产免费久久久久久婷婷| 亚洲综合一区二区不卡| 欧美在线亚洲一区| 欧美日韩国产影院| 亚洲精品永久免费精品| 久久99久久99精品中文字幕| 在线精品高清中文字幕| 国产精品视频一| 成人性生交大片免费看视频直播| 日本老师69xxx| 国产日韩精品视频| 成人午夜黄色影院| 欧美丰满片xxx777| 亚洲成人激情小说| 日韩精品欧美国产精品忘忧草| 九九热这里只有精品免费看| 亚洲奶大毛多的老太婆| 91视频国产精品| 欧美—级a级欧美特级ar全黄| 国产成人精品视频| 国产自摸综合网|