Getting started
Introduction
Bootstrap 4 is a CSS framework with a mobile-first flexbox grid system, extensive prebuilt components, and powerful utility classes.
Installation
<!-- CSS -->
<link
rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css"
/>
<!-- JS (requires jQuery and Popper) -->
<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/js/bootstrap.min.js"></script>
Quick Example
<div class="container">
<div class="row">
<div class="col-md-8">Main content</div>
<div class="col-md-4">Sidebar</div>
</div>
</div>
Breakpoints
Responsive breakpoints
576 768 992 1200
' ' ' ' ' ' ' '
<--------^----------^----------^----------^------>
xs sm md lg xl
(phone) (tablet) (laptop) (desktop) (wide)
| Breakpoint | Class infix | Dimensions |
|---|---|---|
| Extra small | (none) | <576px |
| Small | sm |
≥576px |
| Medium | md |
≥768px |
| Large | lg |
≥992px |
| Extra large | xl |
≥1200px |
Variables
$grid-breakpoints: (
xs: 0,
sm: 576px,
md: 768px,
lg: 992px,
xl: 1200px,
);
$container-max-widths: (
sm: 540px,
md: 720px,
lg: 960px,
xl: 1140px,
);
Grid System
Auto-width columns
<div class="row">
<div class="col">Column</div>
<div class="col">Column</div>
<div class="col">Column</div>
</div>
All columns equal width.
Responsive grid
<div class="row">
<div class="col-12 col-md-8">.col-12 .col-md-8</div>
<div class="col-6 col-md-4">.col-6 .col-md-4</div>
</div>
Mobile-first responsive layout.
Row columns
<div class="row row-cols-1 row-cols-md-2 row-cols-lg-4">
<div class="col">Column</div>
<div class="col">Column</div>
<div class="col">Column</div>
<div class="col">Column</div>
</div>
Set columns per row.
No gutters
<div class="row no-gutters">
<div class="col">No spacing</div>
<div class="col">No spacing</div>
</div>
Alignment
<!-- Vertical alignment -->
<div class="row align-items-start">...</div>
<div class="row align-items-center">...</div>
<div class="row align-items-end">...</div>
<!-- Horizontal alignment -->
<div class="row justify-content-start">...</div>
<div class="row justify-content-center">...</div>
<div class="row justify-content-end">...</div>
<div class="row justify-content-between">...</div>
<div class="row justify-content-around">...</div>
Ordering
<div class="row">
<div class="col order-3">First (order-3)</div>
<div class="col order-1">Second (order-1)</div>
<div class="col order-2">Third (order-2)</div>
</div>
Reorder columns with flexbox.
Offsetting
<div class="row">
<div class="col-md-4">.col-md-4</div>
<div class="col-md-4 offset-md-4">.col-md-4 .offset-md-4</div>
</div>
<div class="row">
<div class="col-md-3 offset-md-3">.col-md-3 .offset-md-3</div>
<div class="col-md-3 offset-md-3">.col-md-3 .offset-md-3</div>
</div>
Nesting
<div class="row">
<div class="col-sm-9">
Level 1: .col-sm-9
<div class="row">
<div class="col-8 col-sm-6">Level 2: .col-8 .col-sm-6</div>
<div class="col-4 col-sm-6">Level 2: .col-4 .col-sm-6</div>
</div>
</div>
</div>
Spacing Utilities
Notation
Format: {property}{sides}-{size} or {property}{sides}-{breakpoint}-{size}
| Property | Meaning |
|---|---|
m |
margin |
p |
padding |
| Sides | Meaning |
|---|---|
t |
top |
b |
bottom |
l |
left |
r |
right |
x |
left and right |
y |
top and bottom |
| (blank) | all sides |
| Size | Value |
|---|---|
0 |
0 |
1 |
.25rem (4px) |
2 |
.5rem (8px) |
3 |
1rem (16px) |
4 |
1.5rem (24px) |
5 |
3rem (48px) |
auto |
auto (margin only) |
Examples
<!-- Margin -->
<div class="mt-3">Margin top 1rem</div>
<div class="mb-5">Margin bottom 3rem</div>
<div class="mx-auto" style="width: 200px;">Centered block</div>
<!-- Padding -->
<div class="pt-2">Padding top .5rem</div>
<div class="px-5">Padding x 3rem</div>
<div class="p-0">No padding</div>
<!-- Responsive -->
<div class="mt-3 mt-md-5">Responsive margin</div>
<!-- Negative margins -->
<div class="mt-n3">Negative margin top</div>
Flexbox Utilities
Enable flexbox
<div class="d-flex">Flex container</div>
<div class="d-inline-flex">Inline flex</div>
Direction
<div class="d-flex flex-row">Horizontal</div>
<div class="d-flex flex-row-reverse">Reverse</div>
<div class="d-flex flex-column">Vertical</div>
<div class="d-flex flex-column-reverse">Reverse vertical</div>
Justify content
<div class="d-flex justify-content-start">Start</div>
<div class="d-flex justify-content-end">End</div>
<div class="d-flex justify-content-center">Center</div>
<div class="d-flex justify-content-between">Space between</div>
<div class="d-flex justify-content-around">Space around</div>
Align items
<div class="d-flex align-items-start">Start</div>
<div class="d-flex align-items-end">End</div>
<div class="d-flex align-items-center">Center</div>
<div class="d-flex align-items-baseline">Baseline</div>
<div class="d-flex align-items-stretch">Stretch</div>
Align self
<div class="align-self-start">Start</div>
<div class="align-self-end">End</div>
<div class="align-self-center">Center</div>
<div class="align-self-baseline">Baseline</div>
<div class="align-self-stretch">Stretch</div>
Wrapping
<div class="d-flex flex-wrap">Wrap</div>
<div class="d-flex flex-nowrap">No wrap</div>
<div class="d-flex flex-wrap-reverse">Wrap reverse</div>
Fill and grow
<div class="d-flex">
<div class="flex-fill">Fill space</div>
<div class="flex-fill">Equal fill</div>
</div>
<div class="flex-grow-1">Grow</div>
<div class="flex-grow-0">Don't grow</div>
<div class="flex-shrink-1">Shrink</div>
<div class="flex-shrink-0">Don't shrink</div>
Auto margins
<div class="d-flex">
<div>Left</div>
<div class="ml-auto">Pushed right</div>
</div>
<div class="d-flex">
<div class="mr-auto">Left</div>
<div>Right</div>
</div>
Cards
Basic card
<div class="card" style="width: 18rem;">
<img src="..." class="card-img-top" alt="..." />
<div class="card-body">
<h5 class="card-title">Card title</h5>
<p class="card-text">Some quick example text.</p>
<a href="#" class="btn btn-primary">Go somewhere</a>
</div>
</div>
Replaces panels/wells/thumbnails.
Header and footer
<div class="card">
<div class="card-header">Featured</div>
<div class="card-body">
<h5 class="card-title">Special title</h5>
<p class="card-text">With supporting text.</p>
<a href="#" class="btn btn-primary">Go</a>
</div>
<div class="card-footer text-muted">2 days ago</div>
</div>
Card colors
<!-- Background colors -->
<div class="card text-white bg-primary">...</div>
<div class="card text-white bg-success">...</div>
<div class="card text-white bg-danger">...</div>
<div class="card text-white bg-warning">...</div>
<div class="card text-white bg-info">...</div>
<div class="card text-white bg-dark">...</div>
<!-- Border colors -->
<div class="card border-primary">...</div>
<div class="card border-danger">...</div>
Card layouts
<!-- Card group -->
<div class="card-group">
<div class="card">...</div>
<div class="card">...</div>
<div class="card">...</div>
</div>
<!-- Card deck -->
<div class="card-deck">
<div class="card">...</div>
<div class="card">...</div>
<div class="card">...</div>
</div>
<!-- Card columns (masonry) -->
<div class="card-columns">
<div class="card">...</div>
<div class="card">...</div>
<div class="card">...</div>
</div>
Card navigation
<div class="card text-center">
<div class="card-header">
<ul class="nav nav-tabs card-header-tabs">
<li class="nav-item"><a class="nav-link active" href="#">Active</a></li>
<li class="nav-item"><a class="nav-link" href="#">Link</a></li>
</ul>
</div>
<div class="card-body">...</div>
</div>
Navbar
Basic navbar
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<a class="navbar-brand" href="#">Brand</a>
<button
class="navbar-toggler"
type="button"
data-toggle="collapse"
data-target="#navbarNav"
>
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav">
<li class="nav-item active">
<a class="nav-link" href="#"
>Home <span class="sr-only">(current)</span></a
>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Features</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Pricing</a>
</li>
</ul>
</div>
</nav>
Requires .navbar-expand-* for collapse.
Color schemes
<!-- Light -->
<nav class="navbar navbar-light bg-light">...</nav>
<nav class="navbar navbar-light" style="background-color: #e3f2fd;">...</nav>
<!-- Dark -->
<nav class="navbar navbar-dark bg-dark">...</nav>
<nav class="navbar navbar-dark bg-primary">...</nav>
Needs both color AND background.
Placement
<!-- Fixed top -->
<nav class="navbar fixed-top">...</nav>
<!-- Fixed bottom -->
<nav class="navbar fixed-bottom">...</nav>
<!-- Sticky top -->
<nav class="navbar sticky-top">...</nav>
Navbar with form
<nav class="navbar navbar-light bg-light">
<form class="form-inline">
<input class="form-control mr-sm-2" type="search" placeholder="Search" />
<button class="btn btn-outline-success my-2 my-sm-0" type="submit">
Search
</button>
</form>
</nav>
Navbar text and dropdowns
<nav class="navbar navbar-expand-lg navbar-light bg-light">
<div class="collapse navbar-collapse">
<ul class="navbar-nav mr-auto">
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" data-toggle="dropdown">
Dropdown
</a>
<div class="dropdown-menu">
<a class="dropdown-item" href="#">Action</a>
<a class="dropdown-item" href="#">Another action</a>
</div>
</li>
</ul>
<span class="navbar-text">Navbar text</span>
</div>
</nav>
Forms
Basic form
<form>
<div class="form-group">
<label for="email">Email address</label>
<input
type="email"
class="form-control"
id="email"
placeholder="Enter email"
/>
</div>
<div class="form-group">
<label for="password">Password</label>
<input type="password" class="form-control" id="password" />
</div>
<button type="submit" class="btn btn-primary">Submit</button>
</form>
Form sizing
<input class="form-control form-control-lg" placeholder="Large" />
<input class="form-control" placeholder="Default" />
<input class="form-control form-control-sm" placeholder="Small" />
Custom controls
<!-- Custom checkbox -->
<div class="custom-control custom-checkbox">
<input type="checkbox" class="custom-control-input" id="check1" />
<label class="custom-control-label" for="check1">Check this</label>
</div>
<!-- Custom radio -->
<div class="custom-control custom-radio">
<input type="radio" class="custom-control-input" id="radio1" name="radio" />
<label class="custom-control-label" for="radio1">Option 1</label>
</div>
<!-- Custom switch -->
<div class="custom-control custom-switch">
<input type="checkbox" class="custom-control-input" id="switch1" />
<label class="custom-control-label" for="switch1">Toggle</label>
</div>
<!-- Custom select -->
<select class="custom-select">
<option selected>Open this select</option>
<option value="1">One</option>
<option value="2">Two</option>
</select>
Validation states
<!-- Valid -->
<input class="form-control is-valid" />
<div class="valid-feedback">Looks good!</div>
<!-- Invalid -->
<input class="form-control is-invalid" />
<div class="invalid-feedback">Please provide a valid value.</div>
Inline forms
<form class="form-inline">
<label class="sr-only" for="name">Name</label>
<input
type="text"
class="form-control mb-2 mr-sm-2"
id="name"
placeholder="Name"
/>
<label class="sr-only" for="email">Email</label>
<input
type="email"
class="form-control mb-2 mr-sm-2"
id="email"
placeholder="Email"
/>
<button type="submit" class="btn btn-primary mb-2">Submit</button>
</form>
Horizontal forms
<form>
<div class="form-group row">
<label for="email" class="col-sm-2 col-form-label">Email</label>
<div class="col-sm-10">
<input type="email" class="form-control" id="email" />
</div>
</div>
<div class="form-group row">
<div class="col-sm-10 offset-sm-2">
<button type="submit" class="btn btn-primary">Sign in</button>
</div>
</div>
</form>
Form row
<form>
<div class="form-row">
<div class="col">
<input type="text" class="form-control" placeholder="First name" />
</div>
<div class="col">
<input type="text" class="form-control" placeholder="Last name" />
</div>
</div>
</form>
Tighter gutters than .row.
Display Utilities
Display classes
<div class="d-none">Hidden on all</div>
<div class="d-block">Block on all</div>
<div class="d-inline">Inline on all</div>
<div class="d-inline-block">Inline block</div>
Responsive display
<!-- Hide on mobile, show on md+ -->
<div class="d-none d-md-block">Hidden below md</div>
<!-- Show on mobile only -->
<div class="d-block d-md-none">Visible below md only</div>
<!-- Hide on tablet -->
<div class="d-block d-md-none d-lg-block">Hidden on md</div>
Print utilities
<div class="d-print-none">Hidden when printing</div>
<div class="d-none d-print-block">Only visible when printing</div>
Typography
Display headings
<h1 class="display-1">Display 1</h1>
<h1 class="display-2">Display 2</h1>
<h1 class="display-3">Display 3</h1>
<h1 class="display-4">Display 4</h1>
Larger, lighter headings.
Lead text
<p class="lead">Lead paragraph stands out.</p>
Text alignment
<p class="text-left">Left aligned</p>
<p class="text-center">Center aligned</p>
<p class="text-right">Right aligned</p>
<p class="text-justify">Justified text</p>
<!-- Responsive -->
<p class="text-sm-center">Center on sm+</p>
Text transform
<p class="text-lowercase">LOWERCASED TEXT</p>
<p class="text-uppercase">uppercased text</p>
<p class="text-capitalize">capitalized text</p>
Font weight and italics
<p class="font-weight-bold">Bold text</p>
<p class="font-weight-bolder">Bolder weight</p>
<p class="font-weight-normal">Normal weight</p>
<p class="font-weight-light">Light weight</p>
<p class="font-weight-lighter">Lighter weight</p>
<p class="font-italic">Italic text</p>
Text utilities
<p class="text-truncate">Truncated text with ellipsis</p>
<p class="text-nowrap">No wrapping text</p>
<p class="text-break">Break long words</p>
<p class="text-monospace">Monospace text</p>
Text colors
<p class="text-primary">Primary text</p>
<p class="text-secondary">Secondary text</p>
<p class="text-success">Success text</p>
<p class="text-danger">Danger text</p>
<p class="text-warning">Warning text</p>
<p class="text-info">Info text</p>
<p class="text-light bg-dark">Light text</p>
<p class="text-dark">Dark text</p>
<p class="text-muted">Muted text</p>
<p class="text-white bg-dark">White text</p>
Migration from Bootstrap 3
Class changes
| Bootstrap 3 | Bootstrap 4 | Notes |
|---|---|---|
col-xs-6 |
col-6 |
No more -xs infix |
col-xs-offset-4 |
offset-4 |
Simplified offset |
col-md-push-4 |
order-2 |
Flexbox ordering |
col-md-pull-8 |
order-1 |
Flexbox ordering |
panel panel-default |
card |
Unified component |
panel-heading |
card-header |
Renamed |
panel-body |
card-body |
Renamed |
panel-footer |
card-footer |
Renamed |
well |
card |
Merged into cards |
thumbnail |
card |
Merged into cards |
btn btn-default |
btn btn-secondary |
Renamed variant |
label label-default |
badge badge-secondary |
Now badges |
hidden-xs |
d-none d-sm-block |
Inverted logic |
visible-xs |
d-block d-sm-none |
Inverted logic |
pull-right |
float-right or ml-auto |
Float or flexbox |
pull-left |
float-left or mr-auto |
Float or flexbox |
center-block |
mx-auto with d-block |
Margin utility |
input-lg |
form-control-lg |
Renamed |
input-sm |
form-control-sm |
Renamed |
help-block |
form-text |
Renamed |
has-error |
is-invalid |
Validation class |
has-success |
is-valid |
Validation class |
control-label |
col-form-label |
Horizontal forms |
navbar-default |
navbar-light bg-light |
Separate classes |
navbar-inverse |
navbar-dark bg-dark |
Separate classes |
navbar-right |
ml-auto in navbar-nav |
Flexbox |
img-responsive |
img-fluid |
Renamed |
img-circle |
rounded-circle |
Renamed |
img-rounded |
rounded |
Renamed |
| Glyphicons | (removed) | Use Font Awesome |
Major changes
- No more
-xsinfix:col-xs-6becomescol-6 - Flexbox by default: Grid, navbar, cards all use flexbox
- Panels → Cards: Single component for panels, wells, thumbnails
- Inverted responsive utilities: Use
d-none d-md-blockinstead ofhidden-xs hidden-sm - Push/Pull → Order: Use
order-*classes for column reordering - Navbar requires expand class: Must specify
.navbar-expand-lgetc. - Navbar color separation: Use both
.navbar-lightAND.bg-light - Glyphicons removed: Must use third-party icon library
- jQuery still required: BS4 components need jQuery (removed in BS5)
- New spacing utilities:
m-*andp-*classes for margin/padding
Gotchas
Common pitfalls
⚠️ No more -xs infix: col-xs-6 → col-6. The xs breakpoint doesn't use an infix.
⚠️ Navbar requires .navbar-expand-*: Without it, navbar won't collapse on mobile.
⚠️ Navbar needs BOTH color scheme AND background: Use navbar-light bg-light not just navbar-light.
⚠️ Panels/wells/thumbnails all replaced by Cards: Single unified component.
⚠️ Glyphicons removed: Must use Font Awesome or other third-party icons.
⚠️ .hidden-* replaced with .d-none .d-{bp}-block: Inverted logic compared to BS3.
⚠️ Push/pull replaced with flexbox order-* classes: No more .col-md-push-4.
⚠️ jQuery still required in BS4: Dropped in Bootstrap 5, but BS4 needs it.
⚠️ BS4.6.2 is the FINAL release: No more updates. Consider migrating to Bootstrap 5.
⚠️ Custom controls require specific markup: Use .custom-control wrapper with .custom-control-input and .custom-control-label.
Also see
- Bootstrap 4 Documentation (getbootstrap.com)
- Grid System (getbootstrap.com)
- Spacing Utilities (getbootstrap.com)
- Cards (getbootstrap.com)
- Flex Utilities (getbootstrap.com)
- Migration Guide (getbootstrap.com)