JS面试手写:颜色转换

473 阅读2分钟

如何用js随机生成一个16进制的颜色值呢?

如何实现16进制的颜色值和RGB/RGBA颜色进行相互转换呢?

随机生成16进制颜色值

function getRandomColor{
    var str="#";
    var arr=["0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"];
    for(var i=0;i<6;i++){
        // random函数生成的是0-1不包括1的数
        var num=parseInt(Math.random()*16);
        str+=arr[num];
    }
    return str;
}

十六进制颜色值转RGB颜色值

function hexToRgb(val) {
  //HEX十六进制颜色值转换为RGB(A)颜色值
  // 16进制颜色值的正则
  var reg = /^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/;
  // 把颜色值变成小写
  var color = val.toLowerCase();
  var result = '';
  if (reg.test(color)) {
    // 如果只有三位的值,需变成六位,如:#fff => #ffffff
    if (color.length === 4) {
      var colorNew = '#';
      for (var i = 1; i < 4; i += 1) {
        colorNew += color.slice(i, i + 1).concat(color.slice(i, i + 1));
      }
      color = colorNew;
    }
    // 处理六位的颜色值,转为RGB
    var colorChange = [];
    for (var i = 1; i < 7; i += 2) {
      colorChange.push(parseInt('0x' + color.slice(i, i + 2)));
    }
    result = 'rgb(' + colorChange.join(',') + ')';
    return { rgb: result, r: colorChange[0], g: colorChange[1], b: colorChange[2] };
  } else {
    result = '无效';
    return { rgb: result };
  }
}

RGB/RGBA颜色值转十六进制颜色值

function rgbToHex(val) {
  //RGB(A)颜色转换为HEX十六进制的颜色值
  let r,g,b,a
  let regRgba = /rgba?\((\d{1,3}),(\d{1,3}),(\d{1,3})(,([.\d]+))?\)/, //判断rgb颜色值格式的正则表达式,如rgba(255,20,10,.54)
  
  // replace过滤掉字符串中多余的空格
  // match返回一个数组或null,匹配成功返回regRgba对val的匹配结果数组,匹配失败返回null
  // 比如字符串rgba(255,20,10,.54),如果匹配成功,返回:['rgba(255,20,10,.54)','255','20','10',',.54','.54',index:0,input:'rgba(255,20,10,.54)',groups:undefined]
  rsa = val.replace(/\s+/g, '').match(regRgba);

  // 如果匹配成功
  if (!!rsa) {
    r = parseInt(rsa[1]).toString(16);
    // 长度是1则前面补0,将长度补全为2位
    r = r.length == 1 ? '0' + r : r;
    g = parseInt(rsa[2]).toString(16);
    g = g.length == 1 ? '0' + g : g;
    b = parseInt(rsa[3]).toString(16);
    b = b.length == 1 ? '0' + b : b;
    // +作用可以理解为:Number(value),将括号内的变量转换为Number类型
    a = +(rsa[5] ? rsa[5] : 1) * 100;
    return { hex: '#' + r + g + b, r: parseInt(r, 16), g: parseInt(g, 16), b: parseInt(b, 16), alpha: Math.ceil(a) };
  } else {
    return { hex: '无效', alpha: 100 };
  }
}