Tailwind CSSããªã¢ã³ãã®å æ¬çã¬ã€ãã§ãã€ã³ã¿ã©ã¯ãã£ããªUIã®å¯èœæ§ãæå€§éã«åŒãåºããŸããããç䌌ã¯ã©ã¹ãç¶æ ãgroupãpeerã¹ã¿ã€ãªã³ã°ãåŠã¹ãŸãã
Tailwind CSSããªã¢ã³ãã®ç¿åŸïŒç䌌ã¯ã©ã¹ãšç¶æ ã¹ã¿ã€ãªã³ã°ã®åŸ¹åºè§£èª¬
çŸä»£ã®Webéçºã«ãããŠãèŠãç®ãçŸããã ãã§ãªãããŠãŒã¶ãŒã®ã€ã³ã¿ã©ã¯ã·ã§ã³ã«å¯ŸããŠåçã§ã¬ã¹ãã³ã·ããªãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ãäœæããããšã¯æãéèŠã§ããããããããTailwind CSSã®ãããªãŠãŒãã£ãªãã£ãã¡ãŒã¹ãã®ãã¬ãŒã ã¯ãŒã¯ãç䟡ãçºæ®ããå Žé¢ã§ãããã®ãŠãŒãã£ãªãã£ã¯ã©ã¹ããäœããïŒé©çšããç¹å®ã®ã¹ã¿ã€ã«ã«ãŒã«ïŒãæäŸããã®ã«å¯Ÿããããªã¢ã³ãã¯éèŠãªããã€ããæäŸããŸãã
ããªã¢ã³ãã¯ãéçãªãã¶ã€ã³ãã€ã³ã¿ã©ã¯ãã£ããªäœéšãžãšå€ããç§èš£ã§ãããããã¯ç¹å¥ãªãã¬ãã£ãã¯ã¹ã§ãããèŠçŽ ã®ç¶æ ããŠãŒã¶ãŒã®ã€ã³ã¿ã©ã¯ã·ã§ã³ããããã¯å¥ã®èŠçŽ ã®ç¶æ ã«åºã¥ããŠãæ¡ä»¶ä»ãã§ãŠãŒãã£ãªãã£ã¯ã©ã¹ãé©çšããããšãå¯èœã«ããŸãããã¿ã³ã®è²ããããŒæã«å€æŽãããããã©ãŒã å ¥åããã©ãŒã«ã¹æã«ã¹ã¿ã€ãªã³ã°ãããããã§ãã¯ããã¯ã¹ããã§ãã¯ããããšãã«ã¡ãã»ãŒãžã衚瀺ãããããå Žåã§ããããªã¢ã³ãããã®ããã®ããŒã«ãšãªããŸãã
ãã®å
æ¬çãªã¬ã€ãã¯ãäžçäžã®éçºè
åãã«èšèšãããŠããŸããåºæ¬çãªç䌌ã¯ã©ã¹ã§ããhover
ãfocus
ãããè€éãªã³ã³ããŒãã³ãã®ã€ã³ã¿ã©ã¯ã·ã§ã³ãå®çŸããgroup
ãpeer
ã䜿çšããé«åºŠãªãã¯ããã¯ãŸã§ãTailwind CSSããªã¢ã³ãã®å
šç¯å²ãæ¢æ±ããŸããæåŸãŸã§èªãã°ãæŽç·Žãããç¶æ
èªèåã®ã€ã³ã¿ãŒãã§ãŒã¹ãå®å
šã«HTMLå
ã§æ§ç¯ããããã®ç¥èã身ã«ã€ããŠããã§ãããã
åºæ¬æŠå¿µã®çè§£ïŒããªã¢ã³ããšã¯ïŒ
Tailwind CSSã«ãããããªã¢ã³ãã®æ žå¿ã¯ãã³ãã³ïŒ:
ïŒã§åºåããããŠãŒãã£ãªãã£ã¯ã©ã¹ã«è¿œå ãããã¬ãã£ãã¯ã¹ã§ãããã®ãã¬ãã£ãã¯ã¹ã¯æ¡ä»¶ãšããŠæ©èœããŸãããããä»å ããããŠãŒãã£ãªãã£ã¯ã©ã¹ã¯ããã®æ¡ä»¶ãæºãããããšãã«ã®ã¿é©çšãããŸãã
åºæ¬çãªæ§æã¯ã·ã³ãã«ã§çŽæçã§ãïŒ
variant:utility-class
äŸãã°ãã·ã³ãã«ãªãã¿ã³ãèããŠã¿ãŸããããããã©ã«ãã§ã¯èæ¯ãéã«ãããŠãŒã¶ãŒãããŠã¹ããããŒãããšãã«ã¯ããæ¿ãéã«ããããšããŸããåŸæ¥ã®CSSã§ã¯ã次ã®ããã«èšè¿°ããŸãïŒ
.my-button {
background-color: #3b82f6; /* bg-blue-500 */
}
.my-button:hover {
background-color: #2563eb; /* bg-blue-700 */
}
Tailwindã®ããªã¢ã³ãã䜿ãã°ãåãçµæãHTMLå ã§çŽæ¥å®çŸã§ããã¹ã¿ã€ãªã³ã°ãããŒã¯ã¢ãããšåãå Žæã«é 眮ã§ããŸãïŒ
<button class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded">
Click me
</button>
ããã§ãhover:
ãããªã¢ã³ãã§ããããã¯Tailwindã®Just-In-Time (JIT) ãšã³ãžã³ã«å¯ŸããŠããã¿ã³ã:hover
ç¶æ
ã®ãšãã«ã®ã¿bg-blue-700
ãé©çšããCSSã«ãŒã«ãçæããããã«æç€ºããŸãããã®ã·ã³ãã«ãã€åŒ·åãªæŠå¿µããTailwind CSSã«ããããã¹ãŠã®ã€ã³ã¿ã©ã¯ãã£ããªã¹ã¿ã€ãªã³ã°ã®åºç€ãšãªããŸãã
æãäžè¬çãªããªã¢ã³ãïŒã€ã³ã¿ã©ã¯ãã£ããªç䌌ã¯ã©ã¹
ç䌌ã¯ã©ã¹ã¯ãèŠçŽ ã®ç¹å¥ãªç¶æ ãå®çŸ©ããCSSã»ã¬ã¯ã¿ã§ããTailwindã¯ããŠãŒã¶ãŒã®ã¢ã¯ã·ã§ã³ã«å¿çããããã«æ¥åžžçã«äœ¿çšãããã¹ãŠã®äžè¬çãªç䌌ã¯ã©ã¹ã«å¯Ÿå¿ããããªã¢ã³ããæäŸããŸãã
hover
ããªã¢ã³ãïŒããŠã¹ã«ãŒãœã«ãžã®å¿ç
hover
ããªã¢ã³ãã¯ãééããªãæãé »ç¹ã«äœ¿çšããããã®ã§ãããŠãŒã¶ãŒã®ã«ãŒãœã«ãèŠçŽ ãæããŠãããšãã«ã¹ã¿ã€ã«ãé©çšããŸãããªã³ã¯ããã¿ã³ãã«ãŒãããã®ä»ã¯ãªãã¯å¯èœãªèŠçŽ ã«èŠèŠçãªãã£ãŒãããã¯ãæäŸããããã«äžå¯æ¬ ã§ãã
äŸïŒã€ã³ã¿ã©ã¯ãã£ããªã«ãŒãã³ã³ããŒãã³ã
ãããŒæã«æµ®ãäžãããããéç«ã£ã圱ãä»ãã«ãŒããäœæããŠã¿ãŸããããããã¯çŸä»£ã®UIãã¶ã€ã³ã§ããèŠããããã¿ãŒã³ã§ãã
<div class="p-6 max-w-sm mx-auto bg-white rounded-xl shadow-md
transition-all duration-300
hover:shadow-xl hover:-translate-y-1">
<h3 class="text-xl font-medium text-black">Global Insights</h3>
<p class="text-slate-500">Discover trends from around the world.</p>
</div>
ãã®äŸã§ã¯ïŒ
hover:shadow-xl
ã¯ããããŒæã«box-shadowããã倧ããªãã®ã«å€æŽããŸããhover:-translate-y-1
ã¯ãã«ãŒãããããã«äžã«ç§»åããããæã¡äžããã广ãçã¿åºããŸãã- ç¶æ
å€åãæ»ããã§ã¢ãã¡ãŒã·ã§ã³ã«ããããã«ã
transition-all
ãšduration-300
ã远å ããŸããã
focus
ããªã¢ã³ãïŒã¢ã¯ã»ã·ããªãã£ãšå
¥åã®ããã®ã¹ã¿ã€ãªã³ã°
focus
ããªã¢ã³ãã¯ã¢ã¯ã»ã·ããªãã£ã«ãšã£ãŠéåžžã«éèŠã§ããèŠçŽ ãããŠã¹ã¯ãªãã¯ãŸãã¯ããŒããŒãïŒäŸïŒãTabãããŒïŒã§éžæããããšãã«ã¹ã¿ã€ã«ãé©çšããŸããããã¯ãinputãtextareaãbuttonãªã©ã®ãã©ãŒã èŠçŽ ã§æãäžè¬çã«äœ¿çšãããŸãã
äŸïŒé©åã«ã¹ã¿ã€ã«ããããã©ãŒã å ¥å
æç¢ºãªãã©ãŒã«ã¹ç¶æ ã¯ããŠãŒã¶ãŒã«ããŒãžäžã®çŸåšäœçœ®ãæ£ç¢ºã«äŒããããŒããŒãã®ã¿ã®ããã²ãŒã·ã§ã³ã«ãšã£ãŠäžå¯æ¬ ã§ãã
<label for="email" class="block text-sm font-medium text-gray-700">Email Address</label>
<input type="email" id="email"
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">
focus:
ããªã¢ã³ãã®åœ¹å²ã¯æ¬¡ã®ãšããã§ãïŒ
focus:outline-none
ïŒãã©ãŠã¶ã®ããã©ã«ãã®ãã©ãŒã«ã¹ã¢ãŠãã©ã€ã³ãåé€ããŸããããã¯ãããèŠèŠçã«é åçãªç¬èªã®ã¹ã¿ã€ã«ã«çœ®ãæããããã§ããfocus:border-sky-500
ïŒå¢çç·ã®è²ãæããã¹ã«ã€ãã«ãŒã«å€æŽããŸããfocus:ring-1 focus:ring-sky-500
ïŒåãè²ã®åŸ®ããªå€åŽã®èŒãïŒbox-shadowã®ãªã³ã°ïŒã远å ãããã©ãŒã«ã¹ç¶æ ãããã«éç«ãããŸãã
active
ããªã¢ã³ãïŒã¯ãªãã¯ãšã¿ããã®ææ
active
ããªã¢ã³ãã¯ããŠãŒã¶ãŒã«ãã£ãŠèŠçŽ ãã¢ã¯ãã£ãåãããŠããéïŒäŸãã°ããã¿ã³ãæŒãäžããããŠããéïŒã«é©çšãããŸããããã«ãããã¯ãªãã¯ãã¿ãããç»é²ãããããšãå³åº§ã«ãã£ãŒãããã¯ããŸãã
äŸïŒãæŒãããã广ãæã€ãã¿ã³
<button class="bg-indigo-500 text-white font-semibold py-2 px-4 rounded-lg
shadow-md hover:bg-indigo-600 focus:outline-none
focus:ring-2 focus:ring-indigo-400 focus:ring-opacity-75
active:bg-indigo-700 active:translate-y-0.5">
Submit
</button>
ãã®åŒ·åããããã¿ã³ã§ã¯ïŒ
active:bg-indigo-700
ã¯ããã¿ã³ãæŒãããŠããéããã¿ã³ãããã«æãããŸããactive:translate-y-0.5
ã¯ããã¿ã³ããããã«äžã«æŒãäžããç©ççã«æŒã蟌ãŸãã广ãçã¿åºããŸãã
ãã®ä»ã®ã€ã³ã¿ã©ã¯ãã£ãããªã¢ã³ãïŒfocus-within
ãšfocus-visible
focus-within
ïŒãã®äŸ¿å©ãªããªã¢ã³ãã¯ã*å*èŠçŽ ã®ããããããã©ãŒã«ã¹ãåãåã£ããšãã«ã*芪*èŠçŽ ã«ã¹ã¿ã€ã«ãé©çšããŸãããŠãŒã¶ãŒãå
¥åãã£ãŒã«ããæäœããŠãããšãã«ããã©ãŒã ã°ã«ãŒãå
šäœãã¹ã¿ã€ãªã³ã°ããã®ã«æé©ã§ãã
<div class="flex items-center space-x-2 p-4 border rounded-lg focus-within:border-blue-500 focus-within:ring-1 focus-within:ring-blue-500">
<!-- SVG Icon -->
<svg class="h-6 w-6 text-gray-400">...</svg>
<input type="text" placeholder="Search..." class="outline-none">
</div>
ããã«ããããŠãŒã¶ãŒã<input>
ã«ãã©ãŒã«ã¹ãããšã芪ã®<div>
å
šäœã«éãå¢çç·ãšãªã³ã°ã衚瀺ãããŸãã
focus-visible
ïŒãã©ãŠã¶ã¯ããã€ãã©ãŒã«ã¹ãªã³ã°ã衚瀺ãããã«ã€ããŠç°ãªããã¥ãŒãªã¹ãã£ãã¯ãæã£ãŠããŸããäŸãã°ãããŠã¹ã¯ãªãã¯åŸã®ãã¿ã³ã«ã¯è¡šç€ºããªããããããŸããããããŒããŒãããã²ãŒã·ã§ã³åŸã«ã¯è¡šç€ºããŸããfocus-visible
ããªã¢ã³ãã䜿çšãããšããã®ããã¹ããŒããªåäœã掻çšã§ããŸããäžè¬çã«ãããŠã¹ãšããŒããŒãã®äž¡æ¹ã®ãŠãŒã¶ãŒã«ããè¯ããŠãŒã¶ãŒäœéšãæäŸããããã«ãã¢ãŠãã©ã€ã³ããªã³ã°ã®ã¹ã¿ã€ãªã³ã°ã«ã¯focus
ã®ä»£ããã«focus-visible
ã䜿çšããããšãæšå¥šãããŸãã
ç¶æ ã«åºã¥ãã¹ã¿ã€ãªã³ã°ïŒãã©ãŒã ãšUIèŠçŽ ã®ããªã¢ã³ã
çŽæ¥çãªãŠãŒã¶ãŒã€ã³ã¿ã©ã¯ã·ã§ã³ä»¥å€ã«ããèŠçŽ ã¯ãã®å±æ§ã«åºã¥ããŠç¶æ ãæã€ããšããããããŸããTailwindã¯ããããã®ç¶æ ã宣èšçã«ã¹ã¿ã€ãªã³ã°ããããã®ããªã¢ã³ããæäŸããŸãã
disabled
ããªã¢ã³ãïŒå©çšäžå¯ã®äŒé
ãã¿ã³ããã©ãŒã å
¥åã«disabled
屿§ãããå Žåããããã¯æäœã§ããŸãããdisabled
ããªã¢ã³ãã䜿çšãããšããã®ç¶æ
ãã¹ã¿ã€ãªã³ã°ããŠãŠãŒã¶ãŒã«èŠèŠçã«æç¢ºã«äŒããããšãã§ããŸãã
<button disabled class="bg-slate-300 text-slate-500 font-bold py-2 px-4 rounded cursor-not-allowed
disabled:opacity-50">
Processing...
</button>
ããã§ãdisabled:opacity-50
ã¯ãdisabled
屿§ãååšãããšãã«ãã¿ã³ã®äžéæåºŠãäžããŸããããã¯éã¢ã¯ãã£ãç¶æ
ã瀺ãäžè¬çãªæ
£äŸã§ããcursor-not-allowed
ãŠãŒãã£ãªãã£ã¯ãããããã«åŒ·èª¿ããŸãã
checked
ããªã¢ã³ãïŒãã§ãã¯ããã¯ã¹ãšã©ãžãªãã¿ã³çš
checked
ããªã¢ã³ãã¯ãã«ã¹ã¿ã ã®ãã§ãã¯ããã¯ã¹ãã©ãžãªãã¿ã³ãäœæããããã«äžå¯æ¬ ã§ããå
¥åã®checked
屿§ãtrueã®ãšãã«ã¹ã¿ã€ã«ãé©çšããŸãã
äŸïŒã«ã¹ã¿ã ã¹ã¿ã€ã«ããããã§ãã¯ããã¯ã¹
<label class="flex items-center space-x-3">
<input type="checkbox" class="appearance-none h-5 w-5 border border-gray-300 rounded-md
checked:bg-blue-600 checked:border-transparent">
<span class="text-gray-900 font-medium">Accept terms and conditions</span>
</label>
appearance-none
ã䜿çšããŠãã©ãŠã¶ã®ããã©ã«ãã¹ã¿ã€ãªã³ã°ãåé€ããchecked:
ããªã¢ã³ãã䜿çšããŠããã¯ã¹ããã§ãã¯ããããšãã®èæ¯è²ã倿ŽããŸãããã®ããªã¢ã³ããš::before
ã::after
ç䌌èŠçŽ ãçµã¿åãããããšã§ããã§ãã¯ããŒã¯ã®ã¢ã€ã³ã³ã远å ããããšãã§ããŸãã
ãã©ãŒã ããªããŒã·ã§ã³ããªã¢ã³ãïŒrequired
ãoptional
ãvalid
ãinvalid
çŸä»£ã®ãã©ãŒã ã¯ãªã¢ã«ã¿ã€ã ã®ããªããŒã·ã§ã³ãã£ãŒãããã¯ãæäŸããŸããTailwindã®ããªããŒã·ã§ã³ããªã¢ã³ãã¯ããã©ãŠã¶ã®å¶çŽæ€èšŒAPIãæŽ»çšããŸãããããã®ããªã¢ã³ãã¯ãrequired
ãªã©ã®å±æ§ããå
¥åå€ã®çŸåšã®æå¹æ§ç¶æ
ïŒäŸïŒtype="email"
ã®å ŽåïŒã«åºã¥ããŠé©çšãããŸãã
<input type="email" required
class="border rounded-md px-3 py-2
invalid:border-pink-500 invalid:text-pink-600
focus:invalid:border-pink-500 focus:invalid:ring-pink-500
valid:border-green-500">
ãã®å ¥åãã£ãŒã«ãã¯æ¬¡ã®ããã«ãªããŸãïŒ
- å
容ãæå¹ãªã¡ãŒã«ã¢ãã¬ã¹ã§ãªãå Žåããã³ã¯ã®å¢çç·ãšããã¹ãã«ãªããŸãïŒ
invalid:
ïŒã - æå¹ãªã¡ãŒã«ã¢ãã¬ã¹ãå
¥åããããšãç·ã®å¢çç·ã«ãªããŸãïŒ
valid:
ïŒã - ãã£ãŒã«ããç¡å¹ãªç¶æ
ã§ãã©ãŒã«ã¹ããããšããã©ãŒã«ã¹ãªã³ã°ããã³ã¯ã«ãªããŸãïŒ
focus:invalid:
ïŒã
é«åºŠãªã€ã³ã¿ã©ã¯ãã£ããã£ïŒ`group`ãš`peer`ããªã¢ã³ã
æã«ã¯ã*å¥ã®*èŠçŽ ã®ç¶æ
ã«åºã¥ããŠèŠçŽ ãã¹ã¿ã€ãªã³ã°ããå¿
èŠããããŸããããã§åŒ·åãªgroup
ãšpeer
ã®æŠå¿µãç»å ŽããŸãããããã¯ã以åã¯ãŠãŒãã£ãªãã£ã¯ã©ã¹ã ãã§ã¯å¯ŸåŠãå°é£ã ã£ãUIã®èª²é¡ã解決ããŸãã
`group`ã®åïŒèŠªã®ç¶æ ã«å¿ããåã®ã¹ã¿ã€ãªã³ã°
group
ããªã¢ã³ãã䜿çšãããšã芪èŠçŽ ã®ç¶æ
ã«åºã¥ããŠåèŠçŽ ãã¹ã¿ã€ãªã³ã°ã§ããŸããããã䜿çšããã«ã¯ã远跡ããã芪èŠçŽ ã«group
ã¯ã©ã¹ã远å ããŸãããã®åŸãä»»æã®åèŠçŽ ã§group-hover
ãgroup-focus
ãªã©ã®ããªã¢ã³ãã䜿çšã§ããŸãã
äŸïŒãããŒæã«ã¿ã€ãã«ãšã¢ã€ã³ã³ã®è²ãäžç·ã«å€ããã«ãŒã
<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 Icon -->
<svg class="h-6 w-6 stroke-sky-500 group-hover:stroke-white">...</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 templates.</p>
</a>
ä»çµã¿ïŒ
- 芪ã®
<a>
ã¿ã°ã«group
ã¯ã©ã¹ã远å ããŸãã - ãŠãŒã¶ãŒããªã³ã¯å
šäœã«ãããŒãããšã
hover:bg-sky-500
ã«ãã£ãŠèæ¯è²ãå€ãããŸãã - åæã«ãSVGã®
group-hover:stroke-white
ã¯ã©ã¹ãšããã¹ãèŠçŽ ã®group-hover:text-white
ãã¢ã¯ãã£ãã«ãªãããããã®è²ãçœã«å€ãããŸãã
ããã«ãããã«ã¹ã¿ã CSSãJavaScriptããªããã°å®çŸã§ããªãã£ããäžè²«æ§ã®ããå šäœçãªãããŒå¹æãäœæãããŸãã
`peer`ã«ããå åŒèŠçŽ ã®ã¹ã¿ã€ãªã³ã°ïŒãã©ãŒã ã®åžžèãå€ãã
peer
ããªã¢ã³ãã¯group
ã«äŒŒãŠããŸãããå
åŒèŠçŽ ã®ã¹ã¿ã€ãªã³ã°ã«æ©èœããŸããããèŠçŽ ã«peer
ã¯ã©ã¹ã远å ãããšããã®ããã¢ãã®ç¶æ
ã«åºã¥ããŠ*åŸç¶ã®*å
åŒèŠçŽ ã§peer-checked
ãpeer-invalid
ãªã©ã®ããªã¢ã³ãã䜿çšã§ããŸããããã¯ã«ã¹ã¿ã ãã©ãŒã ã³ã³ãããŒã«ã«éåžžã«åœ¹ç«ã¡ãŸãã
äŸïŒé¢é£ãããã§ãã¯ããã¯ã¹ããã§ãã¯ããããšãã«å€åããã©ãã«
<label class="relative inline-flex items-center cursor-pointer">
<input type="checkbox" class="sr-only peer">
<div class="w-11 h-6 bg-gray-200 rounded-full
peer-focus:ring-4 peer-focus:ring-blue-300
peer-checked:after:translate-x-full peer-checked:after:border-white
after:content-[''] after:absolute after:top-0.5 after:left-[2px]
after:bg-white after:border-gray-300 after:border after:rounded-full
after:h-5 after:w-5 after:transition-all
peer-checked:bg-blue-600"></div>
<span class="ml-3 text-sm font-medium text-gray-900 peer-checked:text-blue-600">
Enable Notifications
</span>
</label>
ããã¯ãJavaScriptãäžå䜿ããã«æ§ç¯ããããå®å šã§ã¢ã¯ã»ã·ãã«ãªãã°ã«ã¹ã€ããã§ãïŒ
- å®éã®ãã§ãã¯ããã¯ã¹
<input>
ã¯sr-only
ã§èŠèŠçã«é ããïŒã¹ã¯ãªãŒã³ãªãŒããŒã«ã¯åŒãç¶ãã¢ã¯ã»ã¹å¯èœã§ãïŒãpeer
ãšããŠããŒã¯ãããŠããŸãã - èŠèŠçãªãã°ã«ã¹ã€ããã¯ããã³ãã«ä»ãã®ãã©ãã¯ã®ããã«èŠããããã«ã¹ã¿ã€ã«ããã
<div>
ã§ãïŒ::after
ç䌌èŠçŽ ã䜿çšïŒã peer-checked:bg-blue-600
ã¯ãé ããããã§ãã¯ããã¯ã¹ããã§ãã¯ããããšãã«ãã©ãã¯ã®èæ¯è²ã倿ŽããŸããpeer-checked:after:translate-x-full
ã¯ããã§ãã¯ããã¯ã¹ããã§ãã¯ããããšãã«ãã³ãã«ãå³ã«ã¹ã©ã€ããããŸããpeer-checked:text-blue-600
ã¯ãå åŒèŠçŽ ã§ãã<span>
ã©ãã«ããã¹ãã®è²ã倿ŽããŸãã
ããªã¢ã³ãã®çµã¿åããã«ãã詳现ãªå¶åŸ¡
Tailwindã®æã匷åãªæ©èœã®1ã€ã¯ãããªã¢ã³ããé£çµããèœåã§ããããã«ãããéåžžã«å ·äœçãªæ¡ä»¶ä»ãã¹ã¿ã€ã«ãäœæã§ããŸãã
ã¬ã¹ãã³ã·ããšç¶æ ããªã¢ã³ãïŒæåŒ·ã®ã³ã³ã
ã¬ã¹ãã³ã·ããã¬ãã£ãã¯ã¹ïŒmd:
ãlg:
ãªã©ïŒãšç¶æ
ããªã¢ã³ããçµã¿åãããããšã§ãç¹å®ã®ç»é¢ãµã€ãº*ãã€*ç¹å®ã®ç¶æ
ã§ã®ã¿ã¹ã¿ã€ã«ãé©çšã§ããŸããã¬ã¹ãã³ã·ãããªã¢ã³ãã¯åžžã«å
ã«èšè¿°ããŸãã
æ§æïŒ breakpoint:state:utility-class
<button class="bg-blue-500 text-white p-2 rounded
hover:bg-blue-600
md:bg-green-500 md:hover:bg-green-600">
Responsive Button
</button>
ãã®ãã¿ã³ã¯æ¬¡ã®ããã«ãªããŸãïŒ
- å°ããç»é¢ã§ã¯éè²ã§ããããŒãããšããæ¿ãéè²ã«å€ãããŸãã
- äžãããã®ç»é¢ä»¥äžã§ã¯ç·è²ã§ïŒ
md:bg-green-500
ïŒããããŒãããšããæ¿ãç·è²ã«å€ãããŸãïŒmd:hover:bg-green-600
ïŒã
è€æ°ã®ç¶æ ããªã¢ã³ãã®ã¹ã¿ãã¯
è€æ°ã®ç¶æ ããªã¢ã³ããéããŠããã¹ãŠã®æ¡ä»¶ãæºãããããšãã«ã®ã¿ã¹ã¿ã€ã«ãé©çšããããšãã§ããŸããããã¯ã€ã³ã¿ã©ã¯ã·ã§ã³ã®åŸ®èª¿æŽã«åœ¹ç«ã¡ãŸãã
äŸïŒãããŒãšãã©ãŒã«ã¹ã«ç°ãªãåå¿ãããããŒã¯ã¢ãŒããã¿ã³
<button class="p-2 rounded-full text-gray-400
dark:text-gray-500
hover:text-gray-600 dark:hover:text-gray-300
focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-gray-500
dark:focus:ring-offset-gray-900 dark:focus:ring-gray-400
dark:hover:focus:ring-gray-200">
<!-- Icon here -->
</button>
ããã§ãdark:hover:focus:ring-gray-200
ã¯ãããŒã¯ã¢ãŒããã¢ã¯ãã£ãã§ããã¿ã³ããããŒãããŠããã*ãã€*ãã©ãŒã«ã¹ãããŠããå Žåã«ã®ã¿ç¹å®ã®ãªã³ã°ã«ã©ãŒãé©çšããŸããç¶æ
ããªã¢ã³ãã®é åºã¯éåžžåé¡ã«ãªããŸãããTailwindããã®çµã¿åããã«å¯Ÿå¿ããæ£ããCSSã»ã¬ã¯ã¿ãçæããããã§ãã
ã«ã¹ã¿ãã€ãºãšåå¥å¯Ÿå¿
Tailwindã¯æšæºã§å æ¬çãªããªã¢ã³ãã»ãããæäŸããŠããŸãããæã«ã¯ãã詳现ãªå¶åŸ¡ãå¿ èŠã«ãªãããšããããŸãã
ä»»æããªã¢ã³ãã®äœ¿çš
çµã¿èŸŒã¿ã®ããªã¢ã³ãã§ã«ããŒãããŠããªãCSSã»ã¬ã¯ã¿ãå¿ èŠãªåå¥ã®å Žåã«ã¯ãä»»æããªã¢ã³ãã䜿çšã§ããŸããããã¯éåžžã«åŒ·åãªç·æ¥é¿é£çã§ãããclass屿§å ã«è§æ¬åŒ§ã§å²ãã§ã«ã¹ã¿ã ã»ã¬ã¯ã¿ãçŽæ¥èšè¿°ããããšãã§ããŸãã
äŸïŒãªã¹ãé ç®ãç°ãªãæ¹æ³ã§ã¹ã¿ã€ãªã³ã°ãã
<ul>
<li class="[&:nth-child(odd)]:bg-gray-100 p-2">First item</li>
<li class="[&:nth-child(odd)]:bg-gray-100 p-2">Second item</li>
<li class="[&:nth-child(odd)]:bg-gray-100 p-2">Third item</li>
</ul>
ã¯ã©ã¹[&:nth-child(odd)]:bg-gray-100
ã¯li:nth-child(odd)
çšã®CSSãçæããåé
ç®ã«äœåãªã¯ã©ã¹ã远å ããããšãªãçžæš¡æ§ã®ãªã¹ããäœæããŸãã
ããäžã€ã®äžè¬çãªäœ¿çšæ³ã¯ãçŽæ¥ã®åå«ã®ã¹ã¿ã€ãªã³ã°ã§ãïŒ
<div class="[&_>_p]:mt-4">
<p>First paragraph.</p>
<p>Second paragraph. This will have a top margin.</p>
<div><p>Nested paragraph. This will NOT have a top margin.</p></div>
</div>
ã¯ã©ã¹[&_>_p]:mt-4
ã¯ãdivã®çŽæ¥ã®åã§ãã`p`èŠçŽ ã®ã¿ãã¹ã¿ã€ãªã³ã°ããŸãã
`tailwind.config.js`ã§ã®ããªã¢ã³ãèšå®
ããã©ã«ãã§ã¯ãTailwindã®JITãšã³ãžã³ã¯ãã¹ãŠã®ã³ã¢ãã©ã°ã€ã³ã«å¯ŸããŠãã¹ãŠã®ããªã¢ã³ããæå¹ã«ããŸãããããããµãŒãããŒãã£ã®ãã©ã°ã€ã³ã§ããªã¢ã³ããæå¹ã«ããããã«ã¹ã¿ã ããªã¢ã³ããç»é²ãããå Žåã¯ãtailwind.config.js
ãã¡ã€ã«ã䜿çšããå¿
èŠããããŸãã
// tailwind.config.js
module.exports = {
// ...
plugins: [
function({ addVariant }) {
addVariant('child', '& > *');
addVariant('child-hover', '& > *:hover');
}
],
}
ãã®ã«ã¹ã¿ã ãã©ã°ã€ã³ã¯ãæ°ããchild
ããã³child-hover
ããªã¢ã³ãã远å ããŸãããããã䜿çšãããšãäŸãã°child:text-red-500
ã®ããã«ããŠãèŠçŽ ã®ãã¹ãŠã®çŽæ¥ã®åãã¹ã¿ã€ãªã³ã°ã§ããŸãã
çµè«ïŒç¶æ é§åUIã®å
Tailwind CSSã®ããªã¢ã³ãã¯åãªãäŸ¿å©æ©èœã§ã¯ãããŸããããããã¯ãŠãŒãã£ãªãã£ãã¡ãŒã¹ãå²åŠã®åºæ¬çãªéšåã§ããèŠçŽ ã®ããããæœåšçãªç¶æ ã«ãããå€èгãHTMLå ã§çŽæ¥èšè¿°ã§ããããã«ããããšã§ãããªã¢ã³ãã¯è€éã§å ç¢ããã€ä¿å®æ§ã®é«ããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ã®æ§ç¯ãæ¯æŽããŸãã
åçŽãªhover
广ãããpeer-checked
ã§æ§ç¯ãããè€éãªãã©ãŒã ã³ã³ãããŒã«ãã¬ã¹ãã³ã·ããªè€æ°ç¶æ
ã®çµã¿åãããŸã§ããã¶ã€ã³ãå
·çŸåããããã®å
æ¬çãªããŒã«ããããæã«å
¥ããŸããããããã¯ãæ§é ãã¹ã¿ã€ã«ãç¶æ
ãšãã£ããã¹ãŠã®ããžãã¯ãäžç®æã«ã«ãã»ã«åãããã³ã³ããŒãã³ãããŒã¹ã®èãæ¹ãä¿é²ããŸãã
ç§ãã¡ã¯åºæ¬ãåŠã³ãé«åºŠãªãã¯ããã¯ãæ¢æ±ããŸããããæ ã¯ããã§çµããã§ã¯ãããŸãããããªã¢ã³ãããã¹ã¿ãŒããæåã®æ¹æ³ã¯ããããã䜿ãããšã§ããçµã¿åããã詊ããå ¬åŒã®Tailwind CSSããã¥ã¡ã³ãã§å šãªã¹ããæ¢æ±ããã«ã¹ã¿ã CSSãJavaScriptã«é Œããã«ã€ã³ã¿ã©ã¯ãã£ããªã³ã³ããŒãã³ããæ§ç¯ããããšã«ææŠããŠãã ãããç¶æ é§åã¹ã¿ã€ãªã³ã°ã®åãåãå ¥ããããšã§ãäžçäžã®ãŠãŒã¶ãŒã®ããã«ããéããããäžè²«æ§ããããããæ¥œãããŠãŒã¶ãŒäœéšãæ§ç¯ã§ããããã«ãªãã§ãããã