react-konvaをCSS風にカスタマイズする

2 min read読了の目安(約1900字

reactでcanvasを扱う

いくつかやり方はあると思いますが、今回はreact-konvaを使ってみます。
react-konva

何でcanvas?

パワプロ風画面ジェネレータというものを作っています。データベースにデータを保存してpuppeteerでスクリーンショット撮ってOGPにしているのですが、リニューアルでブラウザ上で画像を保存できるようにしようと思ってcanvas触り始めました。

react-konvaをCSS風にカスタマイズしてみる

canvasは基本的に絶対座標なので、propsにx,yを定義するほか、

border付きの四角形コンポーネント

  • borderColor
  • borderWidth
  • height
  • width
  • fillColor(塗り潰し色)
  • rotation(回転角度を定義する)
  • offset(回転の中心を定義する)
import { Vector2d } from "konva/types/types";
import { Line } from "react-konva";

type props={
    borderColor: string,
    x: number,
    y: number,
    borderWidth: number,
    width:number,
    height:number,
    fillColor?:string,
    rotation: number,
    offset?:Vector2d
}

const BorderBox:React.FC<props>=({borderColor, x, y, borderWidth, height, width, fillColor, rotation, offset})=>{
    return(
        <Line
          x={x}
          y={y}
          points={[0, 0, 0, height, width, height, width, 0]}
          tension={0}
          closed
          stroke={borderColor}
          strokeWidth={borderWidth}
          fill={fillColor ? fillColor :null}
          rotation={rotation}
          offset={offset}
        />
    )
}

export default BorderBox;

グラデーション付きの四角形コンポーネント

import { ReactText } from "react";
import { Rect } from "react-konva";

type props = {
  width: number;
  height: number;
  x: number;
  y: number;
  gradientColor: ReactText[];
  boxShadow?:number;
};

const GradientBox: React.FC<props> = ({
  width,
  height,
  x,
  y,
  gradientColor,
  boxShadow
}) => {
  return (
    <Rect
      width={width}
      height={height}
      x={x}
      y={y}
      fillLinearGradientStartPoint={{ x: 0, y: 0 }}
      fillLinearGradientEndPoint={{ x: 0, y: height }}
      fillLinearGradientColorStops={gradientColor}
      shadowBlur={boxShadow}
    />
  );
};
export default GradientBox;

終わりに

普段使い慣れていないcanvas周りもCSS風にカスタマイズすると使いやすくなります。