2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

react-colorで透過度を機能させる

Posted at

困っていたこと

reactでcolor-pickerを使おうとしていたときに、hexの値のみの管理だと透過度(A: alpha値)の値が更新できていなかった。

react-color
import React, { useState } from 'react';
import { ColorResult, SketchPicker } from 'react-color';

const Main: React.FC = () => {
  // state
  const [hex, setHex] = useState('');

  const handleColorChange = (color: ColorResult) => setHex(color.hex);

  return (
    <>
      <div style={{ color: `${hex}` }}>{hex}</div>
      <SketchPicker color={hex} onChange={handleColorChange} />
    </>
  );
};

export default Main;

解決策

下記のissueに解決策が上がっていました。
この問題は公式でマイルストーン3.0.0に追加されたようですがまだリリースはされていないようです。

一応color: ColorResult => color.rgb.aから透過度を取得し、16進数に変換してからcolor.hexの後に付与することでSketchPickerのalpha値にも反映されるようです。

参考: Alpha not updating・Issue #655・casesandberg/react-color

gif画像の#〇〇の文字列をみると末尾に透過度を表す16進数が追加されていることがわかります

react-color
  // Alpha値を16進数に変換する処理
  const decimalToHex = (alpha: number) =>
    alpha === 0 ? '00' : Math.round(255 * alpha).toString(16);

  const handleColorChange = (color: ColorResult) => {
    // "ff0500" + "80"の形式になるように
    const hexCode = `${color.hex}${decimalToHex(color.rgb.a || 0)}`;
    setHex(hexCode);
  };

colorスタイルでの透過度の扱い

Hex(#ff0500など)の後に更に16進数を追加してやると透過度(alpha値)を適用してくれるようです。
たとえば#ff050080(#ff0500 + 透過度50%)など

Hexadecimal notation: #RRGGBB[AA]
R (red), G (green), B (blue), and A (alpha) are hexadecimal characters (0–9, A–F). A is optional. For example, #ff0000 is equivalent to #ff0000ff.

参照: - CSS: Cascading Style Sheets | MDN

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?