We use conditional classes to change styles based on conditions. clsx helps combine class names easily. twMerge cleans up duplicate Tailwind classes so styles don't conflict.
Conditional classes with clsx and twMerge in Tailwind
import clsx from 'clsx'; import { twMerge } from 'tailwind-merge'; const className = twMerge(clsx( 'base-class', condition && 'conditional-class', anotherCondition ? 'class-true' : 'class-false' ));
clsx combines class names and ignores false or null values.
twMerge merges Tailwind classes and removes duplicates or conflicts.
text-blue-500 only if isActive is true.clsx('text-center', isActive && 'text-blue-500')
bg-blue-500 because twMerge keeps the last conflicting class.twMerge('bg-red-500', 'bg-blue-500')
isLarge, and background if isPrimary is true.twMerge(clsx('p-4', isLarge ? 'text-lg' : 'text-sm', isPrimary && 'bg-green-500'))
This example shows a button that changes style and text when clicked. It uses clsx to add classes conditionally and twMerge to merge Tailwind classes without conflicts. The button background changes from blue to green when active, and the text color changes accordingly.
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> <title>Conditional Classes Example</title> <script src="https://cdn.tailwindcss.com"></script> <script type="module"> import { twMerge } from 'https://cdn.skypack.dev/tailwind-merge'; import clsx from 'https://cdn.skypack.dev/clsx'; window.addEventListener('DOMContentLoaded', () => { const button = document.getElementById('myButton'); let isActive = false; function updateButton() { const className = twMerge(clsx( 'px-6 py-3 rounded font-semibold transition-colors', 'bg-blue-500 text-white', isActive && 'bg-green-500 text-black', !isActive && 'hover:bg-blue-700' )); button.className = className; button.textContent = isActive ? 'Active' : 'Inactive'; button.setAttribute('aria-pressed', isActive.toString()); } button.addEventListener('click', () => { isActive = !isActive; updateButton(); }); updateButton(); }); </script> </head> <body class="flex items-center justify-center min-h-screen bg-gray-100"> <button id="myButton" aria-pressed="false" aria-label="Toggle active state"></button> </body> </html>
Always use twMerge after clsx to avoid conflicting Tailwind classes.
Use semantic HTML and ARIA attributes for accessibility, like aria-pressed on toggle buttons.
Test your styles in different screen sizes to ensure responsiveness.
clsx helps combine class names easily and conditionally.
twMerge cleans up conflicting Tailwind classes to keep styles correct.
Use them together to write clean, dynamic, and conflict-free Tailwind CSS classes.