從ARBG到RGBA

前言

遇到一個(gè)情況,需要把客戶端用的色值A(chǔ)RBG用在前端。


錯(cuò)誤的展示

ARBG格式的顏色直接填入background是這個(gè)效果。
原因是因?yàn)椋赾ss里八位的色值為RGBA


color

hex-color

其實(shí)不看文檔也能隱隱覺得不對(duì)勁,因?yàn)樵赾hrome是這樣的
chrome里
16進(jìn)制的數(shù)值

因?yàn)?FF1A71FF的透明度是FF。
透明度越小越透明,越大越不透明。0xFF是十進(jìn)制的255,代表不透明,所以這個(gè)色值直接去掉透明度,RGB為#1A71FF


實(shí)際的顏色

ARBG到RGBA

經(jīng)過上面的分析,解法很簡(jiǎn)單了,反正css的color是支持16進(jìn)制的八位色值的,那就把AARRBBGG換成RRBBGGAA好了。

特別地

RGBA可以為4位,這樣一個(gè)字母代表一個(gè)通道。
就像#FFF代表#FFFFFF一樣,照樣用那個(gè)還沒修改的RGBA組件證實(shí)一下。


寫全

縮寫

chrome轉(zhuǎn)換的結(jié)果是完全一致的。

效果

#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="請(qǐng)輸入顏色"
        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);
      }
    }
  }
}

參考:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容