Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why is box-sizing acting different on table vs div?

Here's the HTML: http://jsfiddle.net/jC8DL/1/

<div style='width:300px;border:1px solid green'>
  <div>Outer div</div>
  <div style='width:100%;border:1px solid red;margin:10px;'>
    Inner div, 10px margin.
  </div>
  <div style='width:100%;border:1px solid red;padding:10px;'>
    Inner div, 10px padding.
  </div>
  <div style='width:100%;border:1px solid red;padding:10px;box-sizing:border-box'>
    Same, with box-sizing: border-box
  </div>
  <table style='width:100%;border:1px solid red;padding:10px;'>
    <tr><td>Inner table, 10px padding</td></tr>
  </table>
</div>  

And it looks like this in my Chrome:

enter image description here

I think I understand everything until the last one. My Chrome inspector shows the table's computed box-sizing style is content-box so I expect it to behave like the second div, and overflow and look ugly. Why is it different? Is this documented somewhere in the HTML/CSS spec?

like image 820
Rob N Avatar asked Sep 28 '13 16:09

Rob N


People also ask

What is the difference between box sizing content box and box sizing border-box?

border-box and content-box are two values of the box-sizing property. Unlike the content-box , the border-box value indicates that the dimension of an element will also include the border and padding.

What are the two properties that influence the dimensions of the content in the CSS box model?

The box model has five main parts/properties that determine the size of the box. Those properties are the width, the height, the padding, the border, and the margin. Apart from the width, height, the other properties are optional. Meaning that we can have a box with no padding, no border, and no margin.

What is the effect of setting the box sizing property to border-box?

The box-sizing property allows us to include the padding and border in an element's total width and height. If you set box-sizing: border-box; on an element, padding and border are included in the width and height: Both divs are the same size now! Hooray!

What is the default type for the box sizing property?

The box-sizing property determines how the final space an element occupies on the web page is calculated. The default value for this property is content-box .


1 Answers

Yes, CSS2.1 states the following for tables with the separated borders model:

However, in HTML and XHTML1, the width of the <table> element is the distance from the left border edge to the right border edge.

Note: In CSS3 this peculiar requirement will be defined in terms of UA style sheet rules and the 'box-sizing' property.

The current CSS3 definition of box-sizing does not say anything about this, but translating the above quote it basically means in (X)HTML, tables use the border-box model: padding and borders do not add to the specified width of a table.

Note that in terms of the box-sizing property, different browsers seem to handle this special case differently:

  • Chrome
    box-sizing is set to the initial value, content-box; changing it has no effect whatsoever. Neither does redeclaring box-sizing: content-box within the inline styles, but that should be expected. Either way, Chrome appears to be forcing the table to always use the border-box model.

  • IE
    box-sizing is set to border-box; changing it to content-box causes it to behave like the second div.

  • Firefox
    -moz-box-sizing is set to border-box; changing it to content-box or padding-box causes it to resize accordingly.

Since CSS3 does not yet make any mention of table box sizing, this should not come as a surprise. At the very least, the result is the same — it's only the underlying implementation that's different. But given what the note says above, I would say that IE and Firefox are closer to the intended CSS3 definition, since in Chrome you can't seem to change a table's box model using the box-sizing property.


Tables with the collapsing border model don't have padding at all, although in this case it's not relevant since your table does not use this model:

Note that in this model, the width of the table includes half the table border. Also, in this model, a table does not have padding (but does have margins).

like image 88
BoltClock Avatar answered Oct 05 '22 02:10

BoltClock