1330

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>
m4n0
  • 25,434
  • 12
  • 57
  • 77
shinjuo
  • 17,930
  • 21
  • 69
  • 98

32 Answers32

840

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>
Robert Harvey
  • 168,684
  • 43
  • 314
  • 475
  • the first link's example is broken for Chrome, so not as reliable now – gregorvand Oct 20 '12 at 23:04
  • 3
    First link is better I think even though it looks complicated cause the second link uses just one row of text or an image of which you know the height. What if you have 2 or 3 rows of text or if you don't know the height of your text, cause it varies. How would that work with line-height? So to sum up. I tested the first version and it works on IE, Firefox AND CHROME. – Raul Jan 19 '13 at 10:47
  • First link (jakpsatweb) works best for me in IE8-IE10, FF 23, Chrome 29 and on iPad, iPhone – malisokan Sep 04 '13 at 12:00
  • 39
    @Flextra: This is why folks still use tables for grid layout. Vertical align (or anything with height & dynamic data) can be challenging with pure CSS. You have to be willing to do weird hacks like this (somewhat defeats the "separating content from layout" idea), or take the multi-pass rendering hit and use non-static tables. I've never once had complaints from end users for `table` despite that I routinely break CSS fanboys' hearts. Most of em design only simple blogs & static sites. Some of us build business software and need dense data display, and our users care more about functionality. – nothingisnecessary Sep 08 '14 at 16:34
  • 7
    Yep. Don't get me wrong, if I build a "site" I go with lean html and prefer pure CSS, but I dunno how many times I wrestled with lining stuff up for hours, when I just said 'F it' and used a `table`. Things are better now, but some of us who make business web apps have to support older browsers (IE6 is still in use at some clients!), while people who make blogs can live in the clouds and pretend that everybody in the world has a fast connection, new computer, and the latest version of X browser with CSS 3, etc. Case in point: some Jira plugins use single-row tables for layout (or did anyway) – nothingisnecessary Sep 08 '14 at 16:41
  • 70
    It is quite ludicrous that tables are frowned upon as some kind of old-fashioned hack only a newbie would use, and here we are using "display:table-cell" in a DIV as a far hackier workaround. – Desty Feb 06 '15 at 12:28
  • 1
    @Desty, the first time you bootstrap a website that was built using thousands of tables you'll realize why they're frowned upon. – Dan Beaulieu Apr 21 '15 at 19:17
  • 5
    I believe it's time to update the accepted answer, covering the new Flexbox way. – Erick Petrucelli Aug 19 '15 at 22:42
  • 3
    @Alexander.Iljushkin it's not dumb, it's just wasn't designed for this. CSS was designed for hyperlinked text documents, not rich web apps. Think Wikipedia, not YouTube. So yes, CSS sucks for apps, I 100% agree. But nobody foresaw that the web would become an _application_ platform, let alone the _biggest_ application platform ever. This fact has only come into sharp focus with the rise of React though, with its philosophy of separating actual _concerns_ (components), rather than simply separating by filetype (HTML / CSS / JS). – Vicky Chijwani Oct 05 '17 at 23:23
  • And now suddenly `overflow:hidden` no longer works for the div when I use `display:table-cell`... go figure. – Stefan Jun 03 '19 at 19:30
  • 1
    @JesseRezaKhorasanee: You'll have to ask the OP that. I don't control the checkmark. – Robert Harvey Jan 20 '21 at 02:29
  • @shinjuo Can we change the accepted answer so that everyone won't be using tables when flexbox is obviously the better answer in 2021? – Jesse Reza Khorasanee Jan 20 '21 at 02:44
818

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.

jak.b
  • 253
  • 4
  • 15
David
  • 9,340
  • 3
  • 15
  • 11
  • 393
    I believe that's only valid if you have a single line of text in the div. – WEFX Nov 01 '11 at 18:51
  • 49
    Absolutely, you'd have crazy line spacing in your text if it ran on more than 1 line. – David Feb 05 '12 at 20:15
  • 1
    @BobChatting, Yep it does. See my answer for a solution that allows multiple lines of text. – Adam Tomat Sep 05 '13 at 10:48
  • 2
    line-height propagates to every children – KVM May 07 '14 at 15:17
  • You can also use line-height:0 and enter a :before Pseudo element like http://jsfiddle.net/em0qdh3j/ again this is only for a single line however it allows percentage based heights unlike this solution. – Craig Oct 08 '14 at 06:09
  • 8
    not working with percent: height:100%; line-height:100% – albanx Jul 02 '15 at 13:41
  • works beautifully for icons in a div (like a circle for example) – rorykoehler Jun 02 '16 at 09:34
  • So counter-intuitive isn't it. One day someone will make a new language that will compile out to CSS but have rational DWI commands to control layout. – Matthew Lock Jun 17 '16 at 02:44
  • 1
    @albanx Using percentages in line-height [refers to the font size of the element itself](https://developer.mozilla.org/en-US/docs/Web/CSS/line-height?v=example). Therefore, `line-height: 100%;` is the same as `line-height: 1em;`, and not 100% of the parent's height. – Katrina May 22 '17 at 19:25
  • This feels incredibly hacky but somehow also less hacky than setting the element to `display: table-cell` just to take advantage of the fact that `table-cell` is the only display mode that lets you vertically center text in any reasonable way. – aroth May 10 '18 at 14:19
545

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:

JSFiddle with browser prefixes

li {
  display: flex;
  justify-content: center;
  align-content: 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>
dota2pro
  • 5,432
  • 5
  • 25
  • 52
Adam Tomat
  • 9,496
  • 5
  • 32
  • 46
  • 2
    No problem. I still prefer using `height: x; line-height: x;` but more often then not I need multiple lines of text. That's why I love this solution. Simple, reusable, cross-browser, no js and only requires a little extra mark up. – Adam Tomat Feb 06 '13 at 16:57
  • If the text is larger than the box it will overflow. I've tried various ways to prevent the overflow but they all seemingly conflict with table and table-cell display. As soon as I restrict the overflow the vertical centering stops working. http://jsfiddle.net/2HHLE/ Any ideas? – Thomas David Baker Mar 08 '13 at 17:49
  • To answer my own question if you put the table/table-cell div(s) into another div with fixed width/height and overflow:hidden that will do the trick. I wrote it up at http://bluebones.net/2013/03/vertically-centering-text-in-a-fixed-size-element-with-no-overflow/ – Thomas David Baker Mar 09 '13 at 02:40
  • 2
    @ThomasDavidBaker, the other solution if you need these to be dynamic is to set a 100% height. [Here's a jsfiddle](http://jsfiddle.net/Sw3Jd/29/), basically just changed `height: 100px;` to `height: 100%;` for both the `li` and for `.outerContainer`. – Adam Tomat Mar 11 '13 at 10:30
  • +1, only to mention, this works only for statically and relatively positioned containers, not for absolute and fixed positions: http://jsfiddle.net/Sw3Jd/128/ – Stano Jul 29 '13 at 07:04
  • @stano, that jsfiddle is missing some markup required to make this solution work. See this updated fiddle where there's a working fixed and absolutely positioned LI: [http://jsfiddle.net/Sw3Jd/130/](http://jsfiddle.net/Sw3Jd/130/) – Adam Tomat Jul 29 '13 at 07:27
  • Hi Adam, it was my mistake, you're right [it works well](http://jsfiddle.net/Sw3Jd/131/) with that bit more markup. Thanks for your time and the explanation. – Stano Jul 29 '13 at 08:11
  • 2
    Don't want to be a nosepicker here but in the second solution from zerosixthree. There is a typo in the CSS at "- **wekbit** -transform: translateY(-50%);" Still, many thanks!! Great solution! – Gnagy Jun 26 '14 at 12:14
  • This is what I'm using since it works in all situations that I've encountered. I created a SCSS mixin to keep the code tight. – Fergal Mar 25 '16 at 01:48
  • Flexbox for the win! It has already saved me a lot of trouble but I didn't think it would work for text as well. Thanks for updating your answer! :) – Kathara Apr 13 '17 at 11:35
  • For over a year, I avoided display:flex as I had thought it was new and not widely supported. Then I tried testing display table, absolute positioning, viewport height, and other stuff involving margin and padding adjustments. After so much months of frustration, I have come to accept that the only solution for this problem that truly works is display flex. – JAT86 Mar 30 '18 at 23:22
  • In your first example you do not mention you use 'text-align: center', but it present in fiddle example, if remove it, the items (text or whatever) still align to left side – igorGIS Sep 09 '19 at 10:56
  • This was a really helpful answer! Thank you! – Akhila Jul 06 '20 at 14:01
  • https://dev.to/afif/never-make-your-text-container-a-flexbox-container-m9p – Blowsie Mar 24 '21 at 09:37
199

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.

Peter Mortensen
  • 28,342
  • 21
  • 95
  • 123
113

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%);
    -webkit-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.

Timwi
  • 61,190
  • 29
  • 155
  • 224
Stefan van den Akker
  • 5,714
  • 7
  • 38
  • 57
  • 3
    I got more reliable results with `position: absolute;` - Thanks! *N.B. You might want to included `-ms-transform` or IE will stuff something else up* – Wilf Jul 25 '14 at 20:09
  • Plunker suggests to put `-web-kit-transform` before `transform`. Perhaps adding `-ms-transform` can solve @ToniMichelCaubet's issue. – sakovias Apr 01 '16 at 12:52
52

Try this, add on the parent div:

display: flex;
align-items: center;
Kerim092
  • 1,067
  • 1
  • 9
  • 26
41

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.

Enter image description here

Peter Mortensen
  • 28,342
  • 21
  • 95
  • 123
Shadrack B. Orina
  • 6,895
  • 2
  • 28
  • 35
32

These days (we don't need Internet Explorer 6-7-8 any more) I would just use CSS display: table for this issue (or display: flex).


For older browsers:

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; /* <-- Here */
    align-items: center; /* <-- Here */
    justify-content: center; /* optional */
    height: 150px; /* <-- Here */
    background: #eee;  /* optional */
    width: 150px;
}
<div class="vcenter">
  <p>This is my text</p>
</div>

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>
Toni Michel Caubet
  • 17,157
  • 49
  • 178
  • 335
  • 2
    @Imray he's basically adding a 0px width inline-block element next to the text (the pseudo :before). However, this faux block has a 100% height, which is the trick. As the block and text are both v-aligned, it renders as intended. – Dan H Jan 12 '15 at 14:50
  • 1
    best answer, clean solution, IE8 supported – Rocco Feb 04 '15 at 00:27
  • When the text wraps, you can have issues with this. I fixed it by adding the following to the nested element: width:95%;vertical-align:middle; – trgraglia Mar 18 '15 at 13:04
  • if the text is too long, it doesn't work. do you have a solution? https://jsfiddle.net/cyxuy95q/ – beta Jul 19 '16 at 14:32
  • As suggested in the previous comment to yours, set max-width 95% https://jsfiddle.net/cyxuy95q/1/ – Toni Michel Caubet Jul 19 '16 at 15:17
  • IE8 supports `display: table` – Alex78191 Nov 16 '18 at 15:39
19

Flexbox worked perfectly for me, centering multiple elements inside parent div horizontally & vertically.

HTML-Code:

<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>

CSS-Code:
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;
}
Mimina
  • 1,126
  • 2
  • 13
  • 13
8

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.

Peter Mortensen
  • 28,342
  • 21
  • 95
  • 123
Craig
  • 1,929
  • 3
  • 26
  • 36
8
<!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>
Peter Mortensen
  • 28,342
  • 21
  • 95
  • 123
Nikit Barochiya
  • 827
  • 8
  • 14
7

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.

Peter Mortensen
  • 28,342
  • 21
  • 95
  • 123
Cyan Baltazar
  • 2,642
  • 1
  • 14
  • 11
6

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

Peter Mortensen
  • 28,342
  • 21
  • 95
  • 123
Davors
  • 69
  • 1
  • 3
5

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%;
}
Peter Mortensen
  • 28,342
  • 21
  • 95
  • 123
Earl Hickey
  • 61
  • 1
  • 2
5

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

Peter Mortensen
  • 28,342
  • 21
  • 95
  • 123
Justin
  • 22,998
  • 16
  • 104
  • 122
4

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%);
}
Peter Mortensen
  • 28,342
  • 21
  • 95
  • 123
dimitar
  • 815
  • 12
  • 16
4

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.

Peter Mortensen
  • 28,342
  • 21
  • 95
  • 123
Leon Rom
  • 407
  • 3
  • 6
4

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;
}
Peter Mortensen
  • 28,342
  • 21
  • 95
  • 123
4

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;
}
Malith
  • 276
  • 2
  • 7
3

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.

Peter Mortensen
  • 28,342
  • 21
  • 95
  • 123
Sanjeet kumar
  • 2,920
  • 3
  • 10
  • 20
3

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>
2

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;
 }
Peter Mortensen
  • 28,342
  • 21
  • 95
  • 123
2

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>
Peter Mortensen
  • 28,342
  • 21
  • 95
  • 123
Roman Pokrovskij
  • 7,969
  • 14
  • 68
  • 119
1

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 the div within a div
  • we know the height of the inner div because we set it to 20px.
  • calc(50% - 10px) for 50% - half the height for centering the inner div
Stephen Quan
  • 15,118
  • 3
  • 69
  • 63
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).

Peter Mortensen
  • 28,342
  • 21
  • 95
  • 123
Vlad
  • 5,448
  • 2
  • 43
  • 39
1

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>
Nidhin Joseph
  • 8,658
  • 3
  • 18
  • 40
0

Hmm, there're obviously many ways to solve this.

But I have a <div> that's positioned absolutely, height:100% (actually, top:0;bottom:0 and fixed width) and display:table-cell just didn't work to center text vertically. My solution did require an inner span element, but I see many of the other solutions do also, so I might as well add it:

My container is a .label and I want the number vertically centered in it. I did it by positioning absolutely at top:50% and setting line-height:0

<div class="label"><span>1.</span></div>

And the CSS is as follows:

.label {
    position:absolute;
    top:0;
    bottom:0;
    width:30px;
}

.label>span {
    position:absolute;
    top:50%;
    line-height:0;
}

See it in action: http://jsfiddle.net/jcward/7gMLx/

Jeff Ward
  • 11,655
  • 3
  • 36
  • 48
  • 1
    Nice because it's simplest solution. Downside is it works only for single line text, see fork of the example with longer text. http://jsfiddle.net/6sWfw/ – Tomas Tintera Apr 08 '14 at 07:29
0

Using CSS grid did it for me:

.outer {
  background-color: grey;
  width: 10rem;
  height: 10rem;
  display: grid;
  justify-items: center;
}

.inner {
  background-color: red;
  align-self: center;
}
<div class='outer'>
  <div class='inner'>
    Content
  </div>
</div>
dota2pro
  • 5,432
  • 5
  • 25
  • 52
ezzato
  • 83
  • 1
  • 7
-1

Try to embed a table element.

<div>
  <table style='width:200px; height:100px;'>
    <td style='vertical-align:middle;'>
      copenhagen
    </td>
  </table>
</div>
dota2pro
  • 5,432
  • 5
  • 25
  • 52
mike
  • 51
  • 6
    Tables are only for dealing with tabular data. They should never be used to fix layout problems. – Micros Feb 04 '14 at 10:44
  • 3
    Nice thing about tables though, is they are always consistent - CSS is interpreted so many different ways and putting nested DIVs in just to get something simple done adds extra HTML (and confusion). CSS is still grossly flawed – MC9000 Jun 13 '14 at 22:20
  • 4
    Yes, Unfortunately this **IS STILL** the only reliable way to vertically align (unknown) text in a block. Why do the CSS gods hate valign so much ? (ALL browser CAN do it consistently - but only in table cells) – T4NK3R Jul 27 '14 at 17:07
-1

There are several tricks to display content or an image in the center of a div. Some of the answers are really nice and I am fully agree with these too.

Absolute Horizontal And Vertical Centering In CSS

http://www.css-jquery-design.com/2013/12/css-techniques-absolute-horizontal-and-vertical-centering-in-css/

There are more than 10 techniques with examples. Now it's up to you which you prefer.

No doubt, display:table; display:table-Cell is a better trick.

Some good tricks are the following:

Trick 1 - By using display:table; display:table-cell

HTML

<div class="Center-Container is-Table">
  <div class="Table-Cell">
    <div class="Center-Block">
        CONTENT
    </div>
  </div>
</div>

CSS Code

.Center-Container.is-Table { display: table; }
.is-Table .Table-Cell {
  display: table-cell;
  vertical-align: middle;
}
.is-Table .Center-Block {
  width: 50%;
  margin: 0 auto;
}

Trick 2 - By using display:inline-block

HTML

<div class="Center-Container is-Inline">
  <div class="Center-Block">
     CONTENT
  </div>
</div>

CSS code

.Center-Container.is-Inline {
  text-align: center;
  overflow: auto;
}

.Center-Container.is-Inline:after,
.is-Inline .Center-Block {
  display: inline-block;
  vertical-align: middle;
}

.Center-Container.is-Inline:after {
  content: '';
  height: 100%;
  margin-left: -0.25em; /* To offset spacing. May vary by font */
}

.is-Inline .Center-Block {
  max-width: 99%; /* Prevents issues with long content causes the content block to be pushed to the top */
  /* max-width: calc(100% - 0.25em) /* Only for Internet&nbsp;Explorer 9+ */
}

Trick 3 - By using position:relative;position:absolute

<div style="position: relative; background: #ddd; border: 1px solid #ddd; height: 250px;">
  <div style="width: 50%; height: 60%; overflow: auto; margin: auto; position: absolute; top: 0; left: 0; bottom: 0; right: 0; background: #ccc; text-align: center;">
    <h4>ABSOLUTE CENTER, <br/>
WITHIN CONTAINER.</h4>
    <p>This box is absolutely centered, horizontally and vertically, within its container</p>
  </div>
</div>
Peter Mortensen
  • 28,342
  • 21
  • 95
  • 123
Dhiraj
  • 135
  • 1
  • 7
-2

If you need to use with the min-height property you must add this CSS on:

.outerContainer .innerContainer {
    height: 0;
    min-height: 100px;
}
Peter Mortensen
  • 28,342
  • 21
  • 95
  • 123
Dexter_ns88
  • 410
  • 4
  • 7
-2

CSS:

.vertical {
   display: table-caption;
}

Add this class to the element that contains the things you want to align vertically

Mo.
  • 21,971
  • 31
  • 138
  • 201
Jonny Forney
  • 1,458
  • 3
  • 13
  • 15