import { clsx, type ClassValue } from "clsx"
import { twMerge } from "tailwind-merge"
export function cn(...inputs: ClassValue[]) {
return twMerge(clsx(inputs))
}
className={cn("flex items-center space-x-4 lg:space-x-6", className)}
// 링크에서의 활용
className={cn(
"text-sm font-medium transition-colors hover:text-primary",
route.active
? "text-black dark:text-white"
: "text-muted-foreground"
)}
route.active에 따라 다른 클래스를 적용할 수 있다.
결론: 더 빠른 구현, 효율적인 유지보수.
className보다 우선순위가 높음.margin 앞에 -를 붙이면 요소를 앞으로 이동시킴.pseudo 클래스 예시: first:pt-0, last:pb-0.odd, even: 테이블의 홀수 및 짝수 행 배경색 지정.required, invalid, disabled 상태에 따라 스타일링 가능.예시 코드:
<div class="group">
<p>Hover over me</p>
<p class="group-hover:text-red-500">Hover over me</p>
</div>
Pseudo 요소처럼 그룹에 대한 스타일링을 적용할 수 있습니다.
after:content-['*'], after:ml-1, after:text-red-500 등으로 가상 요소를 추가할 수 있습니다.
:before를 사용하여 배경색을 추가하거나 inset-1 등으로 위치를 지정할 수 있습니다.
file 변경자는 파일 선택 시 스타일링이 가능하다.
file: 접두사를 사용하여 파일 선택 요소의 스타일을 지정할 수 있습니다.<input type="file" class="file:bg-blue-500 file:text-white" />selection: 접두사를 사용해 사용자가 텍스트를 선택할 때의 스타일을 지정할 수 있습니다.
<p class="selection:bg-yellow-300 selection:text-black">
이 텍스트를 드래그해서 선택해보세요.
</p>
print:hidden을 사용하면 요소가 인쇄 시 숨겨집니다.print:block을 사용하면 요소가 인쇄 시 블록 요소로 표시됩니다.aria-label: 요소에 접근성을 위한 레이블을 추가합니다.<button aria-label="닫기">X</button>aria-hidden: 특정 요소를 스크린 리더에서 숨길 수 있습니다.role: 요소의 역할을 명시해 보조 기술이 이를 올바르게 인식할 수 있도록 합니다.<div role="alert">경고 메시지입니다.</div>ARIA는 JavaScript로 동적으로 생성된 콘텐츠나 복잡한 사용자 인터페이스 구성요소(예: 모달, 드롭다운 메뉴 등)에 대한 접근성을 개선합니다.
자바스크립트 없이도 웹 애플리케이션을 편리하게 탐색할 수 있도록 돕습니다.
ARIA 속성은 HTML의 기본 접근성 기능을 대체하는 것이 아니라 보완하는 목적으로 사용해야 합니다.
올바른 사용이 중요하며, 잘못된 ARIA 사용은 접근성을 해칠 수 있습니다.
data- 로 시작하는 속성들이다.
어떤 html 요소에든 자유롭게 임의의 데이터를 추가할 수 있다.
장애를 가진 분들이 웹 어플리케이션을 편하게 이용할 수 있게 하기 위한 HTML 보조 규칙이다.
data-is-hyperloop는 하이퍼링크 여부를 지정해줄 수 있다.
data- 까지가 규칙이고 뒤에는 임의의 데이터를 추가할 수 있다.
div data-size="large" 현재가 large인 경우에만 스타일링이 적용된다. data-[size=large] 현재가 large인 경우에만 스타일링이 적용된다.
ui library에서 커스텀 속성을 지정할 때 data 속성을 사용한다.
breakpoint 별로 스타일링을 지정할 수 있다.
sm, md, lg, xl, 2xl 등으로 지정할 수 있다.
특정 화면 크기 이상에만 적용한다.
text-left, text-center, text-right 등으로 지정할 수 있다.
text-red-500 등으로 지정할 수 있다.
bg-red-500 등으로 지정할 수 있다.
border-red-500 등으로 지정할 수 있다.
border-2 등으로 지정할 수 있다.
rounded-full 등으로 지정할 수 있다.
rounded-t-full 등으로 지정할 수 있다.
rounded-t-none 등으로 지정할 수 있다.
유틸 클래스 이름 뒤에 []를 붙이고 임의의 값을 지정할 수 있다.
<div class="w-[100px]">
<p>Hello</p>
</div>
tailwind.config.js에서 임의의 값을 지정할 수 있다.
module.exports = {
theme: {
extend: {
spacing: {
'100': '100px',
},
},
},
};
@layer 로 추가할 수 있다.
자주 사용되는 조합을 미리 지정해둘 수 있다.
@layer utilities {
.custom-class {
color: red;
}
}
@tailwind base;
@tailwind components;
@tailwind utilities;
이걸 써주지 않으면 유틸리티 클래스들이 적용되지 않는다.
base는 기본 스타일링을 지정할 수 있다.
components는 컴포넌트 스타일링을 지정할 수 있다.
utilities는 유틸리티 클래스를 지정할 수 있다.
@apply 로 기존에 정의된 스타일을 재사용할 수 있다.
@layer 로 유틸리티 클래스를 추가할 수 있다.
@screen 로 반응형 디자인을 지정할 수 있다.
@variants 로 상태에 따른 스타일링을 지정할 수 있다.
테일윈드가 프로젝트에 로딩되는 구조는 다음과 같다.
globals.css 파일에 다음과 같이 작성한다.
@tailwind base;
@tailwind components;
@tailwind utilities;
index.tsx 파일에서 테일윈드를 불러오는 구조는 다음과 같다.
import '@/styles/globals.css';
.content-area {
height: calc(100vh - theme('spacing.16'));
}
빌드 타임에서 추가된다.
container 클래스는 화면 크기에 따라 자동으로 크기를 조절해준다.
Tailwind CSS에서 flex-direction은 flex-row, flex-row-reverse, flex-col, flex-col-reverse 클래스를 사용하여 설정할 수 있습니다.
flex-row (기본값)
<div class="flex flex-row">
<div>Item 1</div>
<div>Item 2</div>
</div>
flex-row-reverse
<div class="flex flex-row-reverse">
<div>Item 1</div>
<div>Item 2</div>
</div>
flex-col
<div class="flex flex-col">
<div>Item 1</div>
<div>Item 2</div>
</div>
flex-col-reverse
<div class="flex flex-col-reverse">
<div>Item 1</div>
<div>Item 2</div>
</div>
Tailwind CSS에서 grid를 사용하여 레이아웃을 만들 수 있습니다. grid는 행과 열을 기준으로 아이템을 배치하는 방식입니다. 다양한 유틸리티 클래스를 사용하여 그리드의 레이아웃을 쉽게 설정할 수 있습니다.
grid
display: grid를 적용하여 그리드 레이아웃을 활성화합니다.
<div class="grid">
<div>Item 1</div>
<div>Item 2</div>
</div>
grid-cols-{n}<div class="grid grid-cols-3">
<div>Item 1</div>
<div>Item 2</div>
<div>Item 3</div>
</div>grid-rows-{n}<div class="grid grid-rows-2">
<div>Item 1</div>
<div>Item 2</div>
<div>Item 3</div>
</div>col-span-{n}<div class="grid grid-cols-3">
<div class="col-span-2">Item 1</div>
<div>Item 2</div>
</div>row-span-{n}<div class="grid grid-rows-3">
<div class="row-span-2">Item 1</div>
<div>Item 2</div>
</div>gap-{size}<div class="grid grid-cols-3 gap-4">
<div>Item 1</div>
<div>Item 2</div>
<div>Item 3</div>
</div>