何らかのMockを作るときなど、アバターアイコンを色々配色させたいことがある。
Twitterの昔あった卵アイコンみたいなやつ。
styled-componentsとcssのhue-rotateを利用すると雑にpng一枚用意するだけで出来る。
「SVGでやったほうがいいんだけどちょっとだるい」みたいなときにおすすめ。
実装とか色々考えると圧倒的にsvgとかでやったほうがいいので繋ぎの手段としてどうぞ。
あと今回はstyled-componentsでやっているが、CSSの機能なのでsassとかでも出来るはず。
styled-components使うことで動的に処理できるという点が旨味
実装
で、こんな具合に実装。
import React, { Component } from "react";
import icon from "./icon.png";
import styled from "styled-components";
const randomAngle = () => {
const num = 7; // ランダムに出したい色数
return (Math.ceil(Math.random() * num) * 360) / num;
};
// ここでhue-rotate使う
const MockAvater = styled.img`
filter: hue-rotate(${() => `${randomAngle()}deg`});
`;
class App extends Component {
render() {
return (
<div className="App">
<MockAvater src={icon} width="80" />
</div>
);
}
}
もし「色数は変数を渡したい」みたいな場合であればこんな感じ
const getAngle = (idx, max) => {
console.log(idx);
return (360 * idx) / max;
};
const MockAvaterManual = styled.img`
filter: hue-rotate(${({ idx, max }) => `${getAngle(idx, max)}deg`});
`;
class App extends Component {
render() {
return (
<MockAvaterManual src={icon} width="80" max={8} idx={0} />
)
}
}