05.14.12
Horizontal and Vertical Centering with CSS
I recently wanted to center some content both vertically and horizontally on a web page. I did not know in advance how large the content was, and I wanted it to work for any size browser window.
These two articles have everything you need to know about horizontal centering and vertical centering.
The two articles don’t actually combine the techniques, so I’ll do that here.
In the bad old days before CSS, you might accomplish this with tables:
<table width=100% height=100%> <tr> <td valign=middle align=center> Content goes here </td> </tr> </table>
Simple enough! In the wonderful world of HTML5, you do the same thing by turning div
s into table
s using CSS. You need no fewer than three divs to pull this off:
<div class="container"> <div class="middle"> <div class="inner"> Content goes here </div> </div> </div>
And here’s the CSS:
.container { display: table; width: 100%; height: 100%; } .middle { display: table-cell; vertical-align: middle; } .inner { display: table; margin: 0 auto; }
A few comments on why this works:
- You can only apply
vertical-align: middle
to an element withdisplay: table-cell
. (Hence.middle
) - You can only apply
display: table-cell
to an element inside of another element withdisplay: table
. (Hence.container
) - Elements with
display: block
have 100% width by default. Settingdisplay: table
has the side effect of shrinking the div to fit its content, while still keeping it a block-level element. This, in turn, enables themargin: 0 auto
trick. (Hence.inner
)
I believe all three of these divs are genuinely necessary. For the common case that you want to center elements on the entire screen, you can make .container
the body
tag to get rid of one div.
In the future, this will get slightly easier with display: flexbox, a box model which makes infinitely more sense for layout than the existing CSS model. You can read about how do to horizontal and vertical centering using flexbox here.