JavaScript 颜色梯度和渐变效果第2/3页

 更新时间:2009年03月15日 21:15:07   作者:  
程序ColorGrads的作用是通过StartColor和EndColor生成颜色梯度集合。

【ColorTrans颜色渐变】

有了颜色梯度集合,只需要设个定时器把集合的值依次显示就是一个渐变效果了。
这个渐变一般是分两个步骤,分别是(FadeIn)和渐出(FadeOut)。
原理就是通过改变_index集合索引,渐入时逐渐变大,渐出时逐渐变小:
复制代码 代码如下:

//颜色渐入
FadeIn: function() {
this.Stop(); this._index++; this.SetColor();
if(this._index < this._colors.length - 1){
this._timer = setTimeout(Bind(this, this.FadeIn), this.Speed);
}
},
//颜色渐出
FadeOut: function() {
this.Stop(); this._index--; this.SetColor();
if(this._index > 0){
this._timer = setTimeout(Bind(this, this.FadeOut), this.Speed);
}
},

在SetColor设置样式程序中,通过CssColor来设置要修改的样式属性,例如字体颜色是"color",背景色是"backgroundColor":
复制代码 代码如下:

var color = this._colors[Math.min(Math.max(0, this._index), this._colors.length - 1)];
this._obj.style[this.CssColor] = "rgb(" + color[0] + "," + color[1] + "," + color[2] + ")";

由于颜色集合是根据开始颜色、结束颜色和步数生成的,所以如果要修改这些属性必须重新生成过集合。
Reset程序就是用来修改这些属性并重新生成集合的,集合重新生成后索引也要设回0:
复制代码 代码如下:

//修改颜色后必须重新获取颜色集合
color = Extend({ StartColor: this._startColor, EndColor: this._endColor, Step: this._step }, color || {});
//设置属性
this._grads.StartColor = this._startColor = color.StartColor;
this._grads.EndColor = this._endColor = color.EndColor;
this._grads.Step = this._step = color.Step;
//获取颜色集合
this._colors = this._grads.Create();
this._index = 0;

使用技巧
在颜色渐变菜单中,并没有使用链接标签a,原因是a的伪类的颜色并不能直接用js来修改(除非改class)。
暂时没想到很好的方法,只好用onclick跳转代替了。
在测试过程中还发现一个关于数组的问题,在ie和ff运行alert([,,].length)会分别显示3和2。
最后一个元素不写的话ff就会忽略这个元素,只要写的话就不会忽略即使是undefined和null,看了下文档也找到原因。
所以这个情况还是插一个东西进去,觉得不好看就new Array好了。
测试中还发现chrome(1.0.154.48)的map一个问题,map是js1.6的Array的方法,ff和chrome都支持(具体看这里)。
在ff中[,,1].map(function(){return 0})返回的是[0,0,0],但chrome却返回[,,0]。
即在chrome中如果元素是空(不包括null和undefined)的话就一律返回空,用new Array来创建也一样。
感觉这样不太合理,应该以后会改进吧。
使用说明 
复制代码 代码如下:

ColorGrads只有3个属性设置:
StartColor: "#fff",//开始颜色
EndColor: "#000",//结束颜色
Step: 20//渐变级数
设置好属性后用Create生成集合就行了。

ColorTrans只要一个参数,要实现渐变的对象,可设置以下属性:
StartColor: "",//开始颜色
EndColor: "#000",//结束颜色
Step: 20,//渐变级数
Speed: 20,//渐变速度
CssColor: "color"//设置属性(Scripting属性)
如果不设置StartColor会自动使用CurrentStyle获取的样式值。
其中StartColor、EndColor和Step在实例化后要重新设置的话需要用Reset来设置。

程序代码
ColorGrads部分:
复制代码 代码如下:

var ColorGrads = function(options){
this.SetOptions(options);
this.StartColor = this.options.StartColor;
this.EndColor = this.options.EndColor;
this.Step = Math.abs(this.options.Step);
};
ColorGrads.prototype = {
//设置默认属性
SetOptions: function(options) {
this.options = {//默认值
StartColor: "#fff",//开始颜色
EndColor: "#000",//结束颜色
Step: 20//渐变级数
};
Extend(this.options, options || {});
},
//获取渐变颜色集合
Create: function() {
var colors = [],
startColor = this.GetColor(this.StartColor),
endColor = this.GetColor(this.EndColor),
stepR = (endColor[0] - startColor[0]) / this.Step,
stepG = (endColor[1] - startColor[1]) / this.Step,
stepB = (endColor[2] - startColor[2]) / this.Step;
//生成颜色集合
for(var i = 0, n = this.Step, r = startColor[0], g = startColor[1], b = startColor[2]; i < n; i++){
colors.push([r, g, b]); r += stepR; g += stepG; b += stepB;
}
colors.push(endColor);
//修正颜色值
return Map(colors, function(x){ return Map(x, function(x){
return Math.min(Math.max(0, Math.floor(x)), 255);
});});
},
//获取颜色数据
GetColor: function(color) {
if(/^#[0-9a-f]{6}$/i.test(color))
{//#rrggbb
return Map([color.substr(1, 2), color.substr(3, 2), color.substr(5, 2)],
function(x){ return parseInt(x, 16); }
)
}
else if(/^#[0-9a-f]{3}$/i.test(color))
{//#rgb
return Map([color.substr(1, 1), color.substr(2, 1), color.substr(3, 1)],
function(x){ return parseInt(x + x, 16); }
)
}
else if(/^rgb(.*)$/i.test(color))
{//rgb(n,n,n) or rgb(n%,n%,n%)
return Map(color.match(/\d+(\.\d+)?\%?/g),
function(x){ return parseInt(x.indexOf("%") > 0 ? parseFloat(x, 10) * 2.55 : x, 10); }
)
}
else
{//color
var mapping = {"red":"#FF0000"};//略
color = mapping[color.toLowerCase()];
if(color){
return Map([color.substr(1, 2), color.substr(3, 2), color.substr(5, 2)],
function(x){ return parseInt(x, 16); }
)
}
}
}
};

相关文章

  • 浅析JavaScript中的平稳退化(graceful degradation)

    浅析JavaScript中的平稳退化(graceful degradation)

    所谓平稳退化,就是指可以让访问者在浏览器不支持javascript或者禁用了JavaScript的时候依旧可以顺利的浏览你的网页,下文给大家简单介绍了js中的平稳退化,感兴趣的朋友一起看看吧
    2017-07-07
  • js实现本地时间同步功能

    js实现本地时间同步功能

    这篇文章主要为大家详细介绍了js实现本地时间同步功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • 原生JS forEach()和map()遍历的区别、兼容写法及jQuery $.each、$.map遍历操作

    原生JS forEach()和map()遍历的区别、兼容写法及jQuery $.each、$.map遍历操作

    这篇文章主要介绍了原生JS forEach()和map()遍历的区别、兼容写法及jQuery $.each、$.map遍历操作,结合实例形式分析了JS使用forEach()和map()以及jQuery使用$.each、$.map进行遍历操作相关技巧与操作注意事项,需要的朋友可以参考下
    2019-02-02
  • JS截取字符串常用方法整理及使用示例

    JS截取字符串常用方法整理及使用示例

    截取字符串的方法有很多,在使用过程中根据自己的实际需求进行选择,下面整理了一些常用的方法及使用示例,感兴趣的朋友可以了解下
    2013-10-10
  • JavaScript自动内存管理与垃圾回收策略详细分析讲解

    JavaScript自动内存管理与垃圾回收策略详细分析讲解

    JS的垃圾回收机制是为了以防内存泄漏,内存泄漏的含义就是当已经不需要某块内存时这块内存还存在着,垃圾回收机制就是间歇的不定期的寻找到不再使用的变量,并释放掉它们所指向的内存。因为内存的大小是有限的,所以当内存不再需要的时候,我们需要对其进行释放
    2023-01-01
  • JS根据当天不同时间显示不同广告的代码

    JS根据当天不同时间显示不同广告的代码

    这篇文章主要介绍了JS根据当天不同的时间段显示不同广告的代码,可以精确到小时当然如果分钟都可以判断出来,需要的朋友可以参考下
    2023-02-02
  • 微信小程序实现五子棋游戏

    微信小程序实现五子棋游戏

    这篇文章主要为大家详细介绍了微信小程序实现五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • TableSort.js表格排序插件使用方法详解

    TableSort.js表格排序插件使用方法详解

    这篇文章主要为大家详细介绍了TableSort.js表格排序插件的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-02-02
  • 支持移动端原生js轮播图

    支持移动端原生js轮播图

    这篇文章主要介绍了支持移动端原生js轮播图的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-02-02
  • JavaScript如何删除对象的某个属性详析

    JavaScript如何删除对象的某个属性详析

    这篇文章主要给大家介绍了关于JavaScript如何删除对象的某个属性的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05

最新评论