Vertical align block level element inside a block level element
Yes, vertical margins are calculated in a fundamentally different way to horizontal ones; ‘auto’ doesn't mean centering.
Setting ‘vertical-align: middle’ on the image elements sort of works, but it only aligns them relative to the line box they're currently on. To make the line box the same height as the float, set ‘line-height’ on the container:
<style>
div { float: left; width: 100px; height: 100px; line-height: 100px; }
div img { vertical-align: middle; }
</style>
You have to be in Standards Mode for this to work, because otherwise browsers render images-on-their-own as blocks instead of inline replaced elements in a text line box.
Unfortunately, IE (up to 7 at least) still keeps the block behaviour even in its attempt at a Standards Mode. There is a technical reason for this, namely that IE is pants.
To persuade IE that you really mean it about the images being part of a text line, you have to add some text inside the div — even a normal space will do it, but you could also try a zero-width-space:
<div><img src="http://i.stackoverflow.com/Content/Img/stackoverflow-logo-250.png" width="50" height="60" /></div>
<div><img src="http://i.stackoverflow.com/Content/Img/stackoverflow-logo-250.png" width="60" height="50" /></div>
<div><img src="http://i.stackoverflow.com/Content/Img/stackoverflow-logo-250.png" width="75" height="75" /></div>
Vertical alignment works on block elements
According to explanations documented on This link:
- HTML layout traditionally was not designed to specify vertical behavior. By its very nature, it scales width-wise, and the content flows to an appropriate height based on the available width. Traditionally, horizontal sizing and layout is easy; vertical sizing and layout was derived from that.
vertical-align
is used to specify two completely different behaviors depending on where it is used
vertical-align in table cells
When used in table cells, vertical-align
does what most people expect it to, which is mimic the (old, deprecated) valign
attribute. In a modern, standards-compliant browser, the following three code snippets do the same thing:
<td valign="middle"> <!-- but you shouldn't ever use valign --> </td>
<td style="vertical-align:middle"> ... </td>
<div style="display:table-cell; vertical-align:middle"> ... </div>
vertical-align on inline elements
When vertical-align
is applied to inline elements, however, it's a whole new ballgame. In this situation, it behaves like the (old, deprecated) align
attribute did on <img>
elements. In a modern, standards-compliant browser, the following three code snippets do the same thing:
<img align="middle" ...>
<img style="vertical-align:middle" ...>
<span style="display:inline-block; vertical-align:middle"> foo<br>bar </span>
How can I vertically align elements in a div?
Wow, this problem is popular. It's based on a misunderstanding in the vertical-align
property. This excellent article explains it:
Understanding vertical-align
, or "How (Not) To Vertically Center Content" by Gavin Kistner.
“How to center in CSS” is a great web tool which helps to find the necessary CSS centering attributes for different situations.
In a nutshell (and to prevent link rot):
- Inline elements (and only inline elements) can be vertically aligned in their context via
vertical-align: middle
. However, the “context” isn’t the whole parent container height, it’s the height of the text line they’re in. jsfiddle example - For block elements, vertical alignment is harder and strongly depends on the specific situation:
- If the inner element can have a fixed height, you can make its position
absolute
and specify itsheight
,margin-top
andtop
position. jsfiddle example - If the centered element consists of a single line and its parent height is fixed you can simply set the container’s
line-height
to fill its height. This method is quite versatile in my experience. jsfiddle example - … there are more such special cases.
- If the inner element can have a fixed height, you can make its position
How to center a block level element vertically?
This is a very often requested thing to do. There's no simple way to do vertical alignment. There's the vertical-align
attribute, but it's for line-alignment of an inline element. Check out this link for different ways to do vertical-centering.
Edit: Here's another good link to get you started.
Vertical-Align a Block Element
You can use table
and table-cell
: And move your class='title'
inside img-holder
Fiddle
With padding left away from image
- fiddle
.title-block {
width:272px;
height: 110px;
}
.img-holder {
margin: 0 6px 0 0;
position: relative;
display: table;
}
img, .title{
display:table-cell;
vertical-align: middle;
}
.title {
text-transform: uppercase;
margin: 8px 0 9px;
}
Vertical align text in block element
According to the CSS Flexible Box Layout Module, you can declare the a
element as a flex container (see figure) and use align-items
to vertically align text along the cross axis (which is perpendicular to the main axis).
All you need to do is:
display: flex;
align-items: center;
See this fiddle.
Vertical align not working on inline-block
It doesn't work because vertical-align
sets the alignment of inline-level contents with respect to their line box, not their containing block:
This property affects the vertical positioning inside a line box of
the boxes generated by an inline-level element.
A line box is
The rectangular area that contains the boxes that form a line
When you see some text which has multiple lines, each one is a line box. For example, if you have
p { border: 3px solid; width: 350px; height: 200px; line-height: 28px; padding: 15px; }
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a diam lectus. Sed sit amet ipsum mauris. Maecenas congue ligula ac quam viverra nec consectetur ante hendrerit. Donec et mollis dolor. Praesent et diam eget libero egestas mattis sit amet vitae augue. Nam tincidunt congue enim, ut porta lorem lacinia consectetur.</p>
How can I vertically center multiple inline-block divs in a div?
Add a vertical-align value to your elements.
.teszt {
vertical-align: top; // or middle
}
Related Topics
How to Prevent Chrome from Changing Font When Autofilling Username/Password
Drawing Multiple Edges Between Two Nodes with D3
"Invalid Form Control" Only in Google Chrome
Differencebetween Readonly="True" & Readonly="Readonly"
How to Detect HTML 5 Compatibility in Browser
In HTML5, Can the <Header> and <Footer> Tags Appear Outside of the <Body> Tag
Setting the Granularity of the HTML5 Audio Event 'Timeupdate'
CSS Display None and Opacity Animation with Keyframes Not Working
How to Add Div Inside Table Above Every <Tr>
What Elements Can a Span Tag Contain in HTML5
How to Properly Display German Characters in HTML
Get Click Event of Each Rectangle Inside Canvas
Html: How to Force Links to Open in a New Tab, Not New Window
Why Does a Diamond with a Questionmark in It Appear in My HTML
When Does Whitespace Matter in HTML
How to Add Border to a Container with Transparent Gaps in Between