zoukankan      html  css  js  c++  java
  • 十六进制透明颜色 转换成 RGBA 颜色(腾讯地图 与 微信地图组件所需颜色格式不同)

    情况说明

    之前写了个小程序项目,后来客户要想把它对接到浙里办、浙政钉上,就需要将其改成 h5 应用,这过程可以说是成堆成堆的问题(好在基本都找到了替代方案,遇到的问题也都顺利解决了,没有卡太久...)

    小程序转 h5,那之前用的地图组件肯定就不能用了,得另寻他路,下面就是用腾讯地图替代地图组件遇到的问题之一:填充颜色格式不兼容

    想当初把颜色搞成十六进制带透明还花了点心思的...现在???

    在这里插入图片描述

    原因

    写微信小程序的时候,颜色得用十六进制加透明度表示...

    而转到腾讯地图 JS API 的时候,颜色不支持十六进制透明度...

    小程序文档

    在这里插入图片描述

    腾讯地图 JS API

    在这里插入图片描述

    腾讯地图 JS API 使用十六进制颜色会报错...

    在这里插入图片描述

    网上搜的在线工具多半是 十六进制颜色转 rgb 颜色的,并不能附带透明度

    手动加上透明度出来的颜色会有偏差

    • 偏差部分是透明度那几位,然后对照颜色表再转换回 rgba 里的 a 透明度,会比较繁琐
    • 直接一点一点的调 rgba 的 a 透明度也会比较麻烦
    • 你可以使用下面这个方法来转换颜色,会更加直观些(可以看看我提供的案例,你就能了解怎么用、有什么特别的地方了)

    十六进制颜色转RGBA颜色 实现方案

    定义一个工具函数用来做颜色转换

    let changeHexToRgba = (str, alpha = 1) => {
      const REGCOLOR = /^#([A-Fa-f0-9]{3}|[A-Fa-f0-9]{6}|[A-Fa-f0-9]{8})$/;
      const ISRGBA = REGCOLOR.test(str);
      if (ISRGBA === false) {
        throw Error("颜色参数不合法");
      }
      const ISALPHA = typeof parseFloat(alpha) == "number" && parseFloat(alpha) <= 1 && parseFloat(alpha) >= 0
      if (ISALPHA == false) {
        throw Error("透明度参数不合法");
      }
      // 去掉#号  
      const colorStr = str.slice(1);
      const len = colorStr.length;
      if (len === 3) {
        const color = colorStr
        .split("")
        .map(ele => parseInt(`0x${ele.repeat(2)}`))
        .join(",");
        return `rgba(${color},${alpha})`;
      }
      const color = colorStr
      .match(/[A-z0-9]{2}/g)
      .map(ele => parseInt(`0x${ele}`));
      if (len === 6) {
        return `rgba(${color.join(",")},${alpha})`;
      }
      if (len === 8) {
        const opacity = (color.pop() / 255).toFixed(2);
        return `rgba(${color.slice(0, 3).join(",")}, ${opacity})`;
      }
    }
    

    使用案例

    /* 十六进制带透明度的颜色传入透明度参数 alpha 不会生效,会自动转换十六进制颜色中的透明度  */
    changeHexToRgba("#c7826073", 0.6)
    // "rgba(199,130,96, 0.45)"
    
    /* 十六进制带透明度的颜色会自动转换为 rgba 值,透明度也会转换,无需传入透明度参数 */
    changeHexToRgba("#c7826073")
    // "rgba(199,130,96, 0.45)"
    
    /* 十六进制无透明度颜色如果不传透明度参数,会自动采用默认值1 为不透明 */
    changeHexToRgba("#c78263")
    // "rgba(199,130,99,1)"
    
    /* 十六进制无透明度颜色如果传入透明度参数,则会采用传入的数值作为透明度 */
    changeHexToRgba("#c78263", 0.5)
    // "rgba(199,130,99,0.5)"
    
    /* 也可以支持十六进制颜色简写 */
    changeHexToRgba("#fff", 0.5)
    // "rgba(255,255,255,0.5)"
    changeHexToRgba("#000", 0.5)
    // "rgba(0,0,0,0.5)"
    
    /* 传入的透明度参数 alpha 需要大于等于0,且小于等于1,否则会报错 */
    changeHexToRgba("#000", "1.2")
    /*
    Uncaught Error: 透明度参数不合法
        at changeHexToRgba (<anonymous>:9:13)
        at <anonymous>:1:1
        */
    /* 传入的透明度参数 alpha 可以是 0-1 的数字,也可以是值为 0-1 的字符串 */
    changeHexToRgba("#000", "0.2")
    // "rgba(0,0,0,0.2)"
    
  • 相关阅读:
    数字全排列
    Nginx与HAProxy的区别
    Ceph RBD 的实现原理与常规操作
    pxc挂了一个节点怎么办
    AWTK javascript绑定原理
    雷电网络更新:迈向 Ithaca
    Chorus.one:Loom Network 项目前景 & 质押收益
    隐密交易的到来:深入 AZTEC 协议
    技术开发中一些名词解释
    技术开发中一些名词解释
  • 原文地址:https://www.cnblogs.com/suwanbin/p/15177356.html
Copyright © 2011-2022 走看看