기존에는 리액트 코드를 전부 다 일일이 sass
문법으로 짰었는데 일관성이 없고, 1-2명이 하는 프로젝트라서 시간상 tailwindcss
를 도입하기로 했다.
일종의 bootstrap같은 프론트 라이브러리다.
스타일을 추가할 때 마다 className
의 길이가 늘어나기 때문에 가독성이 매우 구리지만, 그것 외에는 장점이 더 많다.
Flowbite
등의 사이트에서 다양한 템플릿을 얻을 수 있다. 워낙 간단해서 공식 문서로 해결된다
참고 https://tailwindcss.com/docs/installation
tailwindcss의 컬러 말고도 내 사이트의 primary color
등을 정하고 싶다면 아래와 같이 해보자.
(참고로 리액트 설정을 동료의 도움으로 vite
로 이전했습니다)
/** @type {import('tailwindcss').Config} */
module.exports = {
content: [
"./index.html",
"./src/**/*.{js,jsx,ts,tsx}",
],
theme: {
extend: {
colors: {
'primary': '#ff6363',
'dark': '#333333',
'mint': '#17d1c2',
}
},
},
plugins: [],
}
물론 커스텀으로 등록했기 때문에 text-primary-500
처럼 뒤에 -500
등의 값이 들어가면 적용되지 않는다.
<button className="text-primary">Button</button>
결론부터 말하자면 동적 css 안된다.
참고 https://moon-ga.github.io/tailwind_css/2-dynamic-classnames/
<div className={`${true ? "text-blue-500" : ""}`}>
위 코드는 제대로 동작한다.
<div className={`text-${true ? "primary-500" : "rose-500" }`} >
띄어쓰기를 기준으로 한 단어 묶음을 쪼개서 동적으로 값을 분기처리할 수 없다는 말이다.
하지만 버튼 컴포넌트를 만들 때 color를 props
로 받아서 처리하고 싶단 말이다! 그래서 야매로 아래처럼 ts
파일을 만들었다.
type ClassType = {
[key: string]: string;
};
export const BgColors: ClassType ={
Rose: "bg-rose-500",
Blue: "bg-blue-500",
Primary: "bg-primary"
}
export const BgHoverColors: ClassType ={
Rose: "hover:bg-rose-700",
Blue: "hover:bg-blue-700",
};
export const TxtColors: ClassType ={
Rose: "text-rose-500",
Blue: "text-blue-500",
}
export const getColorByType = (color: keyof ClassType, type: string): string => {
switch(type){
case "bg":
return BgColors[color];
case "bgHover":
return BgHoverColors[color];
case "txt" :
return TxtColors[color];
default:
return BgColors[color];
}
}
color 등록은 점차 늘릴 것이고, 버튼 컴포넌트에서는 아래와 같이 사용하고 있다.
<Button
value={props.btnTxt ? props.btnTxt : "신규 바로 가기"}
color="Rose"
onClick={() => {
if (props.btnLink) window.location.href = props.btnLink;
}}
/>
/* 버튼 컴포넌트의 일부 */
return (
<button
className={
buildClass(
getColorByType(props.color, "bg"),
getColorByType(props.color, "bgHover"),
getRoundType(props.radius),
props.disabled ? "cursor-not-allowed" : "",
"text-white font-bold py-2 px-4",
props.className ? props.className : "",
)}
onClick={props.onClick}
>
{props.value}
</button>
);
이렇게 해서background-color
와 hover:background-color
도 동시 적용할 수 있었다.
tailwindcss 좋은점이 fileUploadModal
같은 것들을 무료로 소스 제공으로 가져다 쓸 수 있다는 것이다.
회사에서 긁어봤었는데 여기서도 적용해 볼 생각이다. 추후 포스팅 예정.