/app/ui
폴더 내부를 보면, global.css
파일이 존재한다. 이 파일을 사용하여 HTML 요소에 대한 사이트 전체 스타일과 관련된 CSS 규칙을 애플리케이션의 모든 경로에 적용할 수 있다.
/app/layout.tsx
경로에 아래와 같이 global.css를 import하여, 애플리케이션에 전역 스타일을 추가할수 있다.
import "@/app/ui/global.css";
export default function RootLayout({
children,
}: {
children: React.ReactNode;
}) {
return (
<html lang="en">
<body>{children}</body>
</html>
);
}
결과
<h1 className="text-blue-500">I'm Blue</h1>
/app/page.tsx
파일도 잘 확인해 보면, 이러한 tailwind css가 적용된 모습을 볼 수 있다.import AcmeLogo from '@/app/ui/acme-logo';
import Link from 'next/link';
export default function Page() {
return (
<main className="flex min-h-screen flex-col p-6">
<div className="flex h-20 shrink-0 items-end rounded-lg bg-blue-500 p-4 md:h-52">
{/* <AcmeLogo /> */}
</div>
<div className="mt-4 flex grow flex-col gap-4 md:flex-row">
<div className="flex flex-col justify-center gap-6 rounded-lg bg-gray-50 px-6 py-10 md:w-2/5 md:px-20">
<p className={`text-xl text-gray-800 md:text-3xl md:leading-normal`}>
<strong>Welcome to Acme.</strong> This is the example for the{' '}
<a href="https://nextjs.org/learn/" className="text-blue-500">
Next.js Learn Course
</a>
, brought to you by Vercel.
</p>
<Link
href="/login"
className="flex items-center gap-5 self-start rounded-lg bg-blue-500 px-6 py-3 text-sm font-medium text-white transition-colors hover:bg-blue-400 md:text-base"
>
<span>Log in</span>
</Link>
</div>
<div className="flex items-center justify-center p-6 md:w-3/5 md:px-28 md:py-12">
{/* Add Hero Images Here */}
</div>
</div>
</main>
);
}
[파일명]_[클래스명]_[해시값]
형태로 만들기 때문에, CSS 클래스명이 서로 중첩되지 않는다./app/ui
경로에 home.module.css
파일을 아래와 같이 만든다..shape {
height: 0;
width: 0;
border-bottom: 30px solid black;
border-left: 20px solid transparent;
border-right: 20px solid transparent;
}
/app/page.tsx
파일에서 import한 후, class를 아래와 같이 선언하면 CSS가 적용된다. import styles from "./ui/home.module.css";
export default function Page() {
return <div className={styles.shape}></div>;
}
React를 사용하면서 개발을 진행하다보면, 특정 상태(state)에 따라, className을 수정, 삭제, 추가하는 경우가 굉장히 많다.
이 때, 깔끔하게 className을 추가하거나 삭제하는 데 도움을 주는 라이브러리가 있는데, 이것이 지금 살펴볼 clsx이다.
만약, 아래와 같이 let status = "pending"
이라는 변수와 값이 있다고 하자. 그리고, status
값에 따라, 적용하고자 하는 클래스명을 다르게 하고자 한다면, 아래처럼 clsx를 사용해볼 수 있다.
status === "pending"
이면, className="bg-gray-100 text-gray-500"
status === "paid"
이면, className="bg-green-500 text-white"
let status = "pending";
const resultClassName = clsx({
"bg-gray-100 text-gray-500": status === "pending",
"bg-green-500 text-white": status === "paid",
});
/app/page.tsx
에 아래와 같이 코드를 작성하면, status
의 값에 따라 스타일이 달라지는 것을 확인할 수 있다.import clsx from "clsx";
export default function Page() {
let status = "pending";
const resultClassName = clsx({
"bg-gray-100 text-gray-500": status === "pending",
"bg-green-500 text-white": status === "paid",
});
return (
<div
className={`inline-flex items-center rounded-full m-8 px-2 py-1 text-xl ${resultClassName}`}
>
clsx 사용해보기
</div>
);
}
적용결과
status === "pending"
status === "paid"