Just a quick question that was bugging my mind : Why centering with
margin:0 auto
does work fine with
display:block
but does not center a div when display is set to
display:inline-block
Thanks for answers
Just a quick question that was bugging my mind : Why centering with
margin:0 auto
does work fine with
display:block
but does not center a div when display is set to
display:inline-block
Thanks for answers
My understanding is as follows (though I am happy to be corrected).
See http://www.w3.org/TR/CSS2/visudet.html#Computing_widths_and_margins
Blocks:
10.3.3 Block-level, non-replaced elements in normal flow
The following constraints must hold among the used values of the other properties:
'margin-left' + 'border-left-width' + 'padding-left' + 'width' + 'padding-right' + 'border-right-width' + 'margin-right' = width of containing block
If 'width' is not 'auto' and 'border-left-width' + 'padding-left' + 'width' + 'padding-right' + 'border-right-width' (plus any of 'margin-left' or 'margin-right' that are not 'auto') is larger than the width of the containing block, then any 'auto' values for 'margin-left' or 'margin-right' are, for the following rules, treated as zero.
If all of the above have a computed value other than 'auto', the values are said to be "over-constrained" and one of the used values will have to be different from its computed value. If the 'direction' property of the containing block has the value 'ltr', the specified value of 'margin-right' is ignored and the value is calculated so as to make the equality true. If the value of 'direction' is 'rtl', this happens to 'margin-left' instead.
If there is exactly one value specified as 'auto', its used value follows from the equality.
If 'width' is set to 'auto', any other 'auto' values become '0' and 'width' follows from the resulting equality.
If both 'margin-left' and 'margin-right' are 'auto', their used values are equal. This horizontally centers the element with respect to the edges of the containing block.
Inline-blocks:
10.3.9 'Inline-block', non-replaced elements in normal flow
If 'width' is 'auto', the used value is the shrink-to-fit width as for floating elements.
A computed value of 'auto' for 'margin-left' or 'margin-right' becomes a used value of '0'.
I realise that I am a bit late answering this, but you can get around this issue if you want to combine margin auto with inline-block by specifying text align in body as in ...
body {
text-align: center;
}
inline-block
elements don't respect right or left margin, therefor the setting auto
can't be applied.
block
elements respect all margins.
You need to learn about inline boxes (not blocks) to see what is happening. An inline box contains inline items such as text and images. An inline block maintains its position within the inline box but acts as a block element within its position inside the box. Just like a word in the text cannot have its own width, neither can an inline block.
The actual spec for line boxes.