Tailwind CSS는 유틸리티 퍼스트(Utility-First) CSS 프레임워크로, 사용자에게 클래스 기반의 접근 방식을 통해 신속하게 스타일을 적용할 수 있도록 도와준다.
--> 이는 전통적인 CSS 방법론과 달리, 미리 정의된 CSS 클래스를 활용하여 스타일링을 구현하게 된다.
유틸리티 클래스:
모듈화된 스타일링:
반응형 디자인:
확장 가능성:
JIT 컴파일러:

자동완성을 위해, 내가 편리하게 사용하기 위해 --> Tailwind CSS IntelliSense를 VSC에서 확장을 설치주면 된다.
그럼 이렇게 자동완성이 이루어지는 것을 확인할 수 있다.
그렇다면, Tailwind를 사용해서 간단한 모달창을 만들어보자

export default function Home() {
return (
<main className="bg-gray-300 h-screen flex items-center justify-center p-5">
<div className="bg-white shadow-lg p-5 rounded-2xl w-full">
<div className="flex justify-between items-center">
<div className="flex flex-col">
<span className="text-gray-600 font-semibold -mb-1">
In transit
</span>
<span className="text-4xl font-semibold">Coolblue</span>
</div>
<div
className="size-12
bg-orange-400 rounded-full"
/>
</div>
<div className="my-2 flex items-center gap-2">
<span className="bg-green-400 uppercase px-3 py-1.5 text-xs font-medium rounded-full text-white ">
Today
</span>
<span>9:30 ~ 10:30</span>
</div>
<div className="relative">
<div className="bg-gray-200 w-full h-2 rounded-full absolute " />
<div className="bg-green-400 w-2/3 h-2 rounded-full absolute" />
</div>
<div className="mt-5 flex justify-between items-center text-gray-600">
<span>Expected</span>
<span>Sorting center</span>
<span>In transit</span>
<span className="text-gray-400">Delivered</span>
</div>
</div>
</main>
);
}
Tailwind CSS에서 "modify" 는 특정 스타일을 조정하거나 커스터마이즈하는 것을 의미한다.
그럼 어떻게 사용하나?

여기 TODAY에 마우스를 올렸을 때(hover), scale의 변화를, bg의 변화를 줘보자
hover:bg-green-500 hover:scale-125
무슨 행동이 일어났을 때 : 이렇게 하겠다 라는 의미로 사용하면 된다.
그럼, dark 모드는 어떻게 해야할까?
1 . 기본 컴퓨터의 테마에 맞춰서 변경되도록 하는 것
2 . class로 따로 정의를 하는 방법
두가지가 있는데 지금은 1번으로 해보려고 한다.
기본 컴퓨터의 테마 설정에 맞춰 자동으로 dark 모드를 적용하려면, Tailwind의 dark 설정을 사용하면 된다.
dark:text-gray-300
dark모드를 사용하고 싶은 곳에 dark: 다크모드 일 때 적용할 속성을 적용시키면 된다.
export default function Home() {
return (
<main className="bg-gray-100 h-screen flex items-center justify-center p-5 dark:bg-gray-800">
<div className="bg-white shadow-lg p-5 rounded-3xl w-full max-w-screen-sm dark:bg-gray-600">
<div className="flex justify-between items-center">
<div className="flex flex-col">
<span className="text-gray-600 font-semibold -mb-1 dark:text-gray-300">
In transit
</span>
<span
className="text-4xl font-semibold
dark:text-white"
>
Coolblue
</span>
</div>
<div
className="size-12
bg-orange-400 rounded-full"
/>
</div>
<div className="my-2 flex items-center gap-2">
<span
className="bg-green-400 uppercase px-3 py-1.5 text-xs font-medium rounded-full cursor-pointer
transition text-white hover:bg-green-500 hover:scale-125"
>
Today
</span>
<span className="dark:text-gray-100">9:30 ~ 10:30</span>
</div>
<div className="relative">
<div className="bg-gray-200 w-full h-2 rounded-full absolute " />
<div className="bg-green-400 w-2/3 h-2 rounded-full absolute" />
</div>
<div className="mt-5 flex justify-between items-center text-gray-600 dark:text-gray-200">
<span>Expected</span>
<span>Sorting center</span>
<span>In transit</span>
<span className="text-gray-400 dark:text-gray-500">Delivered</span>
</div>
</div>
</main>
);
}
현재 내 컴퓨터는 dark모드이기 때문에,
dark모드가 적용된 것을 확인할 수 있다.

1 . input 창에 focus 되었을 때, orange 테두리 생성하기
2 . Search 버튼을 눌렀을 때, 버튼 크기 줄어들게 해보기
이 두가지를 만들어 볼 예정이다!
input창
<input
className="bg-gray-200 rounded-full pl-5 py-2
outline-none ring ring-transparent
focus:ring-orange-500 ring-offset-2 transition"
type="text"
placeholder="Search here ... "
/>
input 요소의 className을 보면, 처음에는 투명한 ring ( ring-transparent ) 이 있다가, 포커스가 되었을 때 주황색 ring이 생겨나도록 작성해 주었다.
ring이라는 속성은 처음 보는데, 이렇게
다양한 속성으로 outline을 설정할 수 있다는 것을 확인할 수 있다.
button
<button className="bg-black text-white py-2 rounded-full active:scale-90
transition-transform font-medium focus:scale-90 outline-none ">
Search
</button>
button 요소의 className을 보면, active 되었을 때, focus 되었을 때, scale-90으로 크기가 90%로 줄어들도록 작성해 주었다.
여기서 transition-transform의 속성으로 animation을 부드럽게 주었다!
정의가 딱딱 뭔지 알겠어서 그런가 css를 작성하는 속도가 점점 빨라지고 있는 것 같다는 느낌이 든다!
❓❓ Tailwind CSS는 모바일 우선이다?
맞다. Tailwind CSS는 모바일 우선 접근 방식(Mobile-First Approach) 을 채택한다.
이는 기본적으로 모든 스타일이 모바일 장치에 우선 적용되고, 이후 더 큰 화면 크기에 대해 추가적인 스타일을 적용하는 방식을 나타낸다. Tailwind CSS에서는 이러한 접근 방식을 쉽게 구현할 수 있도록 다양한 유틸리티 클래스와 반응형 디자인 지원을 제공한다.
많은 사람들이 먼저 데스크탑 디자인을 구현하고, 그 뒤에 화면을 작게 만들면서 조정하기 시작한다.
Tailwind CSS에서는 반대로 작동한다 --> Tailwind CSS에서는 모바일 디자인을 먼저 구현하고, 그 뒤에 화면을 키워간다.
--> 그렇기 때문에 모든 class들이 기본적으로 작은 화면에 적용된다.
그럼 , 화면에 크기에 따라서 배경화면이 달라질 수 있도록 속성을 추가해보면 좋을 것 같다!
(중요하게 생각해야 할 점은 -> Tailwind CSS는 모바일 장치에 우선 적용된다는 점이다)
bg-gray-100
sm:bg-red-100
md:bg-orange-100
lg:bg-yellow-100
xl:bg-green-100
2xl:bg-cyan-100
여기서 기본 bg는 gray-100이다.
sm ? -> 최소 너비가 640px로 설정된 미디어쿼리md ? -> 최소 너비가 768px로 설정된 미디어 쿼리lg ? -> 최소 너비가 1024px로 설정된 미디어 쿼리xl ? -> 최소 너비가 1280px 로 설정된 미디어 쿼리이렇게 한 곳에서 다양한 화면 사이즈에 대해서 반응할 수 있게 된다
--> 한 줄의 미디어쿼리도 작성할 필요가 없어진다!
이렇게 VSC에서 media 속성에 관해서 찾아볼 수 있다.
그럼, 여기서 화면이 최소 768px가 되었을 때, button이 input 으로 이동하면 어떨까?
화면의 크기가 767일 때에는 그대로 인 상태 (flex-col인 상태)
여기서, 크기가 768이 되면 ?
이렇게 버튼이 input 옆으로 이동하게 된다 (flex-row)
div -> md 일 때 flex-row로 변경하고, button -> md일 때, x축으로 padding 속성 5(1.25rem) 이 되도록 적용해 주었다.

확실히 반응형 유틸리티를 만들기에 간편한 것 같다는 생각이 든다!
버튼의 배경화면 색상을 gradient로 지정해주려고 한다!
bg-gradient-to-tr 은 top right로 왼쪽 아래에서 오른쪽 위(즉, bottom left to top right)로의 그라데이션 방향을 설정합으로 시작한다는 의미를 나타낸다.
from과 to로 각각의 색상을 지정해 주어야 하는데, from-cyan-500으로 시작해서 via-yellow중간을 거쳐서 to-purple-400으로 끝난다. 라고 쉽게 이해하면 될 것 같다.
왼쪽 바닥부터 중간 노랭이를 거쳐서 오른쪽 위 보라색으로 끝난 것을 확인할 수 있다.
내가 입력한 값이 유효하지 않다면 (브라우저가 유효하지 않다고 판단하는 입력값에 대해 작동), invalid: 뒤에 나타나는 css 속성을 적용시켜라~ 를 의미한다.
어떻게 사용하나?
만약, input의 type이 email이고, required(필수로 입력해야 하는 값)일 때,
input에 유효하지 않는 값이 들어올 때, ring의 색깔을 red로 변경해보자!
invalid:focus:ring-red-500 속성을 적용해 주었다.
이메일 형식이 아닐 경우(유효성 검사에 실패!)에는 ring의 색상이 red가 되고, 이메일 형식으로 유효성 검사에 통과된다면,
이렇게 초록색 ring이 나타나게 된다.
peer 클래스는 자매 요소나 부모 요소의 상태에 따라 스타일을 적용할 수 있게 해주는 강력한 기능을 제공한다.
주로 양식(form) 구성 요소에서 사용할 때 유용하다.
peer와 함께 사용하는 peer-* 변형 클래스는 특정 입력이나 선택 요소의 상태에 따라 다른 요소의 스타일을 변경하는 데 사용된다.

peer 클래스는 input 요소에 적용되어 있다. 이 peer 클래스를 사용하면 해당 input 요소의 상태(유효하지 않은 입력 상태)에 따라 형제 요소(button 요소)의 스타일을 동적으로 변경할 수 있게 된다(bg-red-500으로 변경하게 된다).
로그인 화면에서는 어떻게 사용될까?
이러한 Login 화면이 있다고 가정해보자
"Email is required"라는 문구를 이메일을 입력하지 않거나, 잘못 입력했을 때, (유효성 검사에 실패했을 때) 나타나도록 하고 싶다
어떻게 하면 될까?

peer 클래스:
peer-invalid 변형 클래스:
span 요소: hidden peer-invalid:block
peer-invalid:block : input 요소가 유효하지 않을 때(예를 들어, 이메일 형식이 아니거나 입력이 비어 있을 때) span 요소를 block으로 표시한다.button 요소: peer-invalid:bg-red-500
peer-invalid:bg-red-500 : input 요소가 유효하지 않은 상태일 때 버튼의 배경색을 빨간색으로 변경한다.
이처럼 input이 유효하지 않을 때, 나타나는 것을 확인할 수 있다!