js实现颜色阶梯渐变效果(Gradient算法)


Posted in Javascript onMarch 21, 2017

html中颜色可以使用rgb和hex方式来表示。

在色彩中,色相、明度、纯度也都可以产生渐变效果,并会表现出具有丰富层次的美感。本文主要讲述两种颜色RGB数值的梯级渐变算法。

其中如如16进制颜色如#336600分别表示rgb模式中r的值为16进制33(即),g的值为16进制的66,和b为16进制的00,转换后用rgb完整表述为:rgb(51,102,0)。

其中使用16进制进行加减乘除不方便,尤其还使用了rgb的16进制颜色组合(#336600)。因此我们可以将16进制转换为rgb单个进行梯级运算在进行组合。

已知:RStart=50,REnd=200,RStart、REnd之间平均分成3份(Step=3),求每份的数值(StepN)分别是多少。

公式:Gradient = RStart+ (REnd-RStart) / Step * N (第N步的颜色rgb中R的值)

实现方法非常简单,只是需要将颜色从rgb到hex的互转。

实现代码:

<script type="text/javascript">
 /*
 // 作者 yanue
 // 参数:
 // startColor:开始颜色hex
 // endColor:结束颜色hex
 // step:几个阶级(几步)
 */
 function gradientColor(startColor,endColor,step){
  startRGB = this.colorRgb(startColor);//转换为rgb数组模式
  startR = startRGB[0];
  startG = startRGB[1];
  startB = startRGB[2];
  endRGB = this.colorRgb(endColor);
  endR = endRGB[0];
  endG = endRGB[1];
  endB = endRGB[2];
  sR = (endR-startR)/step;//总差值
  sG = (endG-startG)/step;
  sB = (endB-startB)/step;
  var colorArr = [];
  for(var i=0;i<step;i++){
  //计算每一步的hex值 
   var hex = this.colorHex('rgb('+parseInt((sR*i+startR))+','+parseInt((sG*i+startG))+','+parseInt((sB*i+startB))+')');
   colorArr.push(hex);
  }
  return colorArr;
 }
 // 将hex表示方式转换为rgb表示方式(这里返回rgb数组模式)
 gradientColor.prototype.colorRgb = function(sColor){
  var reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/;
  var sColor = sColor.toLowerCase();
  if(sColor && reg.test(sColor)){
   if(sColor.length === 4){
    var sColorNew = "#";
    for(var i=1; i<4; i+=1){
     sColorNew += sColor.slice(i,i+1).concat(sColor.slice(i,i+1));
    }
    sColor = sColorNew;
   }
   //处理六位的颜色值
   var sColorChange = [];
   for(var i=1; i<7; i+=2){
    sColorChange.push(parseInt("0x"+sColor.slice(i,i+2)));
   }
   return sColorChange;
  }else{
   return sColor;
  }
 };
 // 将rgb表示方式转换为hex表示方式
 gradientColor.prototype.colorHex = function(rgb){
  var _this = rgb;
  var reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/;
  if(/^(rgb|RGB)/.test(_this)){
   var aColor = _this.replace(/(?:(|)|rgb|RGB)*/g,"").split(",");
   var strHex = "#";
   for(var i=0; i<aColor.length; i++){
    var hex = Number(aColor[i]).toString(16);
    hex = hex<10 ? 0+''+hex :hex;// 保证每个rgb的值为2位
    if(hex === "0"){
     hex += hex;
    }
    strHex += hex;
   }
   if(strHex.length !== 7){
    strHex = _this;
   }
   return strHex;
  }else if(reg.test(_this)){
   var aNum = _this.replace(/#/,"").split("");
   if(aNum.length === 6){
    return _this;
   }else if(aNum.length === 3){
    var numHex = "#";
    for(var i=0; i<aNum.length; i+=1){
     numHex += (aNum[i]+aNum[i]);
    }
    return numHex;
   }
  }else{
   return _this;
  }
 }
 var gradient = new gradientColor('#013548','#554851',10);
 console.log(gradient);//控制台输出
 alert(gradient);
</script>

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
IE7提供XMLHttpRequest对象为兼容
Mar 08 Javascript
Mootools 1.2教程 正则表达式
Sep 15 Javascript
浅析jQuery的链式调用之each函数
Dec 03 Javascript
js中的referrer返回上一页使用介绍
Sep 26 Javascript
js实现点击左右按钮轮播图片效果实例
Jan 29 Javascript
图解js图片轮播效果
Dec 20 Javascript
js小数计算小数点后显示多位小数的实现方法
May 30 Javascript
浅谈json取值(对象和数组)
Jun 24 Javascript
jQuery EasyUI 右键菜单--关闭标签/选项卡的简单实例
Oct 10 Javascript
微信小程序实现音乐播放器
Nov 20 Javascript
详解React 条件渲染
Jul 08 Javascript
JavaScript TAB栏切换效果的示例
Nov 05 Javascript
详解Vue 实例中的生命周期钩子
Mar 21 #Javascript
十大热门的JavaScript框架和库
Mar 21 #Javascript
Bootstrap 设置datetimepicker在屏幕上面弹出设置方法
Mar 21 #Javascript
js中编码函数:escape,encodeURI与encodeURIComponent详解
Mar 21 #Javascript
Omi v1.0.2发布正式支持传递javascript表达式
Mar 21 #Javascript
jQuery插件HighCharts绘制简单2D柱状图效果示例【附demo源码】
Mar 21 #jQuery
jQuery插件HighCharts绘制简单2D折线图效果示例【附demo源码】
Mar 21 #jQuery
You might like
探讨php中防止SQL注入最好的方法是什么
2013/06/10 PHP
php实现的漂亮分页方法
2014/04/17 PHP
thinkphp autoload 命名空间自定义 namespace
2015/07/17 PHP
Yii2使用swiftmailer发送邮件的方法
2016/05/03 PHP
详解关于php的xdebug配置(编辑器vscode)
2019/01/29 PHP
Avengerls vs Newbee BO3 第三场2.18
2021/03/10 DOTA
NodeJS url验证(url-valid)的使用方法
2013/11/18 NodeJs
js对象继承之原型链继承实例
2015/01/10 Javascript
JS面试题---关于算法台阶的问题
2016/07/26 Javascript
seajs学习教程之基础篇
2016/10/20 Javascript
JQuery Ajax WebService传递参数的简单实例
2016/11/02 Javascript
利用Angularjs中模块ui-route管理状态的方法
2016/12/27 Javascript
Canvas + JavaScript 制作图片粒子效果
2017/02/08 Javascript
jQuery ajax请求struts action实现异步刷新
2017/04/19 jQuery
Ionic学习日记实现验证码倒计时
2018/02/08 Javascript
原生js实现拖拽功能基本思路详解
2018/04/18 Javascript
详细介绍解决vue和jsp结合的方法
2020/02/06 Javascript
基于canvas实现手写签名(vue)
2020/05/21 Javascript
微信小程序中target和currentTarget的区别小结
2020/11/06 Javascript
[01:45]2014DOTA2 TI预选赛预选赛 大神专访第二弹!
2014/05/20 DOTA
[37:22]DOTA2上海特级锦标赛D组资格赛#2 Liquid VS VP第一局
2016/02/28 DOTA
Python如何实现守护进程的方法示例
2017/02/08 Python
解决Python pandas df 写入excel 出现的问题
2018/07/04 Python
python使用opencv对图像mask处理的方法
2019/07/05 Python
基于 Django 的手机管理系统实现过程详解
2019/08/16 Python
windows10环境下用anaconda和VScode配置的图文教程
2020/03/30 Python
HTML5 File API改善网页上传功能
2009/08/19 HTML / CSS
中学生学习生活的自我评价
2013/10/26 职场文书
怎样客观的做好自我评价
2013/12/28 职场文书
上班离岗检讨书
2014/01/27 职场文书
幼儿园中班上学期评语
2014/04/18 职场文书
中国梦演讲稿3分钟
2014/08/19 职场文书
习总书记三严三实学习心得体会
2014/10/13 职场文书
2014-2015学年工作总结
2014/11/27 职场文书
2014年信息宣传工作总结
2014/12/18 职场文书
java中如何截取字符串最后一位
2022/07/07 Java/Android