考虑这个简单的HTML表:
<!doctype html>
<html>
<head>
<title>Test</title>
</head>
<body>
<table style="border-collapse: collapse; table-layout: fixed; width: 280px;">
<tr>
<td style="padding: 5px; width: 50px; border: 0; word-wrap: break-word;">a</td>
<td style="padding: 5px; width: 100px; border: 0; word-wrap: break-word;">b</td>
<td style="padding: 5px; width: 100px; border: 0; word-wrap: break-word;">c</td>
</tr>
</table>
</body>
</html>
这在每个主流浏览器中都能正常呈现,Chrome除外,其中列宽分别为46px,102px和102px。
如果我从表格元素中取出CSS宽度声明,那么它会在Chrome中正确呈现。但我需要这个,否则自动换行将无法正常工作。
知道为什么这不起作用?我尝试了不同的doctypes,这没有改变任何东西,所以我假设它不是HTML5表问题。
编辑:事实证明,如果您在table-layout: fixed
元素和table 和像素宽度>每列上的像素宽度,然后Chrome会假设您的列宽包含填充。这违反了W3C盒子模型,违反了CSS2要求的行为。
如果您未指定table-layout: fixed
或未在table
元素上指定像素宽度,则Chrome会正确假设您指定的列宽 exclude 填充。所有其他浏览器都假设您的列宽排除填充。
在上面的示例中,将宽度指定为60px,110px和110px可以解决Chrome中的问题,但会在其他所有浏览器中将其分解。 46px,102px和102px的值来自Chrome,均匀分布列,比例为40:90:90而不是50:100:100。
答案 0 :(得分:6)
我今天使用table-layout: fixed
和box-sizing: border-box
自行解决了这个问题,迫使Chrome停止考虑填充。否则你永远不会知道Chrome会选择哪种尺寸模型,即使对于两个非常相似的桌子也是如此。
答案 1 :(得分:1)
好吧,我的数学说Chrome正在做它应该做的事情:
102 + 102 + 46 = 250px - &gt;的宽度强>
2(5)+ 2(5)+2(5)= 10 + 10 + 10 = 30px - >的填充强>
宽度+填充= 250 + 30 = 280px ,或您为表格指定的宽度。
答案 2 :(得分:1)
我的解决方法,仅针对Chrome浏览器执行。我们只在我们的网络应用程序中使用固定表格,看起来效果很好,很高兴知道Chrome有时会完美地标注色域宽度,但有时并不取决于表格所在的位置(并且大部分位于其所在的位置)。 / p>
var correctedWidth;
var extraSize;
//chrome is taking the padding and border to calculate the column width , not other browsers
$('table.default.fixed > thead > tr > th').each(function()
{
if ($(this).attr('width')!='undefined' && $(this).attr('width')!=null)
{
if ($(this).attr('sizeUpdated')=="undefined" || $(this).attr('sizeUpdated')==null) {
extraSize = parseInt($(this).css('padding-left'))+parseInt($(this).css('padding-right'))+2; //2 for the borders (2*1px)
if ( parseInt($(this).attr('width'))!= $(this).width() )
{
correctedWidth=$(this).width()+2*(extraSize);
}
else
{
correctedWidth=$(this).width()+extraSize;
}
$(this).attr('width',correctedWidth+'px');
$(this).attr('sizeUpdated','Y');
}
}
});
答案 3 :(得分:0)
我通过删除具有以下属性的父元素(fieldset)来修复此问题:
display: inline-flex;
答案 4 :(得分:-3)
HTML文本中的not to use styles inline更好。