見出し画像

conic-gradientを使ったパレットUIを作ってみよう

こんにちわ。nap5です。


今回はconic-gradientを使ったパレットUIの作り方の一つを紹介します。


canvaに見られるあのUIですね。


conic-gradientを使ったなにかデモを作ってみたいと思い、チャレンジしてみました。


デモサイトです。


デモコードです。


上記デモが参照できない場合はcodesandboxに配備したものを参照してくだ
さい。


デモサイトです。


デモコードです。



デモ動画です。


使用したライブラリは以下になります。




コードも公開しているので、細かいのはそちらを見ていただくことにして、ポイントとなる点を抜粋します。


const makeConicGradient = ({
  startRange,
  endRange,
  colorCount,
  offset,
  jointColor,
  colorInterpolator,
}) => {
  const angleInfo = [...samples(colorCount)].reduce(
    (acc, t, idx) => {
      const currentAngle =
        acc.prev + (endRange - startRange - offset) / colorCount;
      acc.list.push({
        color: colorInterpolator(transform([0, 1], [0.1, 0.9])(t)),
        angleFrom: acc.prev,
        angleTo: currentAngle,
      });
      acc.prev = currentAngle;
      return acc;
    },
    {prev: offset, list: []}
  );
  const minAngle = Math.min(...getDomain(angleInfo.list, 'angleFrom'));
  const maxAngle = Math.max(...getDomain(angleInfo.list, 'angleTo'));
  const resultList = [];
  resultList.push(`${jointColor} ${minAngle}deg`);
  for (let i = 0; i < angleInfo.list.length; i++) {
    const item = angleInfo.list[i];
    resultList.push(`${item.color} ${item.angleFrom}deg`);
    resultList.push(`${item.color} ${item.angleTo}deg`);
  }
  resultList.push(`${jointColor} ${maxAngle}deg`);
  return resultList.join(',');
};


使い方は以下のような感じです。

d3から提供されている関数を使った例がこちらです。

  const bebopConicGradient = makeConicGradient({
    startRange: 0,
    endRange: 320,
    colorCount: 5,
    offset: 20,
    jointColor: d3.interpolateRdYlBu(1),
    colorInterpolator: d3.interpolateRdYlBu,
  });


カスタムしたインターポレーター関数を使った例がこちらです。


color huntの配色を生かせるように心がけてみました。


const bebopColorInterpolator = (t) => {
    const info = interpolate(['#FFE3A9', '#FFC3C3', '#FF8C8C', '#FF5D5D'])(t);
    return formatHex(info);
  };
  const bebopConicGradient = makeConicGradient({
    startRange: 0,
    endRange: 320,
    colorCount: 5,
    offset: 20,
    jointColor: bebopColorInterpolator(1),
    colorInterpolator: bebopColorInterpolator,
  });


見よう見まねでやってみたんですが、なかなか難しかったですね。


それっぽいUIにはなったんじゃないでしょうか。


最近では、Twitterでモックアップ動画を公開しているので、こちらもよかったら、覗いてみてください。


最後に、Udemyでコースを公開しました。
良かったら覗いてみてください。


また、コースの内容紹介記事は以下になります。


簡単ですが、以上です。

この記事が気に入ったらサポートをしてみませんか?