jQuery/js实现颜色渐变

1.目的。

本来想的是 提示用户应该点某个按钮 这个功能,就想着让这个按钮div的边框变成醒目的颜色然后逐渐变白。

在网上搜了搜,本来想使用jQuery的animate,后来发现这个方法只能用来进行长度的渐变。还有就是需要下载jQuery的颜色渐变插件来实现,感觉挺麻烦的,就自己用土办法实现了。

2.原理。

先获得初始颜色的rgb,再获得终止颜色的rgb,使用rgb三个数字的差值,从初始颜色的rgb逐渐过渡到终止颜色的rgb。

3.代码。

获得颜色rgb的代码如下:

//将输入的颜色字符串转换成十进制数组
function getData(color) {
    var re = RegExp;
    if (/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i.test(color)) {
        //#rrggbb
    	return [parseInt(re.$1,16),parseInt(re.$2,16),parseInt(re.$3,16)];
    } else if (/^#([0-9a-f])([0-9a-f])([0-9a-f])$/i.test(color)) {
        //#rgb
    	return [parseInt(re.$1+re.$1,16),parseInt(re.$2+re.$2,16),parseInt(re.$3+re.$3,16)];
    } else if (/^rgb\((.*),(.*),(.*)\)$/i.test(color)) {
        //rgb(n,n,n) or rgb(n%,n%,n%)
    	if(re.$1.indexOf("%")>-1){
    		return [parseInt(parseFloat(re.$1, 10) * 2.55),
    		        parseInt(parseFloat(re.$2, 10) * 2.55),
    		        parseInt(parseFloat(re.$3, 10) * 2.55)];
    	}else{
    		 return [parseInt(re.$1),parseInt(re.$2),parseInt(re.$3)];
    	}
    }
}
方法中没有队color的验证之类的方法,见谅。传入的参数color格式可以是:"#1ba3e1"、"#f0e"、"rgb(200,50,100)"、"rgb(20%,80%,50%)"这四种格式。返回的是rgb三个数值组成的数组。

然后进行颜色的渐变:

(function($){$.fn.shade = function(prop,color1,color2,mills){
	var count = mills/200;
	var data1 = getData(color1);
	var data2 = getData(color2);
	var red = data1[0],green = data1[1],blue = data1[2];
	var r = (data2[0]-data1[0])/count,g = (data2[1]-data1[1])/count,b = (data2[2]-data1[2])/count;
	obj_temp = $(this);
	for(var i=1;i<count+1;i++){
		setTimeout("$(obj_temp).css('"+prop+"','rgb("+parseInt(red+r*i+0.5)+","+
				parseInt(green+g*i+0.5)+","+parseInt(blue+b*i+0.5)+")');", i*200);
	}
}})(jQuery);
这里我在jQuery中定义了一个shade函数 ,参数:对象渐变的属性(如border-color)、起始颜色、终止颜色、变色所需时间。我规定了200ms进行一次变色(可以自行调整),使用setTimeout函数每200ms执行一次变化。(我起初想使用while()或者递归来实现每隔一段时间执行一次变化,但js中的线程不像java中用Thread.sleep()就可以等待,所以不得不先将要运行的变色代码全部扔到setTimeout中,等待依次执行。)

代码中使用$("#more").shade("border-color","#1ba3e1","#fff",2000);就可以实现了。

ps:运行此函数需要定义一个obj_temp的全局变量。


如果运行出现BUG自行调试。。。Thanks for watching.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值