Buka potensi penuh UI interaktif dengan panduan komprehensif kami tentang varian Tailwind CSS. Pelajari penataan pseudo-class, state, group, dan peer.
Menguasai Varian Tailwind CSS: Kupas Tuntas Pseudo-Class dan Penataan State
Dalam pengembangan web modern, menciptakan antarmuka pengguna yang tidak hanya menarik secara visual tetapi juga dinamis dan responsif terhadap interaksi pengguna adalah hal yang terpenting. Di sinilah kekuatan sejati dari kerangka kerja utility-first seperti Tailwind CSS bersinar. Sementara kelas utilitasnya menyediakan "apa"—aturan gaya spesifik yang akan diterapkan—variannya menyediakan "kapan" yang krusial.
Varian adalah resep rahasia yang mengubah desain statis menjadi pengalaman interaktif. Varian adalah prefiks khusus yang memungkinkan Anda menerapkan kelas utilitas secara kondisional, berdasarkan state elemen, interaksi pengguna, atau bahkan state dari elemen yang berbeda. Baik itu mengubah warna tombol saat di-hover, menata input formulir saat difokuskan, atau menampilkan pesan saat kotak centang dicentang, varian adalah alat yang tepat untuk pekerjaan itu.
Panduan komprehensif ini dirancang untuk para pengembang di seluruh dunia. Kita akan menjelajahi spektrum penuh varian Tailwind CSS, dari pseudo-class fundamental seperti hover
dan focus
hingga teknik lanjutan menggunakan group
dan peer
untuk interaksi komponen yang kompleks. Pada akhirnya, Anda akan memiliki pengetahuan untuk membangun antarmuka yang canggih dan sadar-state sepenuhnya di dalam HTML Anda.
Memahami Konsep Inti: Apa itu Varian?
Pada intinya, varian di Tailwind CSS adalah sebuah prefiks yang Anda tambahkan ke kelas utilitas, dipisahkan oleh titik dua (:
). Prefiks ini bertindak sebagai sebuah kondisi. Kelas utilitas yang mengikutinya hanya akan diterapkan ketika kondisi tersebut terpenuhi.
Sintaks dasarnya sederhana dan intuitif:
varian:kelas-utilitas
Sebagai contoh, bayangkan sebuah tombol sederhana. Anda mungkin ingin latar belakangnya berwarna biru secara default, tetapi menjadi biru yang lebih gelap saat pengguna mengarahkan mouse ke atasnya. Dalam CSS tradisional, Anda akan menulis:
.my-button {
background-color: #3b82f6; /* bg-blue-500 */
}
.my-button:hover {
background-color: #2563eb; /* bg-blue-700 */
}
Dengan varian Tailwind, Anda mencapai hasil yang sama langsung di HTML Anda, menjaga penataan gaya tetap berdampingan dengan markup Anda:
<button class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded">
Klik saya
</button>
Di sini, hover:
adalah variannya. Ini memberitahu mesin Just-In-Time (JIT) Tailwind untuk menghasilkan aturan CSS yang menerapkan bg-blue-700
hanya ketika tombol berada dalam state :hover
. Konsep sederhana namun kuat ini adalah fondasi untuk semua penataan interaktif di Tailwind CSS.
Varian Paling Umum: Pseudo-Class Interaktif
Pseudo-class adalah selektor CSS yang mendefinisikan state khusus dari sebuah elemen. Tailwind menyediakan varian untuk semua pseudo-class umum yang Anda gunakan sehari-hari untuk merespons tindakan pengguna.
Varian hover
: Merespons Kursor Mouse
Varian hover
bisa dibilang yang paling sering digunakan. Ini menerapkan gaya ketika kursor pengguna menunjuk ke sebuah elemen. Ini penting untuk memberikan umpan balik visual pada tautan, tombol, kartu, dan elemen lain yang dapat diklik.
Contoh: Komponen kartu interaktif
Mari kita buat kartu yang terangkat dan mendapatkan bayangan yang lebih menonjol saat di-hover, sebuah pola umum dalam desain UI modern.
<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">Wawasan Global</h3>
<p class="text-slate-500">Temukan tren dari seluruh dunia.</p>
</div>
Dalam contoh ini:
hover:shadow-xl
mengubah box-shadow menjadi yang lebih besar saat di-hover.hover:-translate-y-1
menggerakkan kartu sedikit ke atas, menciptakan efek "mengangkat".- Kami menambahkan
transition-all
danduration-300
untuk membuat perubahan state menjadi mulus dan beranimasi.
Varian focus
: Penataan untuk Aksesibilitas dan Input
Varian focus
sangat penting untuk aksesibilitas. Ini menerapkan gaya ketika sebuah elemen dipilih, baik dengan mengkliknya dengan mouse atau dengan menavigasi ke sana menggunakan keyboard (misalnya, dengan tombol 'Tab'). Ini paling umum digunakan pada elemen formulir seperti input, textarea, dan tombol.
Contoh: Input formulir yang ditata dengan baik
State fokus yang jelas memberitahu pengguna di mana tepatnya mereka berada di halaman, yang sangat penting untuk navigasi hanya-keyboard.
<label for="email" class="block text-sm font-medium text-gray-700">Alamat Email</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">
Inilah yang dilakukan oleh varian focus:
:
focus:outline-none
: Menghapus outline fokus default dari browser. Kami melakukan ini untuk menggantinya dengan gaya kami sendiri yang lebih menarik secara visual.focus:border-sky-500
: Mengubah warna border menjadi biru langit yang cerah.focus:ring-1 focus:ring-sky-500
: Menambahkan efek glow luar yang halus (sebuah ring box-shadow) dengan warna yang sama, membuat state fokus menjadi lebih menonjol.
Varian active
: Menangkap Klik dan Ketukan
Varian active
berlaku ketika sebuah elemen sedang diaktifkan oleh pengguna—misalnya, saat tombol sedang ditekan. Ini memberikan umpan balik langsung bahwa klik atau ketukan telah terdaftar.
Contoh: Tombol dengan efek "ditekan"
<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">
Kirim
</button>
Pada tombol yang disempurnakan ini:
active:bg-indigo-700
membuat tombol menjadi lebih gelap saat sedang ditekan.active:translate-y-0.5
mendorong tombol sedikit ke bawah, menciptakan efek fisik seperti ditekan.
Varian Interaktif Lainnya: focus-within
dan focus-visible
focus-within
: Varian yang berguna ini menerapkan gaya ke elemen *induk* setiap kali salah satu elemen *anak*nya menerima fokus. Ini sempurna untuk menata seluruh grup formulir ketika pengguna berinteraksi dengan input di dalamnya.
<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">
<!-- Ikon SVG -->
<svg class="h-6 w-6 text-gray-400">...</svg>
<input type="text" placeholder="Cari..." class="outline-none">
</div>
Sekarang, ketika pengguna fokus pada <input>
, seluruh <div>
induknya akan mendapatkan border dan ring biru.
focus-visible
: Browser memiliki heuristik yang berbeda untuk kapan harus menampilkan ring fokus. Misalnya, mereka mungkin tidak menampilkannya pada tombol setelah klik mouse, tetapi akan menampilkannya setelah navigasi keyboard. Varian focus-visible
memungkinkan Anda memanfaatkan perilaku yang lebih cerdas ini. Umumnya disarankan untuk menggunakan focus-visible
daripada focus
untuk penataan outline/ring untuk memberikan pengalaman pengguna yang lebih baik bagi pengguna mouse dan keyboard.
Penataan Berdasarkan State: Varian untuk Form dan Elemen UI
Selain interaksi pengguna langsung, elemen sering kali memiliki state berdasarkan atributnya. Tailwind menyediakan varian untuk menata state ini secara deklaratif.
Varian disabled
: Mengomunikasikan Ketidaktersediaan
Ketika sebuah tombol atau input formulir memiliki atribut disabled
, ia tidak dapat diinteraksikan. Varian disabled
memungkinkan Anda untuk menata state ini agar terlihat jelas bagi pengguna.
<button disabled class="bg-slate-300 text-slate-500 font-bold py-2 px-4 rounded cursor-not-allowed
disabled:opacity-50">
Memproses...
</button>
Di sini, disabled:opacity-50
mengurangi opasitas tombol ketika atribut disabled
ada, sebuah konvensi umum untuk menunjukkan state tidak aktif. Utilitas cursor-not-allowed
semakin memperkuat hal ini.
Varian checked
: Untuk Checkbox dan Radio Button
Varian checked
sangat penting untuk membuat checkbox dan radio button kustom. Ini menerapkan gaya ketika atribut checked
dari input bernilai true.
Contoh: Checkbox dengan gaya kustom
<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">Setujui syarat dan ketentuan</span>
</label>
Kami menggunakan appearance-none
untuk menghapus gaya default browser, dan kemudian menggunakan varian checked:
untuk mengubah warna latar belakang saat kotak dicentang. Anda bahkan bisa menambahkan ikon tanda centang menggunakan pseudo-elemen ::before
atau ::after
yang dikombinasikan dengan varian ini.
Varian Validasi Form: required
, optional
, valid
, invalid
Formulir modern memberikan umpan balik validasi secara real-time. Varian validasi Tailwind memanfaatkan API validasi batasan dari browser. Varian ini berlaku berdasarkan atribut seperti required
dan state validitas saat ini dari nilai input (misalnya, untuk 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">
Bidang input ini akan memiliki:
- Border dan teks berwarna pink jika isinya bukan alamat email yang valid (
invalid:
). - Border hijau setelah alamat email yang valid dimasukkan (
valid:
). - Ring fokus juga akan berubah menjadi pink jika bidang tersebut difokuskan saat tidak valid (
focus:invalid:
).
Interaktivitas Tingkat Lanjut: Varian `group` dan `peer`
Terkadang, Anda perlu menata sebuah elemen berdasarkan state dari elemen yang *berbeda*. Di sinilah konsep group
dan peer
yang kuat berperan. Mereka memecahkan seluruh kelas tantangan UI yang sebelumnya sulit ditangani hanya dengan kelas utilitas.
Kekuatan `group`: Menata Elemen Anak Berdasarkan State Induk
Varian group
memungkinkan Anda menata elemen anak berdasarkan state dari elemen induk. Untuk menggunakannya, Anda menambahkan kelas group
ke elemen induk yang ingin Anda lacak. Kemudian, pada elemen anak mana pun, Anda dapat menggunakan varian seperti group-hover
, group-focus
, dll.
Contoh: Sebuah kartu dengan judul dan ikon yang warnanya berubah bersamaan saat di-hover
<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">
<!-- Ikon SVG -->
<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">Proyek Baru</h3>
</div>
<p class="text-slate-500 group-hover:text-white text-sm">Buat proyek baru dari berbagai templat.</p>
</a>
Cara kerjanya:
- Kami menambahkan kelas
group
ke tag<a>
induk. - Ketika pengguna mengarahkan kursor ke seluruh tautan, warna latar belakangnya berubah berkat
hover:bg-sky-500
. - Secara bersamaan, kelas
group-hover:stroke-white
pada SVG dangroup-hover:text-white
pada elemen teks diaktifkan, mengubah warnanya menjadi putih.
Ini menciptakan efek hover yang kohesif dan holistik yang jika tidak akan memerlukan CSS kustom atau JavaScript.
Penataan Sibling dengan `peer`: Pengubah Permainan untuk Form
Varian peer
mirip dengan group
, tetapi bekerja untuk menata elemen sibling (saudara). Anda menambahkan kelas peer
ke sebuah elemen, dan kemudian Anda dapat menggunakan varian seperti peer-checked
atau peer-invalid
pada elemen sibling *berikutnya* untuk menatanya berdasarkan state dari "peer". Ini sangat berguna untuk kontrol formulir kustom.
Contoh: Sebuah label yang berubah ketika checkbox terkait dicentang
<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">
Aktifkan Notifikasi
</span>
</label>
Ini adalah sakelar toggle yang lengkap dan dapat diakses yang dibangun tanpa JavaScript sama sekali!
- Checkbox
<input>
yang sebenarnya disembunyikan secara visual dengansr-only
(masih dapat diakses oleh pembaca layar) dan ditandai sebagaipeer
. - Sakelar toggle visual adalah sebuah
<div>
yang ditata agar terlihat seperti lintasan dengan pegangan (menggunakan pseudo-elemen::after
). peer-checked:bg-blue-600
mengubah warna latar belakang lintasan saat checkbox yang tersembunyi dicentang.peer-checked:after:translate-x-full
menggeser pegangan ke kanan saat checkbox dicentang.peer-checked:text-blue-600
mengubah warna teks label<span>
yang merupakan sibling-nya.
Menggabungkan Varian untuk Kontrol Granular
Salah satu fitur paling kuat dari Tailwind adalah kemampuan untuk merangkai varian bersama-sama. Ini memungkinkan pembuatan gaya kondisional yang sangat spesifik.
Varian Responsif dan State: Duet Dinamis
Anda dapat menggabungkan prefiks responsif (seperti md:
, lg:
) dengan varian state untuk menerapkan gaya hanya pada ukuran layar tertentu *dan* dalam state tertentu. Varian responsif selalu didahulukan.
Sintaks: breakpoint:state:kelas-utilitas
<button class="bg-blue-500 text-white p-2 rounded
hover:bg-blue-600
md:bg-green-500 md:hover:bg-green-600">
Tombol Responsif
</button>
Tombol ini akan:
- Berwarna biru di layar kecil, berubah menjadi biru lebih gelap saat di-hover.
- Berwarna hijau di layar medium dan lebih besar (
md:bg-green-500
), berubah menjadi hijau lebih gelap saat di-hover (md:hover:bg-green-600
).
Menumpuk Beberapa Varian State
Anda juga dapat menumpuk beberapa varian state untuk menerapkan gaya hanya ketika semua kondisi terpenuhi. Ini berguna untuk menyempurnakan interaksi.
Contoh: Tombol mode gelap yang bereaksi berbeda terhadap hover dan focus
<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">
<!-- Ikon di sini -->
</button>
Di sini, dark:hover:focus:ring-gray-200
menerapkan warna ring spesifik hanya ketika mode gelap aktif, tombol sedang di-hover, *dan* memiliki fokus. Urutan varian state umumnya tidak menjadi masalah, karena Tailwind menghasilkan selektor CSS yang benar untuk kombinasi tersebut.
Kustomisasi dan Kasus Khusus
Meskipun Tailwind menyediakan serangkaian varian yang komprehensif secara default, terkadang Anda memerlukan lebih banyak kontrol.
Menggunakan Varian Arbitrer
Untuk situasi khusus di mana Anda memerlukan selektor CSS yang tidak tercakup oleh varian bawaan, Anda dapat menggunakan varian arbitrer. Ini adalah jalan keluar yang sangat kuat yang memungkinkan Anda menulis selektor kustom langsung di atribut kelas Anda, diapit dalam kurung siku.
Contoh: Menata item daftar secara berbeda
<ul>
<li class="[&:nth-child(odd)]:bg-gray-100 p-2">Item pertama</li>
<li class="[&:nth-child(odd)]:bg-gray-100 p-2">Item kedua</li>
<li class="[&:nth-child(odd)]:bg-gray-100 p-2">Item ketiga</li>
</ul>
Kelas [&:nth-child(odd)]:bg-gray-100
menghasilkan CSS untuk li:nth-child(odd)
, membuat daftar bergaris tanpa perlu menambahkan kelas tambahan ke setiap item.
Penggunaan umum lainnya adalah untuk penataan turunan langsung:
<div class="[&_>_p]:mt-4">
<p>Paragraf pertama.</p>
<p>Paragraf kedua. Ini akan memiliki margin atas.</p>
<div><p>Paragraf bersarang. Ini TIDAK akan memiliki margin atas.</p></div>
</div>
Kelas [&_>_p]:mt-4
hanya menata anak p
langsung dari div.
Mengonfigurasi Varian di `tailwind.config.js`
Secara default, mesin JIT Tailwind mengaktifkan semua varian untuk semua plugin inti. Namun, jika Anda perlu mengaktifkan varian untuk plugin pihak ketiga atau ingin mendaftarkan varian kustom, Anda harus menggunakan file `tailwind.config.js` Anda.
// tailwind.config.js
module.exports = {
// ...
plugins: [
function({ addVariant }) {
addVariant('child', '& > *');
addVariant('child-hover', '& > *:hover');
}
],
}
Plugin kustom ini menambahkan varian `child` dan `child-hover` baru, yang kemudian dapat Anda gunakan seperti child:text-red-500
untuk menata semua anak langsung dari sebuah elemen.
Kesimpulan: Kekuatan UI Berbasis State
Varian Tailwind CSS lebih dari sekadar kemudahan; mereka adalah bagian fundamental dari filosofi utility-first. Dengan memungkinkan Anda untuk mendeskripsikan penampilan sebuah elemen di semua state potensialnya langsung di HTML, varian membantu Anda membangun antarmuka pengguna yang kompleks, kuat, dan sangat mudah dipelihara.
Dari efek hover
sederhana hingga kontrol formulir rumit yang dibangun dengan peer-checked
dan kombinasi responsif multi-state, Anda sekarang memiliki toolkit komprehensif untuk mewujudkan desain Anda. Mereka mendorong pola pikir berbasis komponen di mana semua logika—struktur, gaya, dan state—terenkapsulasi di satu tempat.
Kami telah membahas hal-hal penting dan menjelajahi teknik-teknik lanjutan, tetapi perjalanan tidak berakhir di sini. Cara terbaik untuk menguasai varian adalah dengan menggunakannya. Bereksperimenlah dengan menggabungkannya, jelajahi daftar lengkap di dokumentasi resmi Tailwind CSS, dan tantang diri Anda untuk membangun komponen interaktif tanpa menggunakan CSS atau JavaScript kustom. Dengan merangkul kekuatan penataan berbasis state, Anda akan dapat membangun pengalaman pengguna yang lebih cepat, lebih konsisten, dan lebih menyenangkan untuk audiens global.