SmartCodingTips

Interactive Forms with Validation Styling

Tailwind CSS makes it easy to create responsive and accessible forms with real-time validation feedback. You can style valid/invalid states using utility classes and pseudo-classes.

1. Styling Valid & Invalid Inputs

Use :invalid, :valid, and :required pseudo-classes to style form controls based on their validation state.


<input type="email" required
  class="peer w-full border rounded px-3 py-2 
         border-gray-300 focus:outline-none 
         focus:ring-2 focus:ring-blue-500
         invalid:border-red-500 invalid:text-red-600
         valid:border-green-500 valid:text-green-600"
/>
            

2. Showing Error Messages

You can use the .peer class to conditionally show error messages:


<div>
  <input type="text" required class="peer w-full border px-3 py-2 border-gray-300 
       invalid:border-red-500 invalid:ring-red-500">
  <p class="mt-1 text-sm text-red-600 invisible peer-invalid:visible">
    This field is required.
  </p>
</div>
            

3. Interactive Example

Here's a full form example with validation feedback:


<form class="space-y-4">
  <div>
    <label class="block text-sm font-medium text-gray-700">Email</label>
    <input type="email" required class="peer w-full mt-1 px-3 py-2 border border-gray-300 
         rounded-md shadow-sm focus:ring-blue-500 focus:border-blue-500 
         invalid:border-red-500">
    <p class="text-red-500 text-sm mt-1 invisible peer-invalid:visible">
      Please enter a valid email address.
    </p>
  </div>

  <div>
    <label class="block text-sm font-medium text-gray-700">Password</label>
    <input type="password" minlength="6" required 
      class="peer w-full mt-1 px-3 py-2 border border-gray-300 
             rounded-md shadow-sm focus:ring-blue-500 focus:border-blue-500 
             invalid:border-red-500">
    <p class="text-red-500 text-sm mt-1 invisible peer-invalid:visible">
      Password must be at least 6 characters.
    </p>
  </div>

  <button type="submit" 
    class="bg-blue-600 text-white px-4 py-2 rounded hover:bg-blue-700">
    Submit
  </button>
</form>
            

4. Accessibility Tips

  • Always associate labels with inputs using <label>.
  • Use aria-invalid for screen reader feedback if needed.
  • Use required, minlength, etc., for built-in HTML validation.

Conclusion

With Tailwind and modern HTML features, you can create fully interactive, validated, and accessible forms using just utility classes — without writing custom CSS.