Question
I have a fixed-height header section, but the amount of text inside it can change.
<div id="header">
<h1>Header title</h1>
Header content (one or multiple lines)
</div>
#header {
height: 150px;
}
I want the content inside the header to be vertically aligned to the bottom of the header area so that the last line of text sits at the bottom edge of the section.
For example, if there is only one line of content, it should appear near the bottom. If there are multiple lines, the block of content should still end at the bottom of the header.
How can this be done in CSS?
Short Answer
By the end of this page, you will understand how vertical alignment works in CSS and how to place content at the bottom of a fixed-height container. You will learn beginner-friendly solutions using Flexbox, absolute positioning, and older layout techniques, along with when each option is appropriate.
Concept
In CSS, bottom-aligning content inside a container means placing an element or block so that its lower edge sits against the lower edge of its parent.
This is a very common layout task in web development. You might want to:
- place text at the bottom of a banner
- anchor buttons to the bottom of a card
- align labels or captions consistently
- keep content visually balanced in fixed-height sections
A key idea is that CSS does not have one universal vertical-align: bottom rule for normal block layout. The property vertical-align only works in specific contexts, such as:
- inline elements
- table cells
- inline-block elements in a line
For a normal div, the most reliable modern approach is usually Flexbox.
If you want all content inside a container to sit at the bottom, Flexbox works well. If you want only a specific child to stick to the bottom, absolute positioning can also work.
For your example, the main challenge is this:
- the container has a fixed height
- the content height changes
- the content should end at the bottom of the container
That is exactly the kind of layout Flexbox was designed to solve cleanly.
Mental Model
Think of the div as a 150px-tall box.
Inside that box, your content is like a small stack of papers. Normally, the stack starts at the top of the box. But you want the stack pushed down so its bottom edge touches the bottom of the box.
Flexbox acts like a layout tool that lets you say:
- "Put items in a column"
- "Now push that column to the bottom"
So instead of manually calculating spacing, you tell the browser how to distribute the available vertical space.
Syntax and Examples
Recommended approach: Flexbox
<div id="header">
<h1>Header title</h1>
<p>Header content (one or multiple lines)</p>
</div>
#header {
height: 150px;
display: flex;
flex-direction: column;
justify-content: flex-end;
}
How it works
display: flexturns the container into a flex container.flex-direction: columnstacks children vertically.justify-content: flex-endpushes the children to the bottom.
This is the simplest modern solution when you want the content inside a fixed-height container aligned to the bottom.
Better spacing example
Browsers give headings and paragraphs default margins, which can affect alignment. You may want to reset them:
<div id="header">
<h1>Header title</h1>
<p>Header content that may be one line or several lines long.</p>
</div>
#header {
height: 150px;
display: flex;
flex-direction: column;
justify-content: flex-end;
padding: 12px;
box-sizing: border-box;
background: #f2f2f2;
}
#header h1,
#header p {
margin: 0;
}
This version is usually easier to control in real layouts.
Alternative: Absolute positioning
If you want a specific child element anchored to the bottom, you can use positioning:
<div id="header">
<h1>Header title</h1>
<p class="bottom-text">Header content</p>
</div>
#header {
position: relative;
height: 150px;
}
.bottom-text {
position: absolute;
bottom: 0;
}
This works, but it is better when you are positioning a single element, not a whole changing content block.
Older table-cell technique
#header {
height: 150px;
display: table-cell;
vertical-align: bottom;
}
This can work, but it is an older layout trick. Flexbox is usually preferred today because it is clearer and more flexible.
Step by Step Execution
Consider this example:
<div id="header">
<h1>Header title</h1>
<p>Some changing header content.</p>
</div>
#header {
height: 150px;
display: flex;
flex-direction: column;
justify-content: flex-end;
}
What happens step by step
- The browser creates the
#headerelement. height: 150pxgives it a fixed vertical size.display: flexchanges how its direct children are laid out.flex-direction: columntells the browser to placeh1andpfrom top to bottom.justify-content: flex-endtells the browser to place that vertical stack at the bottom of the available height.- If the paragraph becomes taller because it wraps onto more lines, the stack grows upward while still ending at the bottom.
Visual idea
If content is short:
- extra empty space appears above the content
- content stays attached to the bottom
If content becomes taller:
- it uses more vertical space
- the bottom still remains aligned with the container’s bottom edge
Important detail
Default margins on h1 and p can create extra space. If alignment looks slightly off, reset margins:
#header h1,
#header p {
margin: 0;
}
Real World Use Cases
Bottom alignment inside containers appears in many real interfaces:
- Hero banners: headline at the top, supporting text aligned near the bottom
- Profile cards: action buttons pinned to the lower edge
- Product tiles: price and call-to-action aligned consistently
- Image captions: text placed at the bottom of an overlay
- Dashboard widgets: status labels or totals anchored at the bottom
- Mobile app headers: title and subtitle aligned in a controlled vertical area
Example: a card layout
<div class="card">
<h2>Pro Plan</h2>
<p>Extra analytics and priority support.</p>
<button>Choose Plan</button>
</div>
.card {
height: 220px;
display: flex;
flex-direction: column;
justify-content: flex-end;
padding: 16px;
}
This keeps the card content visually grounded at the bottom.
Real Codebase Usage
In real projects, developers usually use Flexbox for this kind of layout because it is readable and easy to maintain.
Common patterns include:
1. Bottom-aligning a group of elements
.panel {
display: flex;
flex-direction: column;
justify-content: flex-end;
}
Use this when several children should move together.
2. Pushing one item down with margin-top: auto
<div class="card">
<h2>Title</h2>
<p>Description text</p>
<button>Buy</button>
</div>
.card {
display: flex;
flex-direction: column;
height: 200px;
}
.card button {
margin-top: auto;
}
This is very common in cards and panels. Instead of moving all content to the bottom, it pushes only the button downward.
3. Using guard-style layout rules
Developers often combine bottom alignment with:
paddingto keep text from touching edgesbox-sizing: border-boxso padding stays inside fixed height- margin resets for headings and paragraphs
- responsive rules for smaller screens
4. Overlay text on images
.banner {
position: relative;
}
.banner-content {
position: absolute;
bottom: 0;
left: 0;
right: 0;
padding: 16px;
}
This is common for captions or text layered on top of images.
In modern codebases, Flexbox for normal layout and absolute positioning for overlays is a very common rule of thumb.
Common Mistakes
1. Using vertical-align on a normal div
Broken example:
#header {
height: 150px;
vertical-align: bottom;
}
Why it fails:
vertical-aligndoes not work the way many beginners expect on block elements like a standarddiv
Use Flexbox instead.
2. Forgetting flex-direction: column
Broken example:
#header {
height: 150px;
display: flex;
justify-content: flex-end;
}
Why it may look wrong:
- Flexbox defaults to a horizontal row
justify-contentworks along the main axis- so this pushes items to the right, not to the bottom
Fix:
#header {
display: flex;
flex-direction: column;
justify-content: flex-end;
}
3. Ignoring default margins
Broken-looking example:
#header {
height: 150px;
display: flex;
flex-direction: column;
justify-content: flex-end;
}
Even if the layout is correct, h1 and p margins may create unexpected spacing.
Fix:
#header h1,
#header p {
margin: 0;
}
4. Using absolute positioning for everything
.bottom-text {
position: absolute;
bottom: 0;
}
This can overlap other content if the layout changes.
Use it only when you intentionally want layered or independently positioned elements.
5. Forgetting position: relative when using absolute positioning
Broken example:
#header {
height: 150px;
}
.bottom-text {
position: absolute;
bottom: 0;
}
Why it fails:
- the absolutely positioned element may anchor to a different ancestor or even the page
Fix:
#header {
position: relative;
}
Comparisons
| Approach | Best for | Pros | Cons |
|---|---|---|---|
Flexbox with justify-content: flex-end | Bottom-aligning all content in a container | Simple, modern, responsive | Requires understanding flex direction |
Absolute positioning with bottom: 0 | Anchoring one specific child to the bottom | Precise placement | Can overlap content and be harder to maintain |
display: table-cell with vertical-align: bottom | Older layouts or legacy code | Can work for simple cases | Less flexible and less common in modern CSS |
margin-top: auto in Flexbox | Pushing one item to the bottom | Very common in cards and buttons | Only affects specific flex items |
Flexbox vs absolute positioning
- Use Flexbox when content is part of normal document flow.
- Use absolute positioning when content should be layered or independently anchored.
justify-content vs align-items
In a column flex container:
justify-contentcontrols vertical placementalign-itemscontrols horizontal placement
That means for bottom alignment in a column layout, justify-content: flex-end is the key rule.
Cheat Sheet
/* Best modern solution */
.container {
height: 150px;
display: flex;
flex-direction: column;
justify-content: flex-end;
}
Quick rules
- Use Flexbox to bottom-align content inside a fixed-height container.
- Add
flex-direction: columnfor vertical stacking. - Use
justify-content: flex-endto push children to the bottom. - Reset default margins on headings and paragraphs if spacing looks wrong.
- Use
position: absolute; bottom: 0;only when anchoring a specific child.
Common patterns
Bottom-align all children
.container {
display: flex;
flex-direction: column;
justify-content: flex-end;
}
Push only the last item down
.container {
display: flex;
flex-direction: column;
}
.last-item {
margin-top: auto;
}
Older technique
.container {
display: table-cell;
vertical-align: bottom;
}
Edge cases
vertical-aligndoes not bottom-align a regular blockdiv- heading and paragraph margins can affect the final look
- fixed heights can cause overflow if content becomes too tall
FAQ
How do I align text to the bottom of a div in CSS?
Use Flexbox on the parent container:
.parent {
display: flex;
flex-direction: column;
justify-content: flex-end;
}
Why does vertical-align: bottom not work on my div?
vertical-align does not work as expected on normal block elements. It mainly applies to inline, inline-block, and table-cell layouts.
What is the modern CSS way to bottom-align content?
The modern and most common solution is Flexbox, usually with display: flex, flex-direction: column, and justify-content: flex-end.
When should I use absolute positioning instead?
Use absolute positioning when a specific child should be pinned to the bottom independently, especially in overlays or layered designs.
How do I push only one element to the bottom?
Inside a column flex container, apply margin-top: auto to that element.
Why does the content still not sit exactly at the bottom?
Default margins on elements like h1 and p often create extra space. Reset them with margin: 0.
What happens if the content is taller than the fixed-height container?
The content may overflow the container. In that case, consider removing the fixed height, using min-height, or adding overflow handling.
Mini Project
Description
Build a small promo banner with a fixed height where the title and description always sit at the bottom. This demonstrates how to use Flexbox to control vertical layout in a practical UI component.
Goal
Create a fixed-height banner whose text content remains bottom-aligned even when the description changes length.
Requirements
- Create a container with a fixed height.
- Add a title and a paragraph inside it.
- Bottom-align the content using CSS.
- Add padding so the text does not touch the edges.
- Reset default margins for cleaner alignment.
Keep learning
Related questions
Allow Only Numeric Input (0-9) in HTML Input Using jQuery
Learn how to allow only digits 0-9 in an HTML input using jQuery, with examples, validation tips, common mistakes, and best practices.
Apply CSS !important with jQuery .css()
Learn why jQuery .css() cannot set !important and how to use CSSStyleDeclaration.setProperty() to apply inline important styles safely.
CSS ::before and ::after on Input Elements
Learn why CSS ::before and ::after usually do not work on input elements, what replaced elements are, and practical alternatives.