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 相关文章推荐
cssQuery()的下载与使用方法
Jan 12 Javascript
jquery ajax例子返回值详解
Sep 11 Javascript
JavaScript四种调用模式和this示例介绍
Jan 02 Javascript
21个JavaScript事件(Events)属性汇总
Dec 02 Javascript
jQuery+AJAX实现无刷新下拉加载更多
Jul 03 Javascript
js删除数组元素、清空数组的简单方法(必看)
Jul 27 Javascript
简单模拟node.js中require的加载机制
Oct 27 Javascript
原生JS实现圣旨卷轴展开效果
Mar 06 Javascript
解决vue打包css文件中背景图片的路径问题
Sep 03 Javascript
redux.js详解及基本使用
May 24 Javascript
JavaScript学习教程之cookie与webstorage
Jun 23 Javascript
详解javascript void(0)
Jul 13 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
我的群发邮件程序
2006/10/09 PHP
php将时间差转换为字符串提示
2011/09/07 PHP
apache php模块整合操作指南
2012/11/16 PHP
ini_set的用法介绍
2014/01/07 PHP
php去掉URL网址中带有PHPSESSID的配置方法
2014/07/08 PHP
PHP生成网站桌面快捷方式代码分享
2014/10/11 PHP
js实现用户注册协议倒计时的方法
2015/01/21 Javascript
JavaScript用select实现日期控件
2015/07/17 Javascript
JavaScript  event对象整理及详细介绍
2016/10/10 Javascript
EasyUI 中combotree 默认不能选择父节点的实现方法
2016/11/07 Javascript
nodejs模块nodemailer基本使用-邮件发送示例(支持附件)
2017/03/28 NodeJs
JavaScript设计模式之代理模式详解
2017/06/09 Javascript
Vue Socket.io源码解读
2018/02/07 Javascript
基于iScroll实现内容滚动效果
2018/03/21 Javascript
React Native中Mobx的使用方法详解
2018/12/04 Javascript
vue基于better-scroll仿京东分类列表
2020/06/30 Javascript
python数据结构之二叉树的统计与转换实例
2014/04/29 Python
简单掌握Python中glob模块查找文件路径的用法
2016/07/05 Python
对Django 转发和重定向的实例详解
2019/08/06 Python
python获取Pandas列名的几种方法
2019/08/07 Python
Python 序列化和反序列化库 MarshMallow 的用法实例代码
2020/02/25 Python
基于SpringBoot构造器注入循环依赖及解决方式
2020/04/26 Python
python 基于卡方值分箱算法的实现示例
2020/07/17 Python
scrapy-splash简单使用详解
2021/02/21 Python
MIRTA官网:手工包,100%意大利制造
2020/02/11 全球购物
什么是虚拟内存?虚拟内存有什么优势?
2012/02/19 面试题
数学系毕业生的自我评价
2014/01/10 职场文书
最经典的商业地产项目广告词
2014/03/13 职场文书
本科毕业生自荐信
2014/06/02 职场文书
婚礼新人答谢词
2015/01/04 职场文书
考博导师推荐信范文
2015/03/27 职场文书
2015年初一班主任工作总结
2015/05/13 职场文书
经费申请报告
2015/05/15 职场文书
css3 利用transform-origin 实现圆点分布在大圆上布局及旋转特效
2021/04/29 HTML / CSS
ztree+ajax实现文件树下载功能
2021/05/18 Javascript
一文弄懂MySQL中redo log与binlog的区别
2022/02/15 MySQL