I am trying to find the most effective way to align text with a div. I have tried a few things and none seem to work.
.testimonialText {
position: absolute;
left: 15px;
top: 15px;
width: 150px;
height: 309px;
vertical-align: middle;
text-align: center;
font-family: Georgia, "Times New Roman", Times, serif;
font-style: italic;
padding: 1em 0 1em 0;
}
<div class="testimonialText">
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor
in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</div>
4
The correct way to do this in modern browsers is to use Flexbox.
See this answer for details.
See below for some older ways that work in older browsers.
Vertical Centering in CSS
http://www.jakpsatweb.cz/css/css-vertical-center-solution.html
Article summary:
For a CSS 2 browser, one can use display:table
/display:table-cell
to center content.
A sample is also available at JSFiddle:
div { border:1px solid green;}
<div style="display: table; height: 400px; overflow: hidden;">
<div style="display: table-cell; vertical-align: middle;">
<div>
everything is vertically centered in modern IE8+ and others.
</div>
</div>
</div>
It is possible to merge hacks for old browsers (Internet Explorer 6/7) into styles with using #
to hide styles from newer browsers:
div { border:1px solid green;}
<div style="display: table; height: 400px; #position: relative; overflow: hidden;">
<div style=
"#position: absolute; #top: 50%;display: table-cell; vertical-align: middle;">
<div style=" #position: relative; #top: -50%">
everything is vertically centered
</div>
</div>
</div>
3
You need to add the line-height
attribute and that attribute must match the height of the div
. In your case:
.center {
height: 309px;
line-height: 309px; /* same as height! */
}
<div class="center">
A single line.
</div>
In fact, you could probably remove the height
attribute altogether.
This only works for one line of text though, so be careful.
2
2024 Update
Things have moved on a lot since my original answer below, and I want to point you in the direction of this exceptional Josh Comeau article on how to center a div in CSS:
https://www.joshwcomeau.com/css/center-a-div/
For a long time, centering an element within its parent was a surprisingly tricky thing to do. As CSS has evolved, we’ve been granted more and more tools we can use to solve this problem. These days, we’re spoiled for choice!
I decided to create this tutorial to help you understand the trade-offs between different approaches, and to give you an arsenal of strategies you can use, to handle centering in all sorts of scenarios.
P.S. he also has some great resources for learning CSS Flexbox and CSS Grid
Original answer
Here’s a great resource
From http://howtocenterincss.com/:
Centering in CSS is a pain in the ass. There seems to be a gazillion ways to do it, depending on a variety of factors. This consolidates them and gives you the code you need for each situation.
Using Flexbox
Inline with keeping this post up to date with the latest tech, here’s a much easier way to center something using Flexbox. Flexbox isn’t supported in Internet Explorer 9 and lower.
Here are some great resources:
- A guide to Flexbox
- Centering elements with Flexbox
- Internet Explorer 10 syntax for Flexbox
- Support for Flexbox
JSFiddle with browser prefixes
li {
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
/* Column | row */
}
<ul>
<li>
<p>Some Text</p>
</li>
<li>
<p>A bit more text that goes on two lines</p>
</li>
<li>
<p>Even more text that demonstrates how lines can span multiple lines</p>
</li>
</ul>
Another solution
This is from zerosixthree and lets you center anything with six lines of CSS
This method isn’t supported in Internet Explorer 8 and lower.
jsfiddle
p {
text-align: center;
position: relative;
top: 50%;
-ms-transform: translateY(-50%);
-webkit-transform: translateY(-50%);
transform: translateY(-50%);
}
<ul>
<li>
<p>Some Text</p>
</li>
<li>
<p>A bit more text that goes on two lines</p>
</li>
<li>
<p>Even more text that demonstrates how lines can span multiple lines</p>
</li>
</ul>
Previous answer
A simple and cross-browser approach, useful as links in the marked answer are slightly outdated.
How to vertically and horizontally center text in both an unordered list and a div without resorting to JavaScript or CSS line heights. No matter how much text you have you won’t have to apply any special classes to specific lists or divs (the code is the same for each). This works on all major browsers including Internet Explorer 9, Internet Explorer 8, Internet Explorer 7, Internet Explorer 6, Firefox, Chrome, Opera and Safari. There are two special stylesheets (one for Internet Explorer 7 and another for Internet Explorer 6) to help them along due to their CSS limitations which modern browsers don’t have.
Andy Howard – How to vertically and horizontally center text in an unordered list or div
As I didn’t care much for Internet Explorer 7/6 for the last project I worked on, I used a slightly stripped down version (i.e. removed the stuff that made it work in Internet Explorer 7 and 6). It might be useful for somebody else…
JSFiddle
.outerContainer {
display: table;
width: 100px;
/* Width of parent */
height: 100px;
/* Height of parent */
overflow: hidden;
}
.outerContainer .innerContainer {
display: table-cell;
vertical-align: middle;
width: 100%;
margin: 0 auto;
text-align: center;
}
li {
background: #ddd;
width: 100px;
height: 100px;
}
<ul>
<li>
<div class="outerContainer">
<div class="innerContainer">
<div class="element">
<p>
<!-- Content -->
Content
</p>
</div>
</div>
</div>
</li>
<li>
<div class="outerContainer">
<div class="innerContainer">
<div class="element">
<p>
<!-- Content -->
Content
</p>
</div>
</div>
</div>
</li>
</ul>
2
It is easy with display: flex
. With the following method, the text in the div
will be centered vertically:
div {
display: -webkit-flex;
display: flex;
align-items: center;
/* More style: */
height: 300px;
background-color: #888;
}
<div>
Your text here.
</div>
And if you want, horizontal:
div {
display: -webkit-flex;
display: flex;
align-items: center;
justify-content: center;
/* More style: */
height: 300px;
background-color: #888;
}
<div>
Your text here.
</div>
You must see the browser version you need; in old versions the code doesn’t work.
0
I use the following to vertically center random elements easily:
HTML:
<div style="height: 200px">
<div id="mytext">This is vertically aligned text within a div</div>
</div>
CSS:
#mytext {
position: relative;
top: 50%;
transform: translateY(-50%);
}
This centers the text in my div
to the exact vertical middle of a 200px-high outer div
. Note that you may need to use a browser prefix (like -webkit-
in my case) to make this work for your browser.
This works not only for text, but also for other elements.
0
Try this, add on the parent div:
display: flex;
align-items: center;
0
You can do this by setting the display to ‘table-cell’ and applying a vertical-align: middle;
:
{
display: table-cell;
vertical-align: middle;
}
This is however not supported by all versions of Internet Explorer according to this excerpt I copied from http://www.w3schools.com/cssref/pr_class_display.asp without permission.
Note: The values “inline-table”, “table”, “table-caption”, “table-cell”, “table-column”, “table-column-group”, “table-row”, “table-row-group”, and “inherit” are not supported by Internet Explorer 7 and earlier. Internet Explorer 8 requires a !DOCTYPE. Internet Explorer 9 supports the values.
The following table shows the allowed display values also from http://www.w3schools.com/cssref/pr_class_display.asp.
0
These days (we don’t need Internet Explorer 6-8 any more) I would just use CSS display: table
for this issue (or display: flex
).
Table:
.vcenter {
display: table;
background: #eee; /* optional */
width: 150px;
height: 150px;
text-align: center; /* optional */
}
.vcenter > :first-child {
display: table-cell;
vertical-align: middle;
}
<div class="vcenter">
<p>This is my Text</p>
</div>
Flex:
.vcenter {
display: flex;
align-items: center;
height: 150px;
justify-content: center; /* optional */
background: #eee; /* optional */
width: 150px;
}
<div class="vcenter">
<p>This is my text</p>
</div>
For older browsers:
This is (actually, was) my favorite solution for this issue (simple and very well browser supported):
div {
margin: 5px;
text-align: center;
display: inline-block;
}
.vcenter {
background: #eee; /* optional */
width: 150px;
height: 150px;
}
.vcenter:before {
content: " ";
display: inline-block;
height: 100%;
vertical-align: middle;
max-width: 0.001%; /* Just in case the text wrapps, you shouldn't notice it */
}
.vcenter > :first-child {
display: inline-block;
vertical-align: middle;
max-width: 99.999%;
}
<div class="vcenter">
<p>This is my text</p>
</div>
<div class="vcenter">
<h4>This is my Text<br/>Text<br/>Text</h4>
</div>
<div class="vcenter">
<div>
<p>This is my</p>
<p>Text</p>
</div>
</div>
0
Flexbox worked perfectly for me, centering multiple elements inside parent div horizontally & vertically.
Code below stacks all elements inside of parent-div in a column, centering the elements horizontally & vertically.
I used the child-div to keep the two Anchor elements on same line (row). Without child-div all three elements (Anchor, Anchor & Paragraph) are stacked inside parent-div’s column on top of each other. Here only child-div is stacked inside parent-div column.
.parent-div {
height: 150px;
display: flex;
flex-direction: column;
justify-content: center;
background: pink;
}
<div class="parent-div">
<div class="child-div">
<a class="footer-link" href="https://www.github.com/">GitHub</a>
<a class="footer-link" href="https://www.facebook.com/">Facebook</a>
<p class="footer-copywrite">© 2019 Lorem Ipsum.</p>
</div>
</div>
You can use display grid and place-items center:
.container {
width: 200px;
height: 200px;
border: solid red;
display: grid;
place-items: center;
}
<div class="container">
Lorem, ipsum dolor.
</div>
Very very simple solution, I used it in my projects many times which is:
Source Code
.welcome_box{
height: 300px;
display: flex;
justify-content: center;
align-content: center;
flex-direction: column;
border: solid 1px #dadada;
}
<div class="welcome_box">Hello Friends</div>
Output:
Thanks to ask this question. Happy to share.
Here is a solution that works best for a single line of text.
It can also work for multi-lined text with some tweaking if the number of lines is known.
.testimonialText {
font-size: 1em; /* Set a font size */
}
.testimonialText:before { /* Add a pseudo element */
content: "";
display: block;
height: 50%;
margin-top: -0.5em; /* Half of the font size */
}
Here is a JSFiddle.
<!DOCTYPE html>
<html>
<head>
<style>
.container {
height: 250px;
background: #f8f8f8;
display: -ms-flexbox;
display: -webkit-flex;
display: flex;
-ms-flex-align: center;
align-items: center;
-webkit-box-align: center;
justify-content: center;
}
p{
font-size: 24px;
}
</style>
</head>
<body>
<div class="container">
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
</div>
</body>
</html>
0
You can align center text vertically inside a div using Flexbox.
<div>
<p class="testimonialText">This is the testimonial text.</p>
</div>
div {
display: flex;
align-items: center;
}
You can learn more about it at A Complete Guide to Flexbox.
Check this simple solution:
HTML
<div class="block-title"><h3>I'm a vertically centered element</h3></div>
CSS
.block-title {
float: left;
display: block;
width: 100%;
height: 88px
}
.block-title h3 {
display: table-cell;
vertical-align: middle;
height: inherit
}
JSFiddle
This is the cleanest solution I have found (Internet Explorer 9+) and adds a fix for the “off by .5 pixel” issue by using transform-style
that other answers had omitted.
.parent-element {
-webkit-transform-style: preserve-3d;
-moz-transform-style: preserve-3d;
transform-style: preserve-3d;
}
.element {
position: relative;
top: 50%;
-webkit-transform: translateY(-50%);
-ms-transform: translateY(-50%);
transform: translateY(-50%);
}
Source: Vertical align anything with just 3 lines of CSS
HTML :
<div class="col-md-2 ml-2 align-middle">
<label for="option2" id="time-label">Time</label>
</div>
CSS :
.align-middle {
margin-top: auto;
margin-bottom: auto;
}
Using CSS grid did it for me:
.outer {
background-color: grey;
width: 10rem;
height: 10rem;
display: grid;
justify-items: center;
}
.inner {
background-color: #FF8585;
align-self: center;
}
<div class='outer'>
<div class='inner'>
Content
</div>
</div>
0
There’s a simpler way to vertically align the content without resorting to table/table-cell:
http://jsfiddle.net/bBW5w/1/
In it I have added an invisible (width=0) div that assumes the entire height of the container.
It seems to work in Internet Explorer and Firefox (latest versions). I didn’t check with other browsers
<div class="t">
<div>
everything is vertically centered in modern IE8+ and others.
</div>
<div></div>
</div>
And of course the CSS:
.t, .t > div:first-child
{
border: 1px solid green;
}
.t
{
height: 400px;
}
.t > div
{
display: inline-block;
vertical-align: middle
}
.t > div:last-child
{
height: 100%;
}
0
A simple solution to an element of not knowing values:
HTML
<div class="main">
<div class="center">
whatever
</div>
</div>
CSS
.main {
position: relative
}
.center {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
-webkit-transform: translate(-50%, -50%);
-moz-transform: translate(-50%, -50%);
-o-transform: translate(-50%, -50%);
}
According to Adam Tomat’s answer there was prepared a JSFiddle example to align the text in div:
<div class="cells-block">
text<br/>in the block
</div>
by using display:flex in CSS:
.cells-block {
display: flex;
flex-flow: column;
align-items: center; /* Vertically */
justify-content: flex-end; /* Horisontally */
text-align: right; /* Addition: for text's lines */
}
with another example and a few explanations in a blog post.
Margin auto on a grid-item.
Similarly to Flexbox, applying margin auto on a grid-item centers it on both axes:
.container {
display: grid;
}
.element {
margin: auto;
}
2024
Browsers now added support for align-content
on a default <div> (i.e. set with display:block
). So after all these years you can finally do this with two simple CSS properties:
.centered-content {
align-content: center; /* centers vertically */
text-align: center; /* centers horizontally */
}
<div class="centered-content" style="height:200px; background:silver">Hello World!</div>
A cool advantage of this solution is that you can use text-overflow: ellipsis
without adding a child to your <div>.
Browser Support: Chrome 123, Edge 123, Firefox 125, Safari 17.4
Use:
h1 {
margin: 0;
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
}
.container {
height: 200px;
width: 500px;
position: relative;
border: 1px solid #eee;
}
<div class="container">
<h1>Vertical align text</h1>
</div>
With this trick, you can align anything if you don’t want to make it center add “left:0” to align left.
HTML
<div class="relative"><!--used as a container-->
<!-- add content here to to make some height and width
example:<img src="" alt=""> -->
<div class="absolute">
<div class="table">
<div class="table-cell">
Vertical contents goes here
</div>
</div>
</div>
</div>
CSS
.relative {
position: relative;
}
.absolute {
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
background: rgba(0, 0, 0, 0.5);
}
.table {
display: table;
height: 100%;
width: 100%;
text-align: center;
color: #fff;
}
.table-cell {
display: table-cell;
vertical-align: middle;
}
Using flex, be careful with differences in browsers’ rendering.
This works well both for Chrome and Internet Explorer:
.outer {
display: flex;
width: 200px;
height: 200px;
background-color: #ffc;
}
.inner {
display: flex;
width: 50%;
height: 50%;
margin: auto;
text-align: center;
justify-content: center;
align-items: center;
background-color: #fcc;
}
<div class="outer"><div class="inner">Active Tasks</div></div>
Compare with this one that works only with Chrome:
.outer {
display: flex;
width: 200px;
height: 200px;
background-color: #ffc;
}
.inner {
display: flex;
width: 50%;
height: 50%;
margin: auto;
background-color: #fcc;
}
<div class="outer">
<div class="inner"><span style=" margin: auto;">Active Tasks</span></div>
</div>
This is another variation of the div
in a div
pattern using calc()
in CSS.
<div style="height:300px; border:1px solid green;">
Text in outer div.
<div style="position:absolute; height:20px; top:calc(50% - 10px); border:1px solid red;)">
Text in inner div.
</div>
</div>
This works, because:
position:absolute
for precise placement of thediv
within adiv
- we know the height of the inner
div
because we set it to20px
. calc(50% - 10px)
for 50% – half the height for centering the innerdiv
1
This works fine:
HTML
<div class="information">
<span>Some text</span>
<mat-icon>info_outline</mat-icon>
</div>
Sass
.information {
display: inline-block;
padding: 4px 0;
span {
display: inline-block;
vertical-align: middle;
}
mat-icon {
vertical-align: middle;
}
}
Without and with the image tag <mat-icon>
(which is a font).
You can use css flexbox
.
.testimonialText {
height: 500px;
padding: 1em;
display: flex;
align-items: center;
justify-content: center;
border: 1px solid #b4d2d2;
}
<div class="testimonialText">
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor
in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</div>
1
This will center text vertically:
.parent {
display: inline-flex
}
.testimonialText {
margin-top: auto;
margin-bottom: auto;
}
<div class="parent">
<div class="testimonialText">
Hello World
</div>
</div>
1