Definition
The <form>
HTML element represents a document section containing interactive controls for submitting information to a web server. Forms are essential for user interaction on the web, allowing users to input data, make selections, and submit information. The <form>
element provides structure and functionality for collecting user input through various form controls like text inputs, checkboxes, radio buttons, and more.
Syntax
<form action="/submit" method="post">
<!-- Form controls go here -->
</form>
Attributes
Essential Attributes
<form action="/api/submit" <!-- URL where form data is sent -->
method="post"
<!-- HTTP method: get, post, put, delete -->
enctype="multipart/form-data"
<!-- For file uploads -->
target="_blank"
<!-- Where to display response -->
novalidate>
<!-- Disable browser validation -->
<!-- Form content -->
</form>
Accessibility Attributes
<form aria-label="Contact form" aria-describedby="form-help">
<!-- Form content -->
</form>
Examples
Basic Contact Form
HTML
Basic Contact Form:
Code
<div class="bg-gray-100 p-6 border rounded">
<h3 class="font-semibold mb-4">Basic Contact Form:</h3>
<form class="space-y-4">
<div>
<label for="name" class="block text-sm font-medium text-gray-700 mb-1">Full Name</label>
<input type="text" id="name" name="name" required
class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500">
</div>
<div>
<label for="email" class="block text-sm font-medium text-gray-700 mb-1">Email Address</label>
<input type="email" id="email" name="email" required
class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500">
</div>
<div>
<label for="message" class="block text-sm font-medium text-gray-700 mb-1">Message</label>
<textarea id="message" name="message" rows="4" required
class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"></textarea>
</div>
<button type="submit" class="w-full bg-blue-500 text-white py-2 px-4 rounded-md hover:bg-blue-600 transition-colors">
Send Message
</button>
</form>
</div>
Registration Form with Validation
HTML
Registration Form:
Code
<div class="bg-gray-100 p-6 border rounded">
<h3 class="font-semibold mb-4">Registration Form:</h3>
<form class="space-y-4" novalidate>
<div class="grid grid-cols-1 md:grid-cols-2 gap-4">
<div>
<label for="first-name" class="block text-sm font-medium text-gray-700 mb-1">First Name</label>
<input type="text" id="first-name" name="firstName" required
class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500">
</div>
<div>
<label for="last-name" class="block text-sm font-medium text-gray-700 mb-1">Last Name</label>
<input type="text" id="last-name" name="lastName" required
class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500">
</div>
</div>
<div>
<label for="username" class="block text-sm font-medium text-gray-700 mb-1">Username</label>
<input type="text" id="username" name="username" required minlength="3"
class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500">
</div>
<div>
<label for="password" class="block text-sm font-medium text-gray-700 mb-1">Password</label>
<input type="password" id="password" name="password" required minlength="8"
class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500">
</div>
<div>
<label for="confirm-password" class="block text-sm font-medium text-gray-700 mb-1">Confirm Password</label>
<input type="password" id="confirm-password" name="confirmPassword" required
class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500">
</div>
<div class="flex items-center">
<input type="checkbox" id="terms" name="terms" required
class="h-4 w-4 text-blue-600 focus:ring-blue-500 border-gray-300 rounded">
<label for="terms" class="ml-2 block text-sm text-gray-700">
I agree to the <a href="#" class="text-blue-600 hover:underline">Terms and Conditions</a>
</label>
</div>
<button type="submit" class="w-full bg-green-500 text-white py-2 px-4 rounded-md hover:bg-green-600 transition-colors">
Create Account
</button>
</form>
</div>
File Upload Form
HTML
File Upload Form:
Code
<div class="bg-gray-100 p-6 border rounded">
<h3 class="font-semibold mb-4">File Upload Form:</h3>
<form class="space-y-4" enctype="multipart/form-data">
<div>
<label for="file-upload" class="block text-sm font-medium text-gray-700 mb-1">Choose Files</label>
<input type="file" id="file-upload" name="files" multiple accept=".jpg,.png,.pdf,.doc,.docx"
class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500">
<p class="text-xs text-gray-500 mt-1">Accepted formats: JPG, PNG, PDF, DOC, DOCX</p>
</div>
<div>
<label for="description" class="block text-sm font-medium text-gray-700 mb-1">Description</label>
<textarea id="description" name="description" rows="3"
class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"></textarea>
</div>
<button type="submit" class="w-full bg-purple-500 text-white py-2 px-4 rounded-md hover:bg-purple-600 transition-colors">
Upload Files
</button>
</form>
</div>
Search Form
HTML
Search Form:
Code
<div class="bg-gray-100 p-6 border rounded">
<h3 class="font-semibold mb-4">Search Form:</h3>
<form class="flex space-x-2">
<div class="flex-1">
<label for="search" class="sr-only">Search</label>
<input type="search" id="search" name="q" placeholder="Search for anything..."
class="w-full px-4 py-2 border border-gray-300 rounded-l-md focus:outline-none focus:ring-2 focus:ring-blue-500">
</div>
<div class="flex space-x-2">
<select name="category" class="px-3 py-2 border border-gray-300 focus:outline-none focus:ring-2 focus:ring-blue-500">
<option value="">All Categories</option>
<option value="electronics">Electronics</option>
<option value="clothing">Clothing</option>
<option value="books">Books</option>
<option value="home">Home & Garden</option>
</select>
<button type="submit" class="px-6 py-2 bg-blue-500 text-white rounded-r-md hover:bg-blue-600 transition-colors">
Search
</button>
</div>
</form>
</div>
Multi-step Form
HTML
Multi-step Form:
Code
<div class="bg-gray-100 p-6 border rounded">
<h3 class="font-semibold mb-4">Multi-step Form:</h3>
<form class="space-y-4">
<!-- Step 1: Personal Information -->
<div class="bg-white p-4 rounded border">
<h4 class="font-medium mb-3 text-blue-600">Step 1: Personal Information</h4>
<div class="grid grid-cols-1 md:grid-cols-2 gap-4">
<div>
<label for="full-name" class="block text-sm font-medium text-gray-700 mb-1">Full Name</label>
<input type="text" id="full-name" name="fullName" required
class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500">
</div>
<div>
<label for="phone" class="block text-sm font-medium text-gray-700 mb-1">Phone Number</label>
<input type="tel" id="phone" name="phone"
class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500">
</div>
</div>
</div>
<!-- Step 2: Address -->
<div class="bg-white p-4 rounded border">
<h4 class="font-medium mb-3 text-green-600">Step 2: Address</h4>
<div class="space-y-4">
<div>
<label for="street" class="block text-sm font-medium text-gray-700 mb-1">Street Address</label>
<input type="text" id="street" name="street" required
class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500">
</div>
<div class="grid grid-cols-1 md:grid-cols-3 gap-4">
<div>
<label for="city" class="block text-sm font-medium text-gray-700 mb-1">City</label>
<input type="text" id="city" name="city" required
class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500">
</div>
<div>
<label for="state" class="block text-sm font-medium text-gray-700 mb-1">State</label>
<input type="text" id="state" name="state" required
class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500">
</div>
<div>
<label for="zip" class="block text-sm font-medium text-gray-700 mb-1">ZIP Code</label>
<input type="text" id="zip" name="zip" required
class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500">
</div>
</div>
</div>
</div>
<div class="flex space-x-3">
<button type="button" class="px-6 py-2 border border-gray-300 text-gray-700 rounded-md hover:bg-gray-50">
Previous
</button>
<button type="submit" class="px-6 py-2 bg-blue-500 text-white rounded-md hover:bg-blue-600 transition-colors">
Submit
</button>
</div>
</form>
</div>
Browser Support
The <form>
element is supported in all browsers and has been a standard HTML element since HTML 2.0.
Best Practices
- Accessibility: Always provide proper labels for form controls using the
for
attribute - Validation: Use HTML5 validation attributes and provide helpful error messages
- Security: Implement proper server-side validation and CSRF protection
- User experience: Provide clear feedback and progress indicators for long forms
- Mobile optimization: Ensure forms are easy to use on mobile devices
- Semantic structure: Use appropriate form elements and grouping for better organization
Common Use Cases
- User registration and login: Account creation and authentication
- Contact forms: Customer support and inquiries
- Data collection: Surveys, polls, and feedback forms
- File uploads: Document and media file submissions
- Search functionality: Website and content search
- E-commerce: Product orders and checkout processes
- Settings and preferences: User account configuration
Related Elements
-
<input>
: Various types of input controls -
<textarea>
: Multi-line text input -
<select>
: Dropdown selection lists -
<button>
: Form submission and action buttons -
<label>
: Labels for form controls -
<fieldset>
: Groups related form controls -
<legend>
: Caption for fieldset groups