vue 【颜色处理】输入色值,自动处理输出更浅的颜色,可用作背景色

文章详细介绍了如何使用JavaScript处理颜色,包括十六进制颜色值的解析,通过HSL模型调整饱和度和明度,以及RGB和HSL之间的转换方法。
摘要由CSDN通过智能技术生成

如截图,输入文字颜色色值,函数自动处理,输出背景色。

颜色方向:饱和度更低,明度更高

处理思路:十六进制的色值,前两位代表红色,3-4为代表绿色,最后2位代表蓝色。是处理后的RGB模式色值。

具体方法

// 获取更浅颜色
    setTheme() {
     // const lighterColor = this.lighten(处理前的色值, 降低的饱和度, 增加的明度);
      const lighterColor = this.lighten(409EFF, 0.5, 0.3);
    },

调整颜色的方法

// 调整颜色
    lighten(hex, saturationDecrease, lightnessDecrease) {
      // 解析十六进制颜色值
      const r = parseInt(hex.substring(1, 3), 16);
      const g = parseInt(hex.substring(3, 5), 16);
      const b = parseInt(hex.substring(5, 7), 16);

      // 转换为 HSL 格式
      let hslColor = this.rgbToHsl(r, g, b);

      // 减少饱和度和明度
      hslColor[1] = Math.max(0, hslColor[1] - saturationDecrease);
      hslColor[2] = Math.max(0, hslColor[2] + lightnessDecrease);

      // 转换回 RGB 格式
      let rgbColor = this.hslToRgb(hslColor[0], hslColor[1], hslColor[2]);

      // 转换为十六进制颜色值
      const darkenedHex = this.rgbToHex(rgbColor[0], rgbColor[1], rgbColor[2]);

      return darkenedHex;
    },

颜色的转换


    // 将 RGB 颜色值转换为 HSL 格式
    rgbToHsl(r, g, b) {
      (r /= 255), (g /= 255), (b /= 255);
      const max = Math.max(r, g, b),
        min = Math.min(r, g, b);
      let h,
        s,
        l = (max + min) / 2;

      if (max === min) {
        h = s = 0; // achromatic
      } else {
        const d = max - min;
        s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
        switch (max) {
          case r:
            h = (g - b) / d + (g < b ? 6 : 0);
            break;
          case g:
            h = (b - r) / d + 2;
            break;
          case b:
            h = (r - g) / d + 4;
            break;
        }
        h /= 6;
      }

      return [h, s, l];
    },
    // 将 HSL 颜色值转换为 RGB 格式
    hslToRgb(h, s, l) {
      let r, g, b;

      if (s === 0) {
        r = g = b = l; // achromatic
      } else {
        const hue2rgb = function hue2rgb(p, q, t) {
          if (t < 0) t += 1;
          if (t > 1) t -= 1;
          if (t < 1 / 6) return p + (q - p) * 6 * t;
          if (t < 1 / 2) return q;
          if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;
          return p;
        };

        const q = l < 0.5 ? l * (1 + s) : l + s - l * s;
        const p = 2 * l - q;
        r = hue2rgb(p, q, h + 1 / 3);
        g = hue2rgb(p, q, h);
        b = hue2rgb(p, q, h - 1 / 3);
      }

      return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)];
    },
    // 将 RGB 颜色值转换为十六进制格式
    rgbToHex(r, g, b) {
      return "#" + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1);
    },

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值