Bootstrap 5 Tutorial
v5.3.0Bootstrap 5 Tutorial
Input Groups in Bootstrap 5
Input Groups: Extend form controls by adding text, buttons, or button groups on either side of inputs.
Basic Input Groups
Basic Examples
@
@example.com
$.00
With textarea
<!-- Basic Input Group with Prefix -->
<div class="input-group mb-3">
<span class="input-group-text" id="basic-addon1">@</span>
<input
type="text"
class="form-control"
placeholder="Username"
aria-describedby="basic-addon1"
>
</div>
<!-- Input Group with Suffix -->
<div class="input-group mb-3">
<input
type="text"
class="form-control"
placeholder="Recipient's username"
>
<span class="input-group-text">@example.com</span>
</div>
<!-- Input Group with Both Sides -->
<div class="input-group mb-3">
<span class="input-group-text">$</span>
<input type="text" class="form-control">
<span class="input-group-text">.00</span>
</div>
<!-- Input Group with Textarea -->
<div class="input-group">
<span class="input-group-text">With textarea</span>
<textarea class="form-control" rows="3"></textarea>
</div>Input Group Sizing
Different Sizes
Small
Default
Large
<!-- Small Input Group -->
<div class="input-group input-group-sm mb-3">
<span class="input-group-text">Small</span>
<input type="text" class="form-control">
</div>
<!-- Default Input Group -->
<div class="input-group mb-3">
<span class="input-group-text">Default</span>
<input type="text" class="form-control">
</div>
<!-- Large Input Group -->
<div class="input-group input-group-lg">
<span class="input-group-text">Large</span>
<input type="text" class="form-control">
</div>Input Group with Buttons
Button Add-ons
<!-- Input Group with Button on Left -->
<div class="input-group mb-3">
<button class="btn btn-outline-secondary" type="button">Button</button>
<input type="text" class="form-control" placeholder="">
</div>
<!-- Input Group with Button on Right -->
<div class="input-group mb-3">
<input type="text" class="form-control" placeholder="Search...">
<button class="btn btn-outline-secondary" type="button">🔍 Search</button>
</div>
<!-- Input Group with Multiple Buttons -->
<div class="input-group mb-3">
<button class="btn btn-outline-secondary" type="button">Left</button>
<button class="btn btn-outline-secondary" type="button">Middle</button>
<input type="text" class="form-control" placeholder="">
<button class="btn btn-outline-secondary" type="button">Right</button>
</div>
<!-- Input Group with Primary Button -->
<div class="input-group">
<input type="text" class="form-control" placeholder="Email address">
<button class="btn btn-primary" type="button">Subscribe</button>
</div>Input Group with Dropdowns
Dropdown Add-ons
<!-- Input Group with Dropdown on Left -->
<div class="input-group mb-3">
<button class="btn btn-outline-secondary dropdown-toggle" type="button" data-bs-toggle="dropdown">
Dropdown
</button>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="#">Action</a></li>
<li><a class="dropdown-item" href="#">Another action</a></li>
</ul>
<input type="text" class="form-control">
</div>
<!-- Input Group with Dropdown on Right -->
<div class="input-group mb-3">
<input type="text" class="form-control">
<button class="btn btn-outline-secondary dropdown-toggle" type="button" data-bs-toggle="dropdown">
Dropdown
</button>
<ul class="dropdown-menu dropdown-menu-end">
<li><a class="dropdown-item" href="#">Action</a></li>
<li><a class="dropdown-item" href="#">Another action</a></li>
</ul>
</div>
<!-- Split Dropdown Input Group -->
<div class="input-group">
<button class="btn btn-outline-secondary dropdown-toggle" type="button" data-bs-toggle="dropdown">
Split dropdown
</button>
<input type="text" class="form-control">
<button class="btn btn-outline-secondary dropdown-toggle" type="button" data-bs-toggle="dropdown">
<span class="visually-hidden">Toggle Dropdown</span>
</button>
<ul class="dropdown-menu dropdown-menu-end">
<li><a class="dropdown-item" href="#">Action</a></li>
<li><a class="dropdown-item" href="#">Another action</a></li>
</ul>
</div>Input Group with Checkboxes and Radios
Selection Add-ons
<!-- Input Group with Checkbox -->
<div class="input-group mb-3">
<div class="input-group-text">
<input
class="form-check-input mt-0"
type="checkbox"
aria-label="Checkbox"
>
</div>
<input type="text" class="form-control" placeholder="Checkbox on left">
</div>
<!-- Input Group with Radio -->
<div class="input-group mb-3">
<div class="input-group-text">
<input
class="form-check-input mt-0"
type="radio"
aria-label="Radio button"
>
</div>
<input type="text" class="form-control" placeholder="Radio on left">
</div>
<!-- Input Group with Checkbox on Right -->
<div class="input-group">
<input type="text" class="form-control" placeholder="Checkbox on right">
<div class="input-group-text">
<input
class="form-check-input mt-0"
type="checkbox"
aria-label="Checkbox"
>
</div>
</div>Multiple Inputs in One Group
Complex Input Groups
First and last name
$0.00
@.example.com
<!-- Multiple Inputs in One Group -->
<div class="input-group mb-3">
<span class="input-group-text">First and last name</span>
<input type="text" class="form-control" placeholder="First name">
<input type="text" class="form-control" placeholder="Last name">
</div>
<!-- Multiple Add-ons -->
<div class="input-group mb-3">
<span class="input-group-text">$</span>
<span class="input-group-text">0.00</span>
<input type="text" class="form-control">
</div>
<!-- Complex Email Input Group -->
<div class="input-group">
<input type="text" class="form-control" placeholder="Username">
<span class="input-group-text">@</span>
<input type="text" class="form-control" placeholder="Server">
<span class="input-group-text">.example.com</span>
</div>Floating Labels with Input Groups
Combined Features
@
@example.com
<!-- Floating Label with Input Group -->
<div class="form-floating">
<div class="input-group">
<span class="input-group-text">@</span>
<input
type="email"
class="form-control"
id="floatingInputGroup1"
placeholder="name@example.com"
>
<label for="floatingInputGroup1">Email address</label>
</div>
</div>
<!-- Floating Label with Input Group (Suffix) -->
<div class="form-floating">
<div class="input-group">
<input
type="text"
class="form-control"
id="floatingInputGroup2"
placeholder="Username"
>
<span class="input-group-text">@example.com</span>
<label for="floatingInputGroup2">Username</label>
</div>
</div>Validation with Input Groups
Valid and Invalid States
@
Please choose a username.
@example.com
Looks good!
$.00
Please enter a valid amount.
<!-- Invalid Input Group -->
<div class="input-group has-validation">
<span class="input-group-text">@</span>
<input type="text" class="form-control is-invalid" placeholder="Username" required>
<div class="invalid-feedback">
Please choose a username.
</div>
</div>
<!-- Valid Input Group -->
<div class="input-group has-validation">
<input type="email" class="form-control is-valid" placeholder="name@example.com" required>
<span class="input-group-text">@example.com</span>
<div class="valid-feedback">
Looks good!
</div>
</div>
<!-- Invalid Input Group with Multiple Add-ons -->
<div class="input-group has-validation">
<span class="input-group-text">$</span>
<input type="number" class="form-control is-invalid" placeholder="Amount" required>
<span class="input-group-text">.00</span>
<div class="invalid-feedback">
Please enter a valid amount.
</div>
</div>Practical Examples
Currency Input
$USD
€EUR
£GBP
<!-- Currency Input Example -->
<div class="input-group">
<span class="input-group-text">$</span>
<input
type="number"
class="form-control"
placeholder="0.00"
min="0"
step="0.01"
>
<span class="input-group-text">USD</span>
</div>Search with Filters
<!-- Search with Dropdown Filter -->
<div class="input-group">
<button class="btn btn-outline-secondary dropdown-toggle" type="button" data-bs-toggle="dropdown">
Category
</button>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="#">All</a></li>
<li><a class="dropdown-item" href="#">Electronics</a></li>
</ul>
<input type="text" class="form-control" placeholder="Search products...">
<button class="btn btn-primary" type="button">🔍 Search</button>
</div>Best Practices
When to Use Input Groups
- Currency inputs: When you need currency symbols
- Email/username inputs: With domain suffixes
- Search functionality: With search buttons or filters
- Measurement inputs: With unit labels (cm, kg, etc.)
- URL inputs: With protocol prefixes (https://)
- Form controls with actions: Like subscribe buttons
Common Mistakes to Avoid
- ❌ Using for simple inputs that don't need add-ons
- ❌ Forgetting accessibility attributes (
aria-label,aria-describedby) - ❌ Not using
.has-validationwhen showing validation messages - ❌ Making input groups too complex with too many add-ons
- ❌ Not testing on mobile devices
- ❌ Using inconsistent sizing within the same form