I would like to center an img inside a div without javascript and without background-images.
Here is some example code
<div>
<img src="/happy_cat.png"/>
</div>
- I don't know the size of the img and it should be able to exceed the width of the parent
- I don't know the width of the parent div (it is 100%)
- The parent div has a fixed height
- The image is larger than the parent and the parent has overflow:hidden
- Only need to support modern browsers
Desired result. (Ignore opacities etc, just note the positioning).
I know this can be done easily with background images but that isn't an option for me. I could also use javascript but it seems like a very heavy handed way to achieve this.
Thanks!
Jack
Just initialize the position of your image as follow.
HTML :
CSS :
Or look with a
margin: auto;
This is for horizontal align. To align it vertically too, you can do a
display: table-cell;
to your<div>
an thenvertical-align: middle;
but it's not a good practice beacause your<div>
is not a table.This is always a bit tricky and there are many solutions out there. I find the best solution to be the following. This centers it both vertically and horizontally.
CSS
HTML
See fiddle
slightly different technique: Fiddle
I know this is old but I also came up with a pure css solution very similar to the above.
What about this:
This assumes that the parent div is positioned relatively. I think this works if you want the .img relatively positioned rather than absolutely. Just remove the
position: absolute
and change top/left tomargin-top
andmargin-left
.You'll probably want to add browser support with
transform
,-moz-transform
etc.Old question, new answer:
When the image is larger than the wrapping div, a text-align:center or margin:auto is not going to work. But if the image is smaller, then solutions with absolute positioning or a negative left margin are going to produce weird effects.
So when the image size is actually not known in advance (like on a CSM) and it might be larger or smaller than the wrapping div, there is an elegant CSS3 solution that serves all purposes:
Note that depending on other rules in your stylesheet, you might need to append width:auto and/or max-width:none to the img.
Thanks everyone for your help.
I'm going to consider this unachievable in CSS only.I will move to a jQuery solution. Here is some [pseudo]code for those interested.
I was going to give up on a CSS solution but looks like it can be done (see accepted answer). Here is the JS solution I was going to go with.
And the accompanying css