欢迎来到HELLO素材网!
丰富的DIV CSS模版、JS,jQuery特效免费提供下载
当前位置:主页 > 建站教程 > JS教程 >

JavaScript实现颜色渐变

发表于2014-06-08 00:25| 次阅读| 来源整理| 作者管理员

摘要:一直好奇颜色渐变是怎么做出来的,其实觉得应该没有拖拽难,只要setTimeout就可以了,然后用变化的rgb组装出来一个颜色就可以了。恰好,最近在读《JavaScript DOM高级程序设计》的时候

一直好奇颜色渐变是怎么做出来的,其实觉得应该没有拖拽难,只要setTimeout就可以了,然后用变化的rgb组装出来一个颜色就可以了。恰好,最近在读《JavaScript DOM高级程序设计》的时候,在第五章的最后有一个fadeColor函数,也就是本页使用的函数,可惜书上没有注释。自己读了读代码,觉得代码在延时控制上肯定有问题,不过回家一调试,发现还是自己思维定势了。决定好好地分析一下这个函数。

实例JavaScript代码

//所有代码的执行时间只有24毫秒左右。
function fadeColor( from, to, callback, duration, totalFrames) {
    //用一个函数来包裹setTimeout,根据帧数来确定延时
    function doTimeout(color,frame) {
        setTimeout(function() { 
            try {
                callback(color);
            } catch(e) {
                JSLog.write(e);
            }
        }, (duration*1000/totalFrames)*frame);
		//总持续秒数/每秒帧数*当前帧数=延时(秒),再乘以1000作为延时(毫秒) 
    }
    // 整个渐变过程的持续时间,默认为1秒
    var duration = duration || 1; 
    // 总帧数,默认为持续秒数*15帧,也即每秒15帧
    var totalFrames = totalFrames || duration*15;
    var r,g,b;
    var frame = 1;
    //在第0帧设置起始颜色
    doTimeout('rgb(' + from.r + ',' + from.g + ',' + from.b + ')',0);
    //计算每次变化所需要改变的rgb值
    while (frame < totalFrames+1) {
        r = Math.ceil(from.r * ((totalFrames-frame)/totalFrames) 
            + to.r * (frame/totalFrames));
        g = Math.ceil(from.g * ((totalFrames-frame)/totalFrames) 
            + to.g * (frame/totalFrames));
        b = Math.ceil(from.b * ((totalFrames-frame)/totalFrames) 
            + to.b * (frame/totalFrames));
        // 调用本frame的doTimeout
        doTimeout('rgb(' + r + ',' + g + ',' + b + ')',frame);
        frame++;
    }
}

整个代码并不是“一个setTimeout接着一个setTimeout”,而是在一个循环中设置好所有的setTimeout,第一个延时10毫秒,第二个延时20毫秒……

另外,原来的代码中有一个变量名实在是误导,framePerSecond实际上是总帧数,而并非每秒帧数,我已经把变量名改为totalFrames。

fadeColor接受5个参数,前两个是起始颜色和结束颜色,都是一个由r、g、b三个属性组成的颜色对象。第三个参数callback是实际起作用的函数。第四个参数duration是渐变效果要持续的时间。最后一个参数totalFrames是总帧数。

测试代码

function addEventSimple(obj,evt,fn){
	if(obj.addEventListener){
		obj.addEventListener(evt,fn,false);
	}else if(obj.attachEvent){
		obj.attachEvent('on'+evt,fn);
	}
}
addEventSimple(window,'load',function(){
	fadeColor(
		 {r:0,g:255,b:0}, //star color
		 {r:255,g:255,b:255}, //end color
		 function(color) {
			  document.getElementById("content").style.backgroundColor = color;
		 },
		 3
	);
});
演示:



运行代码保存代码提示:您可以先修改部分代码再运行