본문으로 건너뛰기

의사 클래스

호버, 초점, 활성화

hover, focus, active 수정자를 사용하여 호버, 초점, 활성화 요소에 스타일을 지정합니다.

html
<button
class="bg-violet-500 hover:bg-violet-600 active:bg-violet-700 focus:outline-none focus:ring focus:ring-violet-300 ..."
>
Save changes
</button>
html
<button
class="bg-violet-500 hover:bg-violet-600 active:bg-violet-700 focus:outline-none focus:ring focus:ring-violet-300 ..."
>
Save changes
</button>

테일윈드에는 :visited, :focus-within, :focus-visible 등과 같은 다른 대화형 상태에 대한 수정자도 포함되어 있습니다.

사용 가능한 의사 클래스 수정자의 전체 목록은 의사 클래스 참고를 확인하세요.

처음, 마지막, 홀수, 짝수

첫 번째 자식 또는 마지막 자식인 요소는 firstlast 수정자를 사용하여 스타일을 지정합니다.

html
<ul role="list" class="p-6 divide-y divide-slate-200">
{#each people as person}
<!-- 첫 번째/마지막 자식인 경우 위/아래 패딩을 제거합니다. -->
<li class="flex py-4 first:pt-0 last:pb-0">
<img class="h-10 w-10 rounded-full" src="{person.imageUrl}" alt="" />
<div class="ml-3 overflow-hidden">
<p class="text-sm font-medium text-slate-900">{person.name}</p>
<p class="text-sm text-slate-500 truncate">{person.email}</p>
</div>
</li>
{/each}
</ul>
html
<ul role="list" class="p-6 divide-y divide-slate-200">
{#each people as person}
<!-- 첫 번째/마지막 자식인 경우 위/아래 패딩을 제거합니다. -->
<li class="flex py-4 first:pt-0 last:pb-0">
<img class="h-10 w-10 rounded-full" src="{person.imageUrl}" alt="" />
<div class="ml-3 overflow-hidden">
<p class="text-sm font-medium text-slate-900">{person.name}</p>
<p class="text-sm text-slate-500 truncate">{person.email}</p>
</div>
</li>
{/each}
</ul>

oddeven 수정자를 사용하여 홀수 또는 짝수 번째인 자식 요소의 스타일을 지정할 수 있습니다.

html
<table>
<!-- ... -->
<tbody>
{#each people as person}
<!-- 홀수 행에는 흰색 배경을 사용하고 짝수 행에는 `slate-50`을 사용합니다. -->
<tr class="odd:bg-white even:bg-slate-50">
<td>{person.name}</td>
<td>{person.title}</td>
<td>{person.email}</td>
</tr>
{/each}
</tbody>
</table>
html
<table>
<!-- ... -->
<tbody>
{#each people as person}
<!-- 홀수 행에는 흰색 배경을 사용하고 짝수 행에는 `slate-50`을 사용합니다. -->
<tr class="odd:bg-white even:bg-slate-50">
<td>{person.name}</td>
<td>{person.title}</td>
<td>{person.email}</td>
</tr>
{/each}
</tbody>
</table>

테일윈드에는 :only-child, :first-of-type, :empty 등과 같은 다른 구조적 의사 클래스에 대한 수정자도 포함되어 있습니다.

사용 가능한 의사 클래스 수정자의 전체 목록은 의사 클래스 참고를 확인하세요.

양식 상태

required, invalid, disabled과 같은 수정자를 사용하여 다양한 상태의 양식 요소에 스타일을 지정합니다.

html
<form>
<label class="block">
<span class="block text-sm font-medium text-slate-700">Username</span>
<!-- 양식 상태 수정자를 사용하면 클래스가 모든 입력에 대해 동일할 수 있습니다. -->
<input
type="text"
value="tbone"
disabled
class="mt-1 block w-full px-3 py-2 bg-white border border-slate-300 rounded-md text-sm shadow-sm placeholder-slate-400
focus:outline-none focus:border-sky-500 focus:ring-1 focus:ring-sky-500
disabled:bg-slate-50 disabled:text-slate-500 disabled:border-slate-200 disabled:shadow-none
invalid:border-pink-500 invalid:text-pink-600
focus:invalid:border-pink-500 focus:invalid:ring-pink-500
"
/>
</label>
<!-- ... -->
</form>
html
<form>
<label class="block">
<span class="block text-sm font-medium text-slate-700">Username</span>
<!-- 양식 상태 수정자를 사용하면 클래스가 모든 입력에 대해 동일할 수 있습니다. -->
<input
type="text"
value="tbone"
disabled
class="mt-1 block w-full px-3 py-2 bg-white border border-slate-300 rounded-md text-sm shadow-sm placeholder-slate-400
focus:outline-none focus:border-sky-500 focus:ring-1 focus:ring-sky-500
disabled:bg-slate-50 disabled:text-slate-500 disabled:border-slate-200 disabled:shadow-none
invalid:border-pink-500 invalid:text-pink-600
focus:invalid:border-pink-500 focus:invalid:ring-pink-500
"
/>
</label>
<!-- ... -->
</form>

이러한 종류의 수정자를 사용하면 템플릿에서 조건부 로직의 양을 줄일 수 있습니다. 따라서 입력의 상태에 관계없이 동일한 클래스 집합을 사용할 수 있고 브라우저에서 올바른 스타일을 적용할 수 있습니다.

테일윈드에는 :read-only, :indeterminate, :checked 등과 같은 다른 양식 상태에 대한 수정자도 포함되어 있습니다.

사용 가능한 의사 클래스 수정자의 전체 목록은 의사 클래스 참고를 확인하세요.

부모 상태에 기반한 스타일 지정 (group-{modifier})

일부 부모 요소의 상태에 따라 요소의 스타일을 지정해야 하는 경우, 부모 요소에 group 클래스를 표시하고 group-* 수정자(예: group-hover)를 사용하여 대상 요소에 스타일을 지정합니다.

html
<a
href="#"
class="group block max-w-xs mx-auto rounded-lg p-6 bg-white ring-1 ring-slate-900/5 shadow-lg space-y-3 hover:bg-sky-500 hover:ring-sky-500"
>
<div class="flex items-center space-x-3">
<svg
class="h-6 w-6 stroke-sky-500 group-hover:stroke-white"
fill="none"
viewBox="0 0 24 24"
>
<!-- ... -->
</svg>
<h3 class="text-slate-900 group-hover:text-white text-sm font-semibold">
New project
</h3>
</div>
<p class="text-slate-500 group-hover:text-white text-sm">
Create a new project from a variety of starting templates.
</p>
</a>
html
<a
href="#"
class="group block max-w-xs mx-auto rounded-lg p-6 bg-white ring-1 ring-slate-900/5 shadow-lg space-y-3 hover:bg-sky-500 hover:ring-sky-500"
>
<div class="flex items-center space-x-3">
<svg
class="h-6 w-6 stroke-sky-500 group-hover:stroke-white"
fill="none"
viewBox="0 0 24 24"
>
<!-- ... -->
</svg>
<h3 class="text-slate-900 group-hover:text-white text-sm font-semibold">
New project
</h3>
</div>
<p class="text-slate-500 group-hover:text-white text-sm">
Create a new project from a variety of starting templates.
</p>
</a>

이 패턴은 group-focus, group-active, 심지어 group-odd와 같은 모든 의사 클래스 수정자에서도 작동합니다.

중첩된 그룹 구별하기

그룹을 중첩할 때 group/{name} 클래스를 사용하여 해당 부모 그룹에 고유한 그룹 이름을 지정하고 group-hover/{name}과 같은 클래스를 사용하여 수정자에 해당 이름을 포함하면, 특정 부모 그룹의 상태에 따라 스타일을 지정할 수 있습니다.

html
<ul role="list">
{#each people as person}
<li class="group/item hover:bg-slate-100 ...">
<img src="{person.imageUrl}" alt="" />
<div>
<a href="{person.url}">{person.name}</a>
<p>{person.title}</p>
</div>
<a
class="group/edit invisible hover:bg-slate-200 group-hover/item:visible ..."
href="tel:{person.phone}"
>
<span class="group-hover/edit:text-gray-700 ...">Call</span>
<svg
class="group-hover/edit:translate-x-0.5 group-hover/edit:text-slate-500 ..."
>
<!-- ... -->
</svg>
</a>
</li>
{/each}
</ul>
html
<ul role="list">
{#each people as person}
<li class="group/item hover:bg-slate-100 ...">
<img src="{person.imageUrl}" alt="" />
<div>
<a href="{person.url}">{person.name}</a>
<p>{person.title}</p>
</div>
<a
class="group/edit invisible hover:bg-slate-200 group-hover/item:visible ..."
href="tel:{person.phone}"
>
<span class="group-hover/edit:text-gray-700 ...">Call</span>
<svg
class="group-hover/edit:translate-x-0.5 group-hover/edit:text-slate-500 ..."
>
<!-- ... -->
</svg>
</a>
</li>
{/each}
</ul>

그룹 이름은 원하는 대로 지정할 수 있으며 별도의 설정이 필요 없습니다. 마크업에서 직접 그룹 이름을 지정하기만 하면 테일윈드가 필요한 CSS를 자동으로 생성합니다.

임의 그룹

대괄호 사이의 임의의 값에 자체 선택기를 제공하여 일회성 group-* 수정자를 즉석에서 생성할 수 있습니다.

html
<div class="group is-published">
<div class="hidden group-[.is-published]:block">Published</div>
</div>
html
<div class="group is-published">
<div class="hidden group-[.is-published]:block">Published</div>
</div>

보다 자세한 제어를 위해 & 문자를 사용하여 전달하려는 선택기를 기준으로 최종 선택기에서 .group이 끝나야 하는 위치를 표시할 수 있습니다.

html
<div class="group">
<div class="group-[:nth-of-type(3)_&]:block">
<!-- ... -->
</div>
</div>
html
<div class="group">
<div class="group-[:nth-of-type(3)_&]:block">
<!-- ... -->
</div>
</div>

형제 상태에 따른 스타일 지정 (peer-{modifier})

형제 요소의 상태에 따라 요소의 스타일을 지정해야 하는 경우, 형제 요소에 peer 클래스를 표시하고 peer-* 수정자(예: peer-invalid)를 사용하여 대상 요소에 스타일을 지정합니다.

html
<form>
<label class="block">
<span class="block text-sm font-medium text-slate-700">Email</span>
<input type="email" class="peer ..." />
<p class="mt-2 invisible peer-invalid:visible text-pink-600 text-sm">
Please provide a valid email address.
</p>
</label>
</form>
html
<form>
<label class="block">
<span class="block text-sm font-medium text-slate-700">Email</span>
<input type="email" class="peer ..." />
<p class="mt-2 invisible peer-invalid:visible text-pink-600 text-sm">
Please provide a valid email address.
</p>
</label>
</form>

이를 통해 JS 없이도 떠 있는 레이블과 같은 모든 종류의 깔끔한 수법을 수행할 수 있습니다.

이 패턴은 peer-focus, peer-required, peer-disabled과 같은 모든 의사 클래스 수정자에서 작동합니다.

peer 마커는 CSS에서 일반적인 형제 결합기가 작동하는 방식 때문에 이전 형제에만 사용할 수 있다는 점에 유의해야 합니다.

❌ 작동하지 않음, 이전 형제만 동료로 표시할 수 있음

html
<label>
<span class="peer-invalid:text-red-500 ...">Email</span>
<input type="email" class="peer ..." />
</label>
html
<label>
<span class="peer-invalid:text-red-500 ...">Email</span>
<input type="email" class="peer ..." />
</label>

동료 구별하기

여러 피어를 사용하는 경우, peer/{name} 클래스를 사용하여 해당 동료에 고유한 이름을 지정하고 peer-checked/{name}과 같이 수정자에 해당 이름을 포함시켜 특정 동료의 상태에 어떤 스타일을 지정할 수 있습니다.

html
<fieldset>
<legend>Published status</legend>
<input id="draft" class="peer/draft" type="radio" name="status" checked />
<label for="draft" class="peer-checked/draft:text-sky-500">Draft</label>
<input id="published" class="peer/published" type="radio" name="status" />
<label for="published" class="peer-checked/published:text-sky-500"
>Published</label
>
<div class="hidden peer-checked/draft:block">
Drafts are only visible to administrators.
</div>
<div class="hidden peer-checked/published:block">
Your post will be publicly visible on your site.
</div>
</fieldset>
html
<fieldset>
<legend>Published status</legend>
<input id="draft" class="peer/draft" type="radio" name="status" checked />
<label for="draft" class="peer-checked/draft:text-sky-500">Draft</label>
<input id="published" class="peer/published" type="radio" name="status" />
<label for="published" class="peer-checked/published:text-sky-500"
>Published</label
>
<div class="hidden peer-checked/draft:block">
Drafts are only visible to administrators.
</div>
<div class="hidden peer-checked/published:block">
Your post will be publicly visible on your site.
</div>
</fieldset>

동료 이름은 원하는 대로 지정할 수 있으며 별도의 설정이 필요 없습니다. 마크업에서 직접 동료 이름을 지정하기만 하면 테일윈드가 필요한 CSS를 자동으로 생성합니다.

임의 동료

대괄호 사이의 임의의 값에 자체 선택기를 제공하여 일회성 peer-* 수정자를 즉석에서 생성할 수 있습니다.

html
<form>
<label for="email">Email:</label>
<input id="email" name="email" type="email" class="is-dirty peer" required />
<div class="peer-[.is-dirty]:peer-required:block hidden">
This field is required.
</div>
<!-- ... -->
</form>
html
<form>
<label for="email">Email:</label>
<input id="email" name="email" type="email" class="is-dirty peer" required />
<div class="peer-[.is-dirty]:peer-required:block hidden">
This field is required.
</div>
<!-- ... -->
</form>

보다 자세한 제어를 위해 & 문자를 사용하여 전달하려는 선택기를 기준으로 최종 선택기에서 .peer가 끝나야 하는 위치를 표시할 수 있습니다.

html
<div>
<input type="text" class="peer" />
<div class="hidden peer-[:nth-of-type(3)_&]:block">
<!-- ... -->
</div>
</div>
html
<div>
<input type="text" class="peer" />
<div class="hidden peer-[:nth-of-type(3)_&]:block">
<!-- ... -->
</div>
</div>