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 相关文章推荐
jquery插件corner实现圆角边框的方法
Mar 09 Javascript
简介JavaScript中的italics()方法的使用
Jun 08 Javascript
javascript实现的淘宝旅行通用日历组件用法实例
Aug 03 Javascript
js和jquery实现监听键盘事件示例代码
Jun 24 Javascript
瀑布流的实现方式(原生js+jquery+css3)
Jun 28 Javascript
jQuery实现日期联动效果实例
Jul 26 Javascript
jQuery 插件封装的方法
Nov 16 Javascript
写jQuery插件时的注意点
Feb 20 Javascript
webpack 4.0.0-beta.0版本新特性介绍
Feb 10 Javascript
浅谈VUE-CLI脚手架热更新太慢的原因和解决方法
Sep 28 Javascript
JavaScript创建对象方式总结【工厂模式、构造函数模式、原型模式等】
Dec 19 Javascript
Vue 简单实现前端权限控制的示例
Dec 25 Vue.js
详解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
WindowsXP中快速配置Apache+PHP5+Mysql
2008/06/05 PHP
PHP MYSQL实现登陆和模糊查询两大功能
2016/02/05 PHP
php利用header函数下载各种文件
2016/08/24 PHP
PHP实现的文件操作类及文件下载功能示例
2016/12/24 PHP
PHP使用strrev翻转中文乱码问题的解决方法
2017/01/13 PHP
javascript中的startWith和endWith的几种实现方法
2013/05/07 Javascript
JavaScript—window对象使用示例
2013/12/09 Javascript
jquery悬浮提示框完整实例
2016/01/13 Javascript
IE下JS保存图片的简单实例
2016/07/15 Javascript
jQuery实现日期联动效果实例
2016/07/26 Javascript
js事件冒泡、事件捕获和阻止默认事件详解
2016/08/04 Javascript
HTML5基于Tomcat 7.0实现WebSocket连接并实现简单的实时聊天
2016/10/31 Javascript
JavaScript DOM节点操作实例小结(新建,删除HTML元素)
2017/01/19 Javascript
ES6新特性之模块Module用法详解
2017/04/01 Javascript
AngularJS点击添加样式、点击变色设置的实例代码
2017/07/27 Javascript
react-router v4如何使用history控制路由跳转详解
2018/01/09 Javascript
vue项目中使用vue-i18n报错的解决方法
2019/01/13 Javascript
js实现一个页面多个倒计时的3种方法
2019/02/25 Javascript
[01:10:49]Secret vs VGJ.S 2018国际邀请赛淘汰赛BO3 第二场 8.24
2018/08/25 DOTA
对python中的logger模块全面讲解
2018/04/28 Python
使用Selenium破解新浪微博的四宫格验证码
2018/10/19 Python
Python 调用PIL库失败的解决方法
2019/01/08 Python
python twilio模块实现发送手机短信功能
2019/08/02 Python
python实现音乐播放器 python实现花框音乐盒子
2020/02/25 Python
python+django+selenium搭建简易自动化测试
2020/08/19 Python
Amcal中文官网:澳洲综合性连锁药房
2019/03/28 全球购物
UNIX文件系统分类
2014/11/11 面试题
数控专业毕业生求职信范文
2013/09/21 职场文书
考试诚信承诺书
2014/05/23 职场文书
党建工作经验交流材料
2014/05/25 职场文书
宿舍标语大全
2014/06/19 职场文书
争先创优个人总结
2015/03/04 职场文书
护士2015年终工作总结
2015/04/29 职场文书
PHP连接MSSQL数据库案例,PHPWAMP多个PHP版本连接SQL Server数据库
2021/04/16 PHP
Vertica集成Apache Hudi重磅使用指南
2022/03/31 Servers
如何通过一篇文章了解Python中的生成器
2022/04/02 Python