Tab Underline Animasi
Navigasi tab dengan indikator garis bawah yang mengikuti tab aktif dengan lancar.
Tailwind CSSJavaScript
UI tab canggih dengan garis bawah geser halus yang mengikuti pengguna saat mereka beralih antar tab.
Pratinjau
Account settings content goes here. Manage your profile details.
Kasus & Fitur Penggunaan
- Peralihan kategori: Ideal untuk UI yang beralih antar bagian berbeda dalam layar yang sama, seperti kategori artikel, tab pada layar pengaturan, dll.
- Hemat ruang: Menyediakan banyak konten dalam ruang layar terbatas dan efektif bahkan di lingkungan seluler.
- Posisi visual saat ini: Animasi garis bawah dengan lancar mengikuti posisi tab saat ini, memungkinkan Anda memahami secara intuitif di mana pengguna sedang melihat.
Poin-poin penting dari desain dan UX (Desain & UX)
- Animasi berikut: Menggunakan
transitionatautransformCSS, kami menerapkan gerakan di mana garis bawah meluncur.Ini memberikan masukan yang bagus bahwa Anda telah berpindah tab. - Pertimbangan aksesibilitas: Warna font (kontras) dipisahkan dengan jelas antara tab aktif dan tidak aktif untuk memfasilitasi diferensiasi visual.
Cara menyesuaikan (Panduan Kustomisasi)
- Perubahan warna: Anda dapat menyatukan desain hanya dengan mengubah kelas seperti
indigo-600menjadiblue-500atauemerald-600agar sesuai dengan warna merek. - Menambahkan tab: Tambahkan tombol dan panel konten ke HTML, dan sesuaikan logika JavaScript (rasio
widthdantransform) agar sesuai dengan jumlah tab.
Kode implementasi (Implementasi)
<div class="max-w-md mx-auto">
<div class="relative flex border-b border-gray-200 dark:border-zinc-800">
<button class="tab-btn flex-1 py-3 text-sm font-medium text-indigo-600 dark:text-indigo-400" data-target="tab1">Account</button>
<button class="tab-btn flex-1 py-3 text-sm font-medium text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200" data-target="tab2">Security</button>
<button class="tab-btn flex-1 py-3 text-sm font-medium text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200" data-target="tab3">Notifications</button>
<div id="tab-indicator" class="absolute bottom-0 left-0 h-0.5 bg-indigo-600 dark:bg-indigo-400 transition-all duration-300 ease-out" style="width: 33.33%; transform: translateX(0%);"></div>
</div>
<div class="pt-4">
<div id="tab1" class="tab-content text-gray-600 dark:text-gray-300 text-sm">Account settings content goes here. Manage your profile details.</div>
<div id="tab2" class="tab-content hidden text-gray-600 dark:text-gray-300 text-sm">Security settings content goes here. Change your password.</div>
<div id="tab3" class="tab-content hidden text-gray-600 dark:text-gray-300 text-sm">Notification preferences go here. Manage email alerts.</div>
</div>
</div>
<script>
const btns = document.querySelectorAll('.tab-btn');
const contents = document.querySelectorAll('.tab-content');
const indicator = document.getElementById('tab-indicator');
btns.forEach((btn, i) => {
btn.addEventListener('click', () => {
btns.forEach(b => {
b.classList.remove('text-indigo-600', 'dark:text-indigo-400');
b.classList.add('text-gray-500', 'dark:text-gray-400');
});
btn.classList.remove('text-gray-500', 'dark:text-gray-400');
btn.classList.add('text-indigo-600', 'dark:text-indigo-400');
indicator.style.transform = `translateX(${i * 100}%)`;
contents.forEach(c => c.classList.add('hidden'));
document.getElementById(btn.dataset.target).classList.remove('hidden');
});
});
</script>