近期BA要求把rgba转换成16进制的颜色,所以研究了一下怎么转换,以下是转换的方法
(1)rgba -> rgb
target = opacity * overlay + (1 - opacity) * background;
// rgba(0,0,0,0.2) -> rgb(204, 204, 204) => 0 * 0.2 + (1 - 0.2) * 255
(2) rgb -> hex
function colorHex(value = {red: 255, green: 255, blue: 255, alpha: null}) {
if(!value) return '#FFFFFF';
if(typeof value !== 'object' && value.includes('#')) return value;
var sColor = [value.red.toString(),value.green.toString(),value.blue.toString()];
value = '';
sColor.map(v => {
v = parseInt(v.replace(/[^\d]/gi, ''), 10).toString(16);
value += v.length == 1 ? '0'+v : v;
}).join('');
return '#'+ value;
}
(3) hex -> rgb
function colorRgb(color) {
var reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/;
var sColor = color.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 {red: sColorChange[0], green: sColorChange[1], blue: sColorChange[2], alpha: null};
} else{
return sColor;
}
}
但是为什么要这样做呢,转换的意义在哪?搜索了许多文章都没有发现任何有价值的内容,无论转换与否都不会对性能有所影响,也没有兼容性的差异,为什么还要转换呢,在css coding standards 中发现有一句是这样的写的
Use hex color codes #000 unless using rgba().
哦,这样我就有理由做转换了。
接下来,在修改代码的时候,发现有的地方颜色是小写字母,而有的地方用的大写字母,有没有统一标准呢,于是我又调研了一下,得出以下结论,建议用大写,原因如下
(1)hex使用16进制表示,而16进制原始是大写字母编写的
(2)通用颜色软件一般颜色都是用大写字母表示,方便使用
(3)CSS 标准使用大写字母(link: https://docs.ckan.org/en/ckan-2.7.3/contributing/css.html)
终于把想到的疑问有了合理的解释,同时欢迎大家纠正补充,以下是参考链接
https://www.drupal.org/project/drupal/issues/1360790
https://docs.ckan.org/en/ckan-2.7.3/contributing/css.html
https://www.quackit.com/css/css_color_codes.cfm
https://stackoverflow.com/questions/32695983/is-there-a-reason-to-use-uppercase-letters-for-hexadecimal-css-color-values