Skip to content
GitHub

HTML Forms

Switch to Zen Mode

  • HTML forms are the primary way websites collect information (as input data) from users, which can then be processed by a server.
  • Forms can contain various elements (called from controls) like text fields, checkboxes, radio buttons, and more.
  • When a user submits a form, the browser collects the data and sends it to the server specified in the form’s attributes.
  • Forms are used for various purposes, including user registration, login, contact forms, order forms, and more.

Every HTML form begins with the <form> element, which serves as a container for all form controls:

<form action="server-endpoint" method="POST">
<!-- Form elements go here -->
<input type="submit" value="Submit">
</form>
html
  • action: Specifies the URI or server endpoint to which the form data will be sent for processing.
  • method: Determines how the form data will be sent to the server. Common methods are:
    • GET: Data is appended to the URL, visible in the browser’s address bar (not suitable for sensitive data).
    • POST: Data is sent in the body of the request, more secure for sensitive or large amounts of data.

Example:

<form action="/submit-form" method="post">
<!-- Form controls go here -->
<input type="text" name="username">
<input type="submit" value="Submit">
</form>
html

HTML provides a wide variety of form elements that you can use to collect different kinds of user input. Below are the most commonly used form elements.

Allows the user to enter a single line of text.

<!-- Single line text input -->
<label for="name">Name:</label>
<input type="text" id="name" name="name" required>
html
  • type="text": Defines the field as a text input.
  • id: Uniquely identifies the field.
  • name: Specifies the name used to reference the input in the server-side processing script.
  • required: Specifies that the field must be filled out before submission.

Allows users to input a password, which is hidden as it’s typed.

<!-- Password field (masks input) -->
<label for="password">Password:</label>
<input type="password" id="password" name="password" required>
html

Used for selecting one option from a group of predefined options. Only one radio button can be selected at a time in a group.

<!-- Radio buttons (single choice from group) -->
<label for="gender">Gender:</label>
<input type="radio" id="male" name="gender" value="male"> Male
<input type="radio" id="female" name="gender" value="female"> Female
html

Used for selecting one or more options from a group. Multiple checkboxes can be selected simultaneously.

<!-- Checkboxes (multiple choices) -->
<input type="checkbox" name="interests" value="sports" id="sports">
<label for="sports">Sports</label>
<input type="checkbox" name="interests" value="music" id="music">
<label for="music">Music</label>
html

Allows users to select an option from a list of options.

<!-- Dropdown select menu -->
<label for="country">Country:</label>
<select id="country" name="country">
<option value="us">United States</option>
<option value="ca">Canada</option>
<option value="uk">United Kingdom</option>
</select>
html

Used for multi-line text input, such as a message or description.

<!-- Multi-line text area -->
<label for="message">Message:</label>
<textarea id="message" name="message" rows="4" cols="50"></textarea>
html

Allows the user to upload files from their local system.

<!-- File selector -->
<label for="file">Upload file:</label>
<input type="file" id="file" name="document">
<!-- Multiple file selector -->
<input type="file" name="photos" multiple>
html

A clickable button, which can trigger actions such as form submission or form reset.

<!-- Submit button -->
<input type="submit" value="Submit Form">
<!-- Reset button (clears form) -->
<input type="reset" value="Clear Form">
<!-- Generic button (for JavaScript) -->
<button type="button" onclick="doSomething()">Click Me</button>
html

A field that is not visible to the user but holds data that is sent when the form is submitted.

<!-- Hidden data (not visible to user) -->
<input type="hidden" name="user_id" value="12345">
html

HTML5 introduced several input types for date and time-related information:

<!-- Date picker -->
<label for="birthdate">Birthdate:</label>
<input type="date" id="birthdate" name="birthdate">
<!-- Time picker -->
<label for="appointment">Appointment Time:</label>
<input type="time" id="appointment" name="appointment">
html
<!-- Range slider -->
<label for="quantity">Quantity:</label>
<input type="range" id="quantity" name="quantity" min="1" max="100" value="5">
html

This input type allows users to select a value from a range, and the value will be passed along with the form data.

Below are some of the HTML5 specialized form elements:

<!-- Email with validation -->
<input type="email" name="email" placeholder="Enter your email">
<!-- Number with min/max -->
<input type="number" name="quantity" min="1" max="5">
<!-- Color picker -->
<input type="color" name="favorite_color">
<!-- URL with validation -->
<input type="url" name="website" placeholder="Enter your website">
<!-- Search field -->
<input type="search" name="search" placeholder="Search...">
<!-- Telephone number -->
<input type="tel" name="phone" placeholder="123-456-7890">
html

  • The <fieldset> element is used to group related elements within a form. It helps to organize the content in a logical way and can also help improve accessibility.
  • Example:
    <fieldset>
    <legend>Personal Information</legend>
    <label for="name">Name:</label>
    <input type="text" id="name" name="name">
    <br>
    <label for="email">Email:</label>
    <input type="email" id="email" name="email">
    </fieldset>
    html
  • The <legend> element is used as a caption for the content inside a <fieldset>. It provides a label or description for the grouped form elements.
  • Example: In the code above, the text “Personal Information” inside the <legend> element is the label for the form fields inside the <fieldset>.

Forms and form elements can have various attributes that control their behavior:

<form
action="/process"
method="post"
enctype="multipart/form-data"
autocomplete="on"
novalidate
target="_self">
<!-- Form content -->
</form>
html
  • action: URL where form data is sent
  • method: HTTP method (“get” or “post”)
  • enctype: How form data is encoded (required for file uploads)
  • autocomplete: Browser should offer completion suggestions
  • novalidate: Disables browser’s built-in validation
  • target: Where to display the response (_self, _blank, etc.)
<input
type="text"
name="username"
id="username"
value="default value"
placeholder="Enter username"
required
disabled
readonly
autofocus
minlength="3"
maxlength="20"
pattern="[A-Za-z0-9]+"
aria-label="Username">
html
  • type: What kind of input it is
  • name: Identifier used when submitting data
  • id: Unique identifier for the element (for labels and CSS)
  • value: Default or current value
  • placeholder: Hint text displayed when empty
  • required: Field must be filled before submission
  • disabled: Field cannot be used
  • readonly: Field cannot be modified
  • autofocus: Field gets focus when page loads
  • minlength/maxlength: Minimum/maximum text length
  • pattern: Regular expression for validation
  • aria-*: Accessibility attributes

Making forms accessible ensures everyone can use them, including people with disabilities:

The for attribute in a <label> element is used to associate the label with a specific form element. When the for attribute is set, it specifies which input element the label is describing or controls.

  • For example, if you have a form input for a username, you would use the for="username" in the <label> to associate the label with the input field that has the id="username".
  • Improved Usability: Clicking the label will focus on the associated input field.
  • Accessibility: Screen readers use the for attribute to associate the label with the input field, making it easier for users with disabilities to understand and interact with the form.
<!-- Explicit label association -->
<label for="username">Username:</label>
<input type="text" id="username" name="username">
<!-- Fieldset and legend for grouping related inputs -->
<fieldset>
<legend>Contact Information</legend>
<label for="name">Name:</label>
<input type="text" id="name" name="name">
<label for="email">Email:</label>
<input type="email" id="email" name="email">
</fieldset>
html
<!-- Required field with aria-required -->
<label for="email">Email:</label>
<input type="email" id="email" name="email" required aria-required="true">
<!-- Error messages with aria-describedby -->
<div class="form-group">
<label for="password">Password:</label>
<input type="password" id="password" name="password" aria-describedby="password-error">
<div id="password-error" class="error-message" role="alert"></div>
</div>
<!-- Using aria-live to announce validation results -->
<div aria-live="polite" id="form-feedback"></div>
html
  • required: Ensures the field must be filled out.
  • pattern: Validates input against a regular expression.
<input type="text" name="email" pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$" required>
html
  • min / max: Specifies minimum and maximum values (often used with number, range).
<input type="number" name="age" min="18" max="100" required>
html
  • maxlength: Limits the number of characters that can be entered.
<input type="text" name="username" maxlength="15">
html

Plain HTML forms are functional but often unattractive. CSS allows you to create visually appealing forms:

/* Basic styling for a cleaner form */
form {
max-width: 500px;
margin: 0 auto;
padding: 20px;
background-color: #f9f9f9;
border-radius: 8px;
box-shadow: 0 0 10px rgba(0,0,0,0.1);
}
/* Style all text inputs and textareas */
input[type=text], input[type=email], input[type=password], textarea, select {
width: 100%;
padding: 12px;
margin: 8px 0;
display: inline-block;
border: 1px solid #ccc;
border-radius: 4px;
box-sizing: border-box;
font-family: inherit;
font-size: 16px;
}
/* Style for submit button */
input[type=submit] {
background-color: #4CAF50;
color: white;
padding: 12px 20px;
border: none;
border-radius: 4px;
cursor: pointer;
font-size: 16px;
}
input[type=submit]:hover {
background-color: #45a049;
}
/* Style for focus state */
input:focus, textarea:focus, select:focus {
border-color: #2684FF;
box-shadow: 0 0 0 2px rgba(38,132,255,0.2);
outline: none;
}
/* Style for form groups */
.form-group {
margin-bottom: 20px;
}
/* Style for labels */
label {
display: block;
margin-bottom: 8px;
font-weight: bold;
}
/* Style for checkboxes and radio buttons */
.checkbox-group, .radio-group {
display: flex;
align-items: center;
margin: 8px 0;
}
.checkbox-group input, .radio-group input {
margin-right: 10px;
}
css