Demos of each of the methods below by clicking here.
Horizontal centering with css is rather easy. When the element to be centered is an inline element we use text-align center on its parent. When the element is a block level element we give width and set the left and right margins to auto.
With text-align: center in mind, most people look first to vertical-align in order to center things vertically.
Unfortunately vertical-align doesn’t apply to block-level elements like a paragraph inside a div, It applies to table cells and it works with some inline elements.
Line-Height Method
Sample here
All we need to do is set a line-height on the element containing the text larger than its font-size.
<div id="parent">
<div id="child">Text here</div>
</div>
#child {
line-height: 200px;
}
The above works in all browsers, however it will only work for a single line of text. If your text could wrap to a 2nd line you need to use a different method. The value of 200px above is arbitrary. You can use any value you want as long as its larger than the font-size that’s been set.
Centering an Image with Line-Height
What if the content you want centered is an image? Will this method work? The answer is yes with one additional line of css.
CSS Table Method
Worked for block level elements like div. Use this way to those content without know it's height and width. We’ll display our elements as table and table cell and then use the vertical-align property to center the content.
Note: CSS tables are not the same as html tables.
<div id="parent">
<div id="child">Content here</div>
</div> #parent {display: table;} #child {
display: table-cell;
vertical-align: middle;
}
if not work with in older version of IE, just add
#child {
display: inline-block;
}
Absolute Positioning and Negative Margin
This method works for block level elements and also works in all browsers. It does require that we set the height of the element we want to center.
<div id="parent">
<div id="child">Content here</div>
</div> #parent {position: relative;} #child {
position: absolute;
top: 50%;
left: 50%;
height: 30%;
width: 50%;
margin: -15% 0 0 -25%;
}
We begin by positioning both parent and child divs. Next we set the top and left values of the child to be 50% each, which would be the center of the parent. However this sets the top left corner to be in the center so we’re not done.
We need to move the child up (by half its height) and to the left (by half its width) so its center is what sits in the center of the parent element. This is why we need to know the height (and here the width) of the child element.
To do that we give the element a negative top and left margin equal to half its height and width.
Unlike the first 2 methods this one is meant for block level elements. It does work in all browsers, however the content can outgrow its container in which case it will disappear visually(Because the container is fix width and height). It’ll work best when you know the heights and widths of the elements.
Absolute Positioning and Stretching
<div id="parent">
<div id="child">Content here</div>
</div> #parent {position: relative;} #child {
position: absolute;
top:;
bottom:;
left:;
right:;
width: 50%;
height: 30%;
margin: auto;
}
The idea with this method is to try to get the child element to stretch to all 4 edges by setting the top, bottom, right, and left vales to 0. Because our child element is smaller than our parent elements it can’t reach all 4 edges.
Setting auto as the margin on all 4 sides however causes opposite margins to be equal and displays our child div in the center of the parent div.
Unfortunately the above won’t work in IE7 and below and like the previous method the content inside the child div can grow too large causing it to be hidden.
Equal Top and Bottom Padding
<div id="parent">
<div id="child">Content here</div>
</div> #parent {
padding: 5% 0;
} #child {
padding: 10% 0;
}
In the css above I’ve set top and bottom paddings on both elements. Setting it on the child will make sure the contents in the child will be vertically centered and setting it on the parent ensures the entire child is centered within the parent.
I’m using relative measurements to allow each div to grow dynamically. If one of the elements or its content needs to be set with an absolute measurement then you’ll need to do some math to make sure things add up.
For example if the parent was 400px in height and the child 100px in height we’d need 150px of padding on both the top and bottom.
150 + 150 + 100 = 400
Using % could throw things off in this case unless our % values corresponded to exactly 150px.
This method works anywhere. The downside is that depending on the specifics of your project you may need to do a little math. However if you’re falling in line with the idea of developing flexible layouts where your measurements are all relative you can avoid the math.
Note: This method works by setting paddings on the outer elements. You can flip things and instead set equal margins on the inner elements. I tend to use padding, but I’ve also used margins with success. Which you choose would depend on the specifics of your project.
Floater Div
<div id="parent">
<div id="floater"></div>
<div id="child">Content here</div>
</div> #parent {height: 250px;} #floater {
float: left;
height: 50%;
width: 100%;
margin-bottom: -50px;
} #child {
clear: both;
height: 100px;
}
We float the empty div to the left (or right) and give it a height of 50% of the parent div. That causes it to fill up the entire upper half of the parent element.
Because this div is floated it’s removed from the normal document flow so we need to clear the child element. Here I’ve used clear: both, but you just need to clear in the same direction you floated the empty floater div.
The top edge of the child div should now be immediately below the bottom edge of the floater div. We need to bring the child element up by an amount equal to half its height and to do so we set a negative margin-bottom on the floater div.
This method also works across browsers. The downside is that it requires an empty div and that you know the height of the child element.