Following is my code and I want to understand that why #firstDiv is being pushed downward by all browsers. I really want to understand the inner wo
View this alternative example. The reason for such behavior is described in CSS3 module: line: 3.2. Line Box wrapping [1]:
In general, the start edge of a line box touches the start edge of its containing block and the end edge touches the end edge of its containing block. However, floating boxes may come between the containing block edge and the line box edge. Thus, although line boxes in the same inline formatting context generally have the same inline progression advance (that of the containing block), they may vary if available inline-progression space is reduced due to floats[...]
As you can see, the third element is pushed downward, although it does not have a overflow
property. The reason must be somewhere else to find. The second behavior you notice is described in Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification: 9.5 Floats [2]:
Since a float is not in the flow, non-positioned block boxes created before and after the float box flow vertically as if the float did not exist. However, the current and subsequent line boxes created next to the float are shortened as necessary to make room for the margin box of the float.
All your display:inline-block;
divs are using a special kind of baseline
in this case 10.8 Line height calculations: the 'line-height' and 'vertical-align' properties (very end) [3]:
The baseline of an 'inline-block' is the baseline of its last line box in the normal flow, unless it has either no in-flow line boxes or if its 'overflow' property has a computed value other than 'visible', in which case the baseline is the bottom margin edge.
So when you're using floating elements and inline-block
elements, the floating element will be pushed to the side and the inline formatting will be recalculated according to 1. On the other hand, the next elements are shortened if they won't fit. Since you're already working with a minimum amount of space, there's no other way to modify your elements then pushing them 2. In this case, the highest element will define the size of your wrapping div, thus defining the baseline
3, while on the other hand the modification of position and width stated in 2 can't be applied to such minimal spaced maximum height elements. In this case a behavior as in my very first demo will result.
Lastly, the reason your overflow:hidden
will prevent #firstDiv
to be pushed to the lower edge of your #container
, although I couldn't find a reason in section 11. Without overflow:hidden
it works as excepted and defined by 2 and 3. Demo
TL;DR: Have a very close look on the W3 recommendations and the implementations in the browser. In my humble opinion floating elements are determined to show unexpected behavior if you don't know all the changes they do to your surrounding elements. Here's another demo which shows a common problem with floats.