JavaScript颜色渐变
进入本页就可以看到颜色渐变的效果,如果错过了刷新一下就可以了。
一直好奇颜色渐变是怎么做出来的,其实觉得应该没有拖拽难,只要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
);
});
- 用javascript修改html元素的class
- JavaScript重定向
- JavaScript对象当作关联数组
- JavaScript弹出窗口以及窗口间的通信
- JavaScript显示信息实例
- 用JavaScript批量访问HTML元素
- 分离JavaScript与HTML
- JavaScript计算器实例
- JavaScript的Math对象计算器
- JavaScript改变HTML元素的位置
- JavaScript动画
- JavaScript动画函数
- JavaScript拖拽
- JavaScript拖拽2——多元素、分离JS
- JavaScript拖拽3——解决快速拖拽的问题
- addEventSimple函数,添加事件响应函数的方法
- addEventSimple观察鼠标事件
- JavaScript click事件深入
- JavaScript事件来源元素
- JavaScript修改与访问CSS
- JavaScript拖拽4——获得元素的位置
- JavaScript拖拽5——性能优化
- DOM Scripting相册
- DOM Scripting斑马表格
- DOM Scripting动画切图
- JavaScript颜色渐变
- JavaScript拖拽6——修复错误
