
โ ๋ฐ์ํ ๋์์ธ
sm -> @media(min-width: 640px)
md -> @media(min-width: 768px)
lg -> @media(min-width: 1024px)
dark -> @media(prefers-color-scheme: dark)
lg: grid-cols-2
๋ผ์ง ์ฌ์ด์ฆ ํ๋ฉด์์๋ 2๊ฐ์ column์ ๊ฐ์ง๋ค.
โ ring
ring-2
2px์ ring border๊ฐ ์๊น
ring-offset-2
ring์ 2px์ ๊ฐ๊ฒฉ์ด ์๊น
ring-yellow-500
ring ์์ ์ค์
focus:ring-2
focus์ ring ์์ฑ
ring-opacity-20
ring์ ๋ถํฌ๋ช ๋๋ฅผ 20%๋ก ์ค์
โ Transition
className์ transition์ ์ถ๊ฐํ๊ธฐ๋ง ํ๋ฉด ์๋์ผ๋ก ์์ transition์ ๋ง๋ค์ด์ค๋ค.
โ Modifiers for Lists
first: bg-blue-50, last: bg-blue-50
์ฒซ ๋ฒ์งธ child์ ๋ง์ง๋ง child
only: bg-red-500
child๊ฐ ํ๋๋ง ์์ ๋
odd:, even:
ํ์์ ์ง์
empty:
๋น์ด ์๋ element ์ ํ (๋ณดํต empty์ธ child๋ hidden์ผ๋ก ์จ๊ธด๋ค.)
List ๋ชจ์ ๋ฐ๊พธ๊ธฐ
list-decimal -> ๋ฆฌ์คํธ์ ์ซ์๋ฅผ ๋ถ์ฌ์ค๋ค. (ol์ ๊ธฐ๋ณธ ์คํ์ผ)
list-disc -> ๋์คํฌ ๋ชจ์ ์ ์คํ์ผ (ul์ ๊ธฐ๋ณธ ์คํ์ผ)
marker: text-teal-500 -> ๋ฆฌ์คํธ ๋ชจ์(marker)์ ์คํ์ผ์ ๋ณ๊ฒฝ
โ Group Modifier
<div class="group hover:bg-gray-100">
<p class="group-hover:text-blue-500">
์ด ํ
์คํธ๋ ๋ถ๋ชจ์ hoverํ ๋ ํ๋์์ด ๋ผ
</p>
</div>
ํด๋น ์์๋ง ํ๊ฒํ ํด์ผ ๋์ํ๋ ๊ฒ์ด ์๋๋ผ ํฌํจ๋ ์์ญ๋ง ํ๊ฒํ ํด๋ ํน์ ์์๋ฅผ ๋ณ๊ฒฝํ ์ ์๋๋ก ํด์ค
โ Peer Modifier
<div>
<input type="checkbox" class="peer hidden" />
<label class="peer-checked:text-blue-500">์ ํ๋จ</label>
</div>
์ง์ ์ํ modifier
- peer-hover:
- peer-focus:
- peer-checked:
- peer-disabled:
- peer-invalid:
- peer-placeholder-shown:
- ๋ฑ๋ฑ...
๋จ, peer๊ฐ peer selector๋ณด๋ค ์์ ์กด์ฌํด์ผ ํ๋ค.
(CSS๊ฐ top to bottom์ผ๋ก ๋์ํ๊ธฐ ๋๋ฌธ)
๊ทธ๋ฆฌ๊ณ feer๋ ํ์ ์์ ์ฌ์ด์์๋ง ๋์ํ๋ค.
๋ถ๋ชจ ์์ ์์ ์ฌ์ด๋ group์ ์ด์ฉํ๋ค.
โ File modifier
file: border-0
file ๋ฒํผ๋ง ๋ณ๊ฒฝ
file:hover: text-purple-400
์ค์ฒฉ๋ ๊ฐ๋ฅ
โ Dark Mode
dark: bg-black
className์ dark๋ฅผ ๋ฃ์ผ๋ฉด ๋จ
Tailwind๋ dark-mode ์ ํ ๋ฒํผ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
ํ์ง๋ง ์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ค๋ฉด ์ฐ์ tailwind.config.js๋ก ๊ฐ์ ์ปดํจํฐ์ ๋คํฌ๋ชจ๋ ์ค์ ์ ๋ฐ๋ผ๊ฐ ๊ฑด์ง, ์๋๋ฉด ๋ฆฌ์กํธ๋ JS๋ก ์ง์ ํ ๊ธ ์ํฌ ๊ฑด์ง๋ฅผ ์ค์ ํด์ค์ผ ํ๋ค.
๊ธฐ๋ณธ๊ฐ์ผ๋ก๋ darkMode: "media"
์ด ๊ฐ์ class๋ก ๋ฐ๊พธ๋ฉด dark-mode์ ๋ํ media query๊ฐ ์ฌ๋ผ์ง๋ค.
class๋ dark-mode๋ฅผ ์๋์ผ๋ก ํ์ฑํ์ํฌ ์ ์์ผ๋ฉฐ, ๋ถ๋ชจ ์์์ "dark"๋ผ๋ className์ด ์๋์ง ํ์ธํ๋ค.
์์) ๋ค๋น๊ฒ์ด์ ๋ฐ์ ์ด๋๊ฐ์ ๋ฒํผ์ ๋ง๋ค๊ณ , ์ ์ ๊ฐ ๋ฒํผ์ ํด๋ฆญํ๋ฉด html ํ๊ทธ์ "dark"๋ฅผ ์ถ๊ฐํ๋ฉด ๋ชจ๋ ์์๋ค์ด ๋คํฌ๋ชจ๋๊ฐ ๋๋ค.
<html class = "dark" /> ํน์ body์ ์ถ๊ฐ. (์ด ๋ฐฉ์์ ํฌ๊ฒ ์ ํธ๋ x, ํ๊ทธ ์์ ํ๋ ๊ฒ์ด ๊ท์ฐฎ๋ค.)
โ Just In Time Compiler
์ฝ๋๋ฅผ ์ค์๊ฐ์ผ๋ก ๊ฐ์ํ๋ฉด์ ํ์ํ ํด๋์ค๋ฅผ ์์ฑํ๋ ๊ธฐ๋ฅ์ ํ๋ค. (V3 ์ดํ๋ถํฐ ๊ฐ๋ฅ)
๋๋ถ์ bg-[url(`/vercel.svg`)] ์ด๋ฐ ์์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅ (custom ์์ฑ)
text-[#000]๋ ๊ฐ๋ฅ
tailwind.config.ts๋ก ์ปค์คํ class name๋ ์์ฑํ ์ ์๋ค.
import type { Config } from "tailwindcss";
import forms from "@tailwindcss/forms";
const config: Config = {
content: [
"./pages/**/*.{js,ts,jsx,tsx,mdx}",
"./components/**/*.{js,ts,jsx,tsx,mdx}",
"./app/**/*.{js,ts,jsx,tsx,mdx}",
],
theme: {
extend: {
margin: {
tomato: "120px",
},
borderRadius: {
"sexy-name": "11.11px",
},
},
},
plugins: [forms],
};
export default config;
borderRadius์ ์์ฑํ ์ปค์คํ class name์ rounded-sexy-name์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅ
Tailwind v4๋ถํฐ๋ tailwind.config.ts ๋์ Tailwind๋ฅผ ๊ฐ์ ธ์จ CSSํ์ผ(globals.css) (@import "tailwind" ํ์ผ)์์ ์ง์ ๋ชจ๋ ์ฌ์ฉ์ ์ ์๋ฅผ ๊ตฌ์ฑํ ์ ์๋ค.
โ ์ง์ํ ๋ฉ๋ชจ
appearance-none
input์ด ๊ฐ๊ณ ์์์ง๋ ๋ชจ๋ฅด๋ ๊ธฐ๋ณธ ์คํ์ผ์ reset
pointer-events-none
๋ง์ฐ์ค ์ด๋ฒคํธ๋ฅผ ์์ ํ ๋ฌด์
select-none
ํ ์คํธ ๋๋๊ทธ/๋ณต์ฌ ๋ถ๊ฐ๋ฅ, ํด๋ฆญ์ ์ ์ ์๋ํ์ง๋ง ๋ธ๋ก ์ง์ (select)๋ง ๋ถ๊ฐ
flex-1 === flex: 1 1 0%
flex-grow: 1; flex-shrink: 1; flex-basis: 0%;
text-base
text๋ฅผ reset ํด์ฃผ๋ ์ญํ (๊ธฐ๋ณธ๊ฐ)
space-x-5
child์ ์ํ ๋ฐฉํฅ์ผ๋ก ๊ฐ๊ฒฉ ์์ฑ
divide-y-2
child์ ์์ง ๋ฐฉํฅ์ผ๋ก ๊ตฌ๋ถ์ ์์ฑ
inset-x-0
left: 0px & right: 0px
inset-y-0
bottom: 0px & top: 0px
mx-auto
margin-left: auto & margin-right: auto
max-w-md
์ต๋ width๋ฅผ md ์ฌ์ด์ฆ๋ก ์ ํ
aspect-video
aspect-ratio: 16/9; (๋น๋์ค ๋น์จ๋ก ๋ง์ถค)
aspect-square
๋น์จ์ 1:1๋ก ๋ง์ถค
invalid:
์ ๋ ฅ๊ฐ์ด ์ ํจํ์ง ์๋ค๋ฉด ์ ์ฉํ style ์ง์ ๊ฐ๋ฅ(์ผ๋ฐ css selector)
*:
๋ถ๋ชจ ์์์ ์ด modifier๋ฅผ ์ฃผ๋ฉด ํด๋น ์์์ ๋ชจ๋ ์์ ์์๋ค ์ ํ ๊ฐ๋ฅ
has-[]:
์์ ์์๊ฐ ํน์ ํ ์กฐ๊ฑด์ ๋ง์กฑํ๋ฉด์ ์กด์ฌํ๋ฉด ์คํ์ผ ์ ์ฉ ๊ฐ๋ฅ
empty:
text๊ฐ ๋น์ด์๋ element๋ฅผ ์ ํํ ์ ์๋ค.
โ Animate
animate-bounce
ํตํต ํ๋ ํจ๊ณผ
ex) notification
animate-spin
์๊ณ ๋ฐฉํฅ์ผ๋ก ๋๋ ํจ๊ณผ
ex) spinner
animate-pulse
์ฒ์ฒํ ๋ฐ์ง์ด๋ ํจ๊ณผ, ๋ก๋ฉ ํจ๊ณผ๋ก ์ฌ์ฉํ๋ฉด ์ข์
ex) loader
animate-ping
๋ฌผ๊ฒฐ์ด ํ๋์น๋ ๋ฏํ ํจ๊ณผ. ๋๊ฐ์ ํฌ๊ธฐ์ ๋ํ์ ์ค์ฒฉ ์์ผ์ ๋ด๋ถ์ ๋ํ์ ์ด ํจ๊ณผ๋ฅผ ๋ฃ์ผ๋ฉด ์๋ฆผ ํจ๊ณผ ๊ฐ์ ๋๋์ ๋ผ ์ ์์
ex) notification
โ Directives
์ปดํ์ผ๋ฌ๋ ์์ฑ๋ CSS๋ฅผ ์ด๋์ ๋๊น?
globals.css ๋ด์ directives๋ค(import ๋์ด์๋ 3๊ฐ) (directive๋ค์ placeholder ์ ๋๋ก ์๊ฐํ ์ ์๋ค.)
์ปดํ์ผ๋ฌ๋ ์ค์ ๋ก globals.css์ ์์ ์ด directive๋ค์ ์์ฑ๋ class name์ผ๋ก ๋์ฒดํ๋ค.
์ 3๊ฐ์ด๋ฉฐ, ์ ์ ์ฐจ์ด์ ์?
utilities: ์ปดํ์ผ๋ฌ๊ฐ ๋ชจ๋ utility class name๋ค์ ๋ฃ๋ ๊ณณ
base: ์ปดํ์ผ๋ฌ๊ฐ tailwind์ ํจ๊ป ์ ๊ณต๋๋ ๊ธฐ๋ณธ์ ์ธ ์คํ์ผ ์ข ๋ฅ๋ฅผ ๋๋ ๊ณณ(reset style ๊ฐ์ ๋๋)
components: ๋ง ๊ทธ๋๋ก tailwind style์ ์ฌ์ฌ์ฉํ๊ธฐ ์ํด ์ปดํฌ๋ํธ๊ฐ ํ์ํ ๋ className์ ์ง์ ํ์ฌ ํด๋น style๋ค์ ์ ์ด๋๊ธฐ ์ํจ
(ํด๋น ํ์ผ์์ ๊ฒฝ๊ณ ๋ฐ์ค์ด ๋ณด๊ธฐ ์ซ์ผ๋ฉด VSC์ ๋ฐ ๋ฉ๋ด์์ ์ธ์ด๋ฅผ CSS์์ Tailwind๋ก ๋ฐ๊ฟ์ฃผ๋ฉด ๋๋ค.)
apply, layer directive
@layer base {
a {
@apply text-orange-500;
}
}
Tailwind v4๋ @tailwind base; @tailwind components; @tailwind utilities; ์ด 3์ค์ด
@import "tailwindcss"; ํ ์ค๋ก ์ถ์ฝ๋จ.
โ Plugins
tailwind.config.ts ํ์ผ์ plugins array๋ฅผ ๊ฐ๊ณ ์๋ค.
์ด ๊ณณ์ third-party plugin๋ค์ ์ค์นํ๋ค.
(plugin๋ค์ด ํ๋ ์ผ์ base layer์ utilities layer์ components layer๋ฅผ ํ์ฅํ๋ ๊ฒ.)
๋๊ตฐ๊ฐ ์ปค์คํ ํ ์ปดํฌ๋ํธ๊ฐ ์๋ค๋ฉด ๋ณต๋ถํด์ฌ ํ์์์ด ํ๋ฌ๊ทธ์ธ์ผ๋ก ์ค์นํ๋ฉด ๋ฐ๋ก ๊ธฐ์กด layer์ ๋ฎ์ด์ฐ๊ธฐ๊ฐ ๋๋ค.
(daisyUI: tailwind css๋ฅผ ์ํ ๋ฉ์ง components ๋ผ์ด๋ธ๋ฌ๋ฆฌ, npm i daisyui@latest, plugins: [require("daisyui"])
plugin ์ถ๊ฐ ๋ฐฉ๋ฒ
import forms from "@tailwindcss/forms";
plugins: [forms]
Tailwind v4์์ plugin ์ถ๊ฐ ๋ฐฉ๋ฒ
globals.css์์ @plugin "@tailwindcss/forms";
'๐ TailwindCSS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| TailwindCSS - IntelliSense ์๋์์ฑ์ ์ฒซ ๋ฌธ์์ด๋ถํฐ ํ์ฑํ ํ๋ ๋ฐฉ๋ฒ (0) | 2025.09.17 |
|---|---|
| TailwindCSS - Layer (0) | 2025.09.10 |
| TailwindCSS - ์์ํ๊ธฐ (0) | 2025.05.26 |