美文网首页
从ARBG到RGBA

从ARBG到RGBA

作者: 景阳冈大虫在此 | 来源:发表于2022-09-18 10:47 被阅读0次

    前言

    遇到一个情况,需要把客户端用的色值ARBG用在前端。


    错误的展示

    ARBG格式的颜色直接填入background是这个效果。
    原因是因为,在css里八位的色值为RGBA


    color
    hex-color
    其实不看文档也能隐隐觉得不对劲,因为在chrome是这样的 chrome里 16进制的数值

    因为#FF1A71FF的透明度是FF。
    透明度越小越透明,越大越不透明。0xFF是十进制的255,代表不透明,所以这个色值直接去掉透明度,RGB为#1A71FF


    实际的颜色

    ARBG到RGBA

    经过上面的分析,解法很简单了,反正css的color是支持16进制的八位色值的,那就把AARRBBGG换成RRBBGGAA好了。

    特别地

    RGBA可以为4位,这样一个字母代表一个通道。
    就像#FFF代表#FFFFFF一样,照样用那个还没修改的RGBA组件证实一下。


    写全
    缩写

    chrome转换的结果是完全一致的。

    效果

    #FF1A71FF

    修改透明度


    #1F1A71FF

    代码

    /* eslint-disable react/no-array-index-key */
    import { Input } from 'antd';
    import { useMemo } from 'react';
    import $styles from './style.module.less';
    
    interface PropsType {
      onChange?: () => void;
      value?: string;
    }
    
    /** 用于输入颜色的Input  */
    export default function (props: PropsType) {
      const { value = '', onChange } = props;
      const maskColor = useMemo(() => {
        if (!value && value.length !== 9 && value.length !== 5) return '';
        if (value.length === 5) {
          return `#${value[2]}${value[3]}${value[4]}${value[1]}`;
        }
        if (value.length === 9) {
          return `#${value[3]}${value[4]}${value[5]}${value[6]}${value[7]}${value[8]}${value[1]}${value[2]}`;
        }
        return value;
      }, [value]);
    
      return (
        <div className={$styles.ColorInput}>
          <Input
            placeholder="请输入颜色"
            value={value}
            onChange={onChange}
            style={{
              width: '100px',
              borderBottom: '1px solid #eee',
              marginRight: '5px',
            }}
            bordered={false}
          />
          <div className={$styles.colorArea} >
            <div className={$styles.mask} style={{ background: maskColor }} />
            {value && Array(25).fill(0).map((_, key) => <div className={$styles.square} key={key} />)}
          </div>
        </div>
      );
    }
    
    
    // style.module.less
    .ColorInput {
      display: flex;
    
      .colorArea {
        position: relative;
        width: 30px;
        height: 30px;
        border: 1px solid #eee;
        border-radius: 9px;
        display: flex;
        flex-wrap: wrap;
        overflow: hidden;
    
        .mask {
          position: absolute;
          top: 0;
          left: 0;
          width: 100%;
          height: 100%;
    
        }
    
        .square {
          width: 20%;
          height: 20%;
    
          &:nth-child(odd) {
            background: rgba(0, 0, 0, 0.15);
          }
        }
      }
    }
    
    

    参考:

    相关文章

      网友评论

          本文标题:从ARBG到RGBA

          本文链接:https://www.haomeiwen.com/subject/bscportx.html