在前端面试过程中,常常会遇到这样一种类型的题目:

使用js将16进制的颜色值转为rgb颜色!

反而在项目中,不怎么遇到这种问题,也很少有这种需求的项目。

但毕竟面试中常常遇到,我自己在之前的面试的时候,也遇到了这个题目,那就写一下吧,当做熟悉这个过程了!

function colorToRGB(color) {
var color1, color2, color3;
color = ""+color;
if (typeof color !== "string") return;
if (color.charAt(0) == "#") {
color = color.substring(1);
}
var not16num = color.split("").filter(function (item, index) {
return isNaN(parseInt(item, 16))
});
if(not16num.length) return;
switch (color.length) {
case 3:
color1 = color.substr(0,1);
color2 = color.substr(1,1);
color3 = color.substr(2,1);
color1 = color1 + color1;
color2 = color2 + color2;
color3 = color3 + color3;
break;
case 6:
color1 = color.substr(0,2);
color2 = color.substr(2,2);
color3 = color.substr(4,2);
break;
default:
return false;
}
color1 = parseInt(color1, 16);
color2 = parseInt(color2, 16);
color3 = parseInt(color3, 16);
return "rgb("+color1+","+color2+","+color3+")";
}

  考虑到通用性, 就定义一个colorToRGB函数吧,将16进制的颜色值当做参数传入。

  首先需要将参数转为字符串类型的,'color = ""+color;'

  检查第一个字符是否为"#", 如果第一个字符为“#”,截取“#”之后的字符,判断当前color的位数,需要考虑到色值是可以简写为3位的,如果是3位颜色值,每一位重复一次代表一个颜色,例如#fff,其实是#ffffff的简写,然后分别取得rgb三个色值:color1, color2, color3。

  到这一步之后,就没什么了,剩下的就是拼接rgb色值了。

  其中:

    var not16num = color.split("").filter(function (item, index) {
return isNaN(parseInt(item, 16))
});
if(not16num.length) return;

  这一步是检查,传入的参数是否是一个符合规范的16进制的数值,如果不是16进制数值,那后续的任何操作就没有任何意义了。

  我这里使用的方法是,把字符串全部截断,然后判断每一个字符是否为16进制数值,如果不是16进制的数字,则返回给变量not16num,如果最终not16num存在值,表示color不是一个16进制数字,则直接返回。

  虽然目的达成了,但是我始终感觉这个方法不是很好,需要再考虑。

  仔细思考一番后,自我修改:

function colorToRGB(color) {
var color1, color2, color3;
color = ""+color;
if (typeof color !== "string") return;
if (color.charAt(0) == "#") {
color = color.substring(1);
}
if (color.length == 3) {
color = color[0]+color[0]+color[1]+color[1]+color[2]+color[2];
}
if (/^[0-9a-fA-F]{6}$/.test(color)) {
color1 = parseInt(color.substr(0,2), 16);
color2 = parseInt(color.substr(2,2), 16);
color3 = parseInt(color.substr(4,2), 16);
return "rgb("+color1+","+color2+","+color3+")";
}
}

  如果是3位简写的颜色值,则修改为6位颜色值。

  利用正则对颜色值进行匹配,如果是16进制的数值,则将其转为rgb颜色值,看起来比前面的方法顺眼多了! 

将16进制的颜色转为rgb颜色的更多相关文章

  1. Java 将数字转为16进制,然后转为字符串类型

    public class ArrayTest3 { public static void main(String[] args){ System.out.println(toHex(60)); } / ...

  2. 16进制色值转换成RGB

    #51147f  转换成RGB ,5*16+1 ,1*16+4,7*16+15 #A9A9A9 转换成RGB ,A*16+9 ,A*16+9,A*16+9

  3. Java 将数字转为16进制,然后转为字符串类型 将空格去掉。终结版

    //十进制转为十六进制 public class ArrayTest7 { public static void main(String[] args){ System.out.println(toH ...

  4. JS实现rgb与16进制颜色相互转换

    1.rgb转16进制 function to16 (a) {//RGB(204,204,024) //十六进制颜色值的正则表达式 var reg = /^#([0-9a-fA-f]{3}|[0-9a- ...

  5. iOS开发-从16进制颜色中获取UIColor

    目前iOS中设置UIColor只能使用其枚举值.RGB等方法,不能直接将常用的16进制颜色值直接转为UIColor对象,所以写了点代码,将16进制颜色值转为UIColor. 代码如下, //头文件#i ...

  6. 颜色转换、随机、16进制转换、HSV

    颜色转换.随机.16进制转换.HSV: /** * * *-----------------------------------------* * | *** 颜色转换.随机.16进制转换.HSV * ...

  7. 颜色rgba、16进制、10进制互相装换

    rgba转16进制: function RGBToHex(rgb){ var regexp = /[0-9]{0,3}/g; var re = rgb.match(regexp);//利用正则表达式去 ...

  8. Java字符串转16 进制工具类Hex.java

    Java字符串转16 进制工具类Hex.java 学习了:https://blog.csdn.net/jia635/article/details/56678086 package com.strin ...

  9. Java Hex 16进制的 byte String 转换类

    package mobi.dzs.android.util; import java.util.Locale; /** * 16进制值与String/Byte之间的转换 * @author Jerry ...

随机推荐

  1. mqtt-jmeter

    mqtt-jmeter https://github.com/emqtt/mqtt-jmeter mqtt-jmeter MQTT JMeter Plugin, it's used for testi ...

  2. centos 6,7 上cgroup资源限制使用举例

    在Centos6,7使用cgroup做内存限制,使用的配置包是libcgroup,具体方案和操作步骤如下. 步骤1:安装配置管理包 Centos 6: # yum install libcgroup ...

  3. 菜鸟如何使用hanlp做分词的过程记录

    菜鸟如何使用hanlp做分词的过程记录 最近在学习hanlp的内容,准备在节后看看有没有时间整理一波hanlp分享下,应该还是会像之前分享DKHadoop一样的方式吧.把整个学习的过程中截图在配文字的 ...

  4. Qt中窗口退出事件

    窗口右上角的X按键会导致其在不给出任何提示的情况下直接退出, 当点击右上角的x按键时,会触发Qt中的一个事件处理函数:void QWidget::closeEvent ( QCloseEvent * ...

  5. 电信版华为MATE7 EMUI4.0回退3.1和3.0教程与中转包

    mate7升级6.0后遇到很多问题,想回退版本,找了很多教程,现在总结一下用中转包回退.EMUI4.0回退3.1,先下载B500中转包,将dload复制到2G以上内存卡根目录,不要三键强刷,会卡在开机 ...

  6. Pandas的使用(2)

    Pandas的使用(2) 1.新建一个空的DataFrame数据类型 total_price = pd.DataFrame() #新建一个空的DataFrame 2.向空的DataFrame中逐行添加 ...

  7. Ubuntu16.04系统重装***

    首先准备一个Live CD,就是Ubuntu的安装盘. 备份原理就是将系统文件压缩打包.由于Linux系统所有都是文件,故,只需要将系统打包即可.当然,必须除了当前系统运行中的文件以及临时文件. 打包 ...

  8. sp_who, sp_who2和sp_who3

    sp_who可以返回如下信息: (可选参数LoginName, 或active代表活动会话数)Spid         (系统进程ID)status      (进程状态)loginame  (用户登 ...

  9. SQL删除指定列的指定长度的字符

    update );

  10. [转][html5]网页横屏

    @@media screen and (orientation:portrait){ body{ transform: rotate(90deg); } } 将以上 CSS 加入网页,可以发现手机上查 ...