tawilwind
는 utility-first css
이다. (즉 테일윈드가 많은 클레스네임을 갖는 다는 말. 엄청 큰 css 파일이다.)vscode
의 extension
: Tailwind CSS intelliSense
를 설치하면 자동완성 기능을 쓸 수 있다.컨트롤+스페이스
cmd + space 를 눌러본다:hover
선택자를 사용했다.modifier
를 사용할 수 있다.조건:프로퍼티
ex) hover:text-black
<button
className="mt-5 bg-blue-500 text-white p-3
text-center rounded-xl w-3/4 mx-auto
hover:bg-teal-500 hover:text-black
active:bg-yellow-500 focus:bg-red-500
">
Checkout
</button>
ring-2
, ring-offset-2
, ring-yellow-500
focus
를 해줄 필요는 없다. 다른 애들은 변수에 대한 설정이므로 focus:ring-2
만 해도 충분<div className="space-x-2">
<button
className="w-5 h-5 rounded-full bg-yellow-500 focus:ring-2 ring-offset-2 ring-yellow-500 transition" />
<button
className="w-5 h-5 rounded-full bg-indigo-500 focus:ring-2 ring-offset-2 ring-indigo-500 transition" />
<button
className="w-5 h-5 rounded-full bg-teal-500 focus:ring-2 ring-offset-2 ring-teal-500 transition" />
</div>
<ul>
{[1, 2, 3, 4].map((i) => (
<div
key="{i}"
className="flex justify-between my-2 odd:bg-blue-50 even:bg-yellow-50 first:bg-teal-50 last:bg-amber-50">
<span className="text-gray-500">Grey Chair</span>
<span className="font-semibold">$19</span>
</div>
))}
</ul>
<ul>
{["a", "b", "c", ""].map((c, i) => (
<li className="bg-red-500 py-2 empty:bg-blue-500" key="{i}">{c}</li>
))}
</ul>
empty
에 대해서도 디자인 입힐 수 있다. ex) empty:hidden
display : none
과 같다.container:hover .item {
}
group
이라는 클래스명을 준다group-hover:bg-red-300
<div className="group">
<div className="group-hover:bg-red-300">
</div>
placeholder-shown
disabled
required
invalid
valid
peer
클래스명을 추가한다.peer-modifier
로 스타일을 입힌다.<form className="flex flex-col space-y-2 p-5 ">
<input
type="text"
required
placeholder="Username"
className="border p-1 peer border-gray-400 rounded-md " />
<span className="hidden peer-invalid:block peer-invalid:text-red-500">
This input is invalid
</span>
<span className="hidden peer-valid:block peer-valid:text-teal-500">
Awesome username
</span>
<span className="hidden peer-hover:block peer-hover:text-amber-500">
Hello
</span>
<input type="submit" value="Login" className="bg-white" />
</form>
selection
텍스트를 드래그 할때 스타일open
details 가 열렸을 떄marker
ul 리스트의 왼쪽에 있는 bullet의 스타일<details className='selection-none open:bg-indigo-400'>
<summary className='selection-none cursor-pointer'>details 의 제목</summary>
<span className='selection:bg-indigo-600'>내용</span>
</details>
<ul className='list-disc marker:text-teal-500'>
<li>item</li>
<li>item</li>
<li>item</li>
</ul>
<input type="file" className="file:border-0 file:rounded-md file:bg-purple-400" >
<div className='flex flex-col space-y-2 p-5 '>
<p className='first-letter:text-7xl first-letter:hover:text-purple-400'>
Hello everyone!
</p>
</div>
sm
, md
, lg
, xl
, 2xl
, portrait
, landscape
portrait
, landscape
는 모바일 방향에 따른 것이다 (device simulator 에서 테스트 해볼 수 있다.)<div className='bg-white sm:hover:bg-pink-800 sm:bg-red-400 md:bg-teal-400 lg:bg-indigo-400 xl:bg-yellow-400 2xl:bg-pink-500 p-6 rounded-3xl shadow-xl'></div>
tailwind.config.js
에 darkmode
옵션을 class
로 변경한다. (deefault
는 darkMode: "media"
)dark
클래스를 갖는 부모요소의 모든 자식요소도 다크모드가 적용된다.class 모드
에서 다크모드를 토글하고 싶으면, dark:
선택자를 사용하는 요소의 부모요소에 dark
클래스를 추가하면 된다. ex) 보통은 body 나 html 태그에 추가한다dark
를 클래스명에 넣는다// tailwind.config.js
module.exports = {
content: [
"./pages/**/*.{js,jsx,ts,tsx}",
"./components/**/*.{js,jsx,ts,tsx}",
],
theme: {
extend: {},
},
darkMode: "class",
plugins: [],
};
<div className="bg-white dark:bg-black flex flex-col justify-between p-6 rounded-3xl shadow-xl">
<span className="font-semibold dark:text-white text-2xl">
Select Item
</span>
<ul>
<div className="flex justify-between my-2 ">
<span className="text-gray-500 dark:text-gray-100">Grey Chair</span>
<span className="font-semibold dark:text-white">$19</span>
</div>
<div className="flex justify-between my-2 ">
<span className="text-gray-500 dark:text-gray-100">Grey Chair</span>
<span className="font-semibold dark:text-white">$19</span>
text-9xl
보다 크게 하려면?
text-[500px]
를 하면 된다! JIT 덕분
백그라운드 이미지 넣을 때 : bg-[url('https://~')]
function cls(...classnames: string[]) {
return classnames.join(" ");
}
<button
className={cls(
"pb-4 font-medium border-b-2 ",
method == "email"
? "border-orange-500 text-orange-400"
: "border-transparent"
)}></button>;
npm i @tailwindcss/forms
: input 에 reset layer 를 추가할수 있는 플러그인을 설치한다tailwind.config.js
에서 plugins
배열에 추가해준다. : plugins: [require("@tailwindcss/forms")]
module.exports = {
content: [
"./pages/**/*.{js,jsx,ts,tsx}",
"./components/**/*.{js,jsx,ts,tsx}",
],
theme: {
extend: {},
},
darkMode: "media", // class
plugins: [require("@tailwindcss/forms")],
};
appearance-none
으로 혹시 input 이 갖고 있을지 모르는 기본 스타일을 리셋 시켜보자<form className='flex flex-col mt-8'>
<label className='text-sm font-medium text-gray-700'>
{method === "email" ? "Email address" : null}
{method === "phone" ? "Phone number" : null}
</label>
<div className='mt-1'>
{method === "email" ? (
<input
type='email'
className='appearance-none w-full px-3 py-2 border border-gray-300 rounded-md shadow-sm placeholder-gray-400 focus:outline-none focus:ring-orange-500 focus:border-orange-500'
required
/>
) : null}
{method === "phone" ? (
<div className='flex rounded-md shadow-sm'>
<span className='flex items-center justify-center px-3 rounded-l-md border border-r-0 border-gray-300 bg-gray-50 text-gray-500 select-none text-sm'>
+82
</span>
<input
type='number'
className='appearance-none w-full px-3 py-2 border border-gray-300 rounded-md rounded-l-none shadow-sm placeholder-gray-400 focus:outline-none focus:ring-orange-500 focus:border-orange-500'
required
/>
</div>
) : null}
</div>
<button className='mt-5 bg-orange-500 hover:bg-orange-600 text-white py-2 px-4 border border-transparent rounded-md shadow-sm text-sm font-medium focus:ring-2 focus:ring-offset-2 focus:ring-orange-500 focus:outline-none '>
{method === "email" ? "Get login link" : null}
{method === "phone" ? "Get one-time password" : null}
</button>
</form>
last:border-b-0
클래스 명을 추가해주면 된다.<div className='py-10'>
{[1, 1, 1, 1, 1, 1, 1].map((_, i) => (
<div
key={i}
className='flex px-4 cursor-pointer py-3 items-center space-x-3 border-b last:border-b-0'>
<div className='w-12 h-12 rounded-full bg-slate-300' />
<div>
<p className='text-gray-700'>Steve Jebs</p>
<p className='text-sm text-gray-500'>
See you tomorrow in the corner at 2pm!
</p>
</div>
</div>
))}
</div>
divide
클래스를 사용한다. (divide-y-[1px] 세로방향으로 나눠서 쌓는다. 경계는 1px)<div className='py-10 divide-y-[1px] '>
{[1, 1, 1, 1, 1, 1, 1].map((_, i) => (
<div
key={i}
className='flex px-4 cursor-pointer py-3 items-center space-x-3'>
<div className='w-12 h-12 rounded-full bg-slate-300' />
<div>
<p className='text-gray-700'>Steve Jebs</p>
<p className='text-sm text-gray-500'>
See you tomorrow in the corner at 2pm!
</p>
</div>
</div>
))}
</div>
aspect-video
: 영상비율(16:9) 로 만들어준다. (가로를 반응형으로 바꾸면 세로도 알아서 조절됨)aspect-square
: 정사각형 비율로 만들어준다.