Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to vertically align an image inside a div

How can you align an image inside of a containing div?

Example

In my example, I need to vertically center the <img> in the <div> with class ="frame":

<div class="frame" style="height: 25px;">     <img src="http://jsfiddle.net/img/logo.png" /> </div> 

.frame's height is fixed and the image's height is unknown. I can add new elements in .frame if that's the only solution. I'm trying to do this on Internet  Explorer 7 and later, WebKit, Gecko.

See the jsfiddle here.

.frame {     height: 25px;      /* Equals maximum image height */     line-height: 25px;     width: 160px;     border: 1px solid red;      text-align: center;     margin: 1em 0; } img {     background: #3A6F9A;     vertical-align: middle;     max-height: 25px;     max-width: 160px; }
<div class=frame>    <img src="http://jsfiddle.net/img/logo.png" height=250 /> </div> <div class=frame>    <img src="http://jsfiddle.net/img/logo.png" height=25 /> </div> <div class=frame>    <img src="http://jsfiddle.net/img/logo.png" height=23 /> </div> <div class=frame>    <img src="http://jsfiddle.net/img/logo.png" height=21 /> </div> <div class=frame>    <img src="http://jsfiddle.net/img/logo.png" height=19 /> </div> <div class=frame>     <img src="http://jsfiddle.net/img/logo.png" height=17 /> </div> <div class=frame>     <img src="http://jsfiddle.net/img/logo.png" height=15 />  </div> <div class=frame>     <img src="http://jsfiddle.net/img/logo.png" height=13 />  </div> <div class=frame>     <img src="http://jsfiddle.net/img/logo.png" height=11 />  </div> <div class=frame>     <img src="http://jsfiddle.net/img/logo.png" height=9 />  </div> <div class=frame>     <img src="http://jsfiddle.net/img/logo.png" height=7 />  </div> <div class=frame>     <img src="http://jsfiddle.net/img/logo.png" height=5 />  </div> <div class=frame>     <img src="http://jsfiddle.net/img/logo.png" height=3 />  </div>
like image 763
Arnaud Le Blanc Avatar asked Sep 01 '11 16:09

Arnaud Le Blanc


People also ask

How do I vertically align an image in HTML?

To center an image vertically, you can wrap it in a block element like a div and use a combination of the CSS position property, the left and top properties, and the transform property.

How do I vertically center an image in a div using CSS?

With vertical-align: middle Another way of aligning an image in the centre of an element is to apply a :before pseudo-class to the parent with, display: inline-block , height: 100% and vertical-align: middle . When vertical-align: middle is applied to the image it will vertically align to the centre of the parent div.

Does vertical align work with div?

The CSS vertical align property works smoothly with tables, but not with divs or any other elements. When you use it in a div, it aligns the element alongside the other divs and not the content — which is what we usually want). This only works with display: inline-block; .


1 Answers

The only (and the best cross-browser) way as I know is to use an inline-block helper with height: 100% and vertical-align: middle on both elements.

So there is a solution: http://jsfiddle.net/kizu/4RPFa/4570/

.frame {      height: 25px;      /* Equals maximum image height */      width: 160px;      border: 1px solid red;      white-space: nowrap; /* This is required unless you put the helper span closely near the img */        text-align: center;      margin: 1em 0;  }    .helper {      display: inline-block;      height: 100%;      vertical-align: middle;  }    img {      background: #3A6F9A;      vertical-align: middle;      max-height: 25px;      max-width: 160px;  }
<div class="frame">      <span class="helper"></span><img src="http://jsfiddle.net/img/logo.png" height=250px />  </div>  <div class="frame">      <span class="helper"></span><img src="http://jsfiddle.net/img/logo.png" height=25px />  </div>  <div class="frame">      <span class="helper"></span><img src="http://jsfiddle.net/img/logo.png" height=23px />  </div>  <div class="frame">      <span class="helper"></span><img src="http://jsfiddle.net/img/logo.png" height=21px />  </div>  <div class="frame">      <span class="helper"></span><img src="http://jsfiddle.net/img/logo.png" height=19px />  </div>  <div class="frame">      <span class="helper"></span>      <img src="http://jsfiddle.net/img/logo.png" height=17px />  </div>  <div class="frame">      <span class="helper"></span>      <img src="http://jsfiddle.net/img/logo.png" height=15px />  </div>  <div class="frame">      <span class="helper"></span>      <img src="http://jsfiddle.net/img/logo.png" height=13px />  </div>  <div class="frame">      <span class="helper"></span>      <img src="http://jsfiddle.net/img/logo.png" height=11px />  </div>  <div class="frame">      <span class="helper"></span>      <img src="http://jsfiddle.net/img/logo.png" height=9px />  </div>  <div class="frame">      <span class="helper"></span>      <img src="http://jsfiddle.net/img/logo.png" height=7px />  </div>  <div class="frame">      <span class="helper"></span>      <img src="http://jsfiddle.net/img/logo.png" height=5px />  </div>  <div class="frame">      <span class="helper"></span>      <img src="http://jsfiddle.net/img/logo.png" height=3px />  </div>

Or, if you don't want to have an extra element in modern browsers and don't mind using Internet Explorer expressions, you can use a pseudo-element and add it to Internet Explorer using a convenient Expression, that runs only once per element, so there won't be any performance issues:

The solution with :before and expression() for Internet Explorer: http://jsfiddle.net/kizu/4RPFa/4571/

.frame {      height: 25px;      /* Equals maximum image height */      width: 160px;      border: 1px solid red;      white-space: nowrap;        text-align: center;      margin: 1em 0;  }    .frame:before,  .frame_before {      content: "";      display: inline-block;      height: 100%;      vertical-align: middle;  }    img {      background: #3A6F9A;      vertical-align: middle;      max-height: 25px;      max-width: 160px;  }    /* Move this to conditional comments */  .frame {      list-style:none;      behavior: expression(          function(t){              t.insertAdjacentHTML('afterBegin','<span class="frame_before"></span>');              t.runtimeStyle.behavior = 'none';          }(this)      );  }
<div class="frame"><img src="http://jsfiddle.net/img/logo.png" height=250px /></div>  <div class="frame"><img src="http://jsfiddle.net/img/logo.png" height=25px /></div>  <div class="frame"><img src="http://jsfiddle.net/img/logo.png" height=23px /></div>  <div class="frame"><img src="http://jsfiddle.net/img/logo.png" height=21px /></div>  <div class="frame"><img src="http://jsfiddle.net/img/logo.png" height=19px /></div>  <div class="frame"><img src="http://jsfiddle.net/img/logo.png" height=17px /></div>  <div class="frame"><img src="http://jsfiddle.net/img/logo.png" height=15px /></div>  <div class="frame"><img src="http://jsfiddle.net/img/logo.png" height=13px /></div>  <div class="frame"><img src="http://jsfiddle.net/img/logo.png" height=11px /></div>  <div class="frame"><img src="http://jsfiddle.net/img/logo.png" height=9px /></div>  <div class="frame"><img src="http://jsfiddle.net/img/logo.png" height=7px /></div>  <div class="frame"><img src="http://jsfiddle.net/img/logo.png" height=5px /></div>  <div class="frame"><img src="http://jsfiddle.net/img/logo.png" height=3px /></div>

How it works:

  1. When you have two inline-block elements near each other, you can align each to other's side, so with vertical-align: middle you'll get something like this:

    Two aligned blocks

  2. When you have a block with fixed height (in px, em or another absolute unit), you can set the height of inner blocks in %.

  3. So, adding one inline-block with height: 100% in a block with fixed height would align another inline-block element in it (<img/> in your case) vertically near it.
like image 64
kizu Avatar answered Oct 13 '22 01:10

kizu