打印

RE9019: Chrome(Q) Safari(Q) Opera(Q) 中明确指定的单元格宽度小于当前列 MCW 时,计算单元格与其他浏览器不同

作者:段立新

标准参考

自动表格布局

在 CSS 2.1 规范中自动表格布局规则中,计算每个单元格的最小内容宽度(MCW):经格式化的内容可以扩展到多行,但是不可以溢出单元格框。如果指定的单元格 'width'(W)大于 MCW ,W 将作为最小单元格宽度。 'auto' 意味着 MCW 为最小单元格宽度。

关于自动表格布局的更多信息,请参考 CSS 2.1 规范 17.5.2.2 Automatic table layout

问题描述

规范中仅描述了指定单元格 'width'(W)大于 MCW ,W 将作为最小单元格宽度,并没有描述指定的单元格宽度小于当前列 MCW 时,谁作为最小单元格宽度。

造成的影响

指定的单元格宽度小于当前列 MCW 时, Chrome(Q) Safari(Q) Opera(Q) 计算单元格与其他浏览器不同,会造成布局不一致。

受影响的浏览器

所有浏览器  

问题分析

代码如下:

<html>
<body>
<table style="width:180px;" cellpadding=0 cellspacing=0>
<tr>
  <td style="background:green;"><div style="width:10px;height:30px;"></div></td>
  <td style="background:gold;"><div style="width:20px;height:30px;"></div></td>
  <td style="background:pink;"><div style="width:30px;height:30px;"></div></td>
</tr>
<tr>
  <td style="background:blue;"><div style="width:10px;height:30px;"></div></td>
  <td style="background:silver"><div style="width:20px;height:30px;"></div></td>
  <td style="background:red;width:10px;"><div style="width:30px;height:30px;"></div></td>
</tr>
</table>
</body>
</html>

在每个 TD 中都放了设置宽度的 DIV 用来模拟单元格的最小宽度,给最后一个 TD 上明确指定宽度(10px),并使其宽度小于单元格最小宽度。

在各浏览器中效果如下:

  Chrome(Q) Safari(Q) Opera(Q) IE Firefox Chrome(S) Safari(S) Opera(S)
页面截图
明确指定宽度的 TD 开发者工具下截图
从左至右 TD 的宽度依次为 30px 60px 90px 50px 100px 30px

根据现象可以推测,

  • Chrome(Q) Safari(Q) Opera(Q) 中,明确指定宽度的 TD 没有优先级, TD 的计算后宽度 = 单元格的最小宽度比例 * TABLE 的实际宽度。
  • IIE Firefox Chrome(S) Safari(S) Opera(S) 中,明确指定宽度的 TD 具有较高的优先级, TD 的计算后宽度等于单元格的最小宽度,其他 TD 的宽度 = 单元格的最小宽度比例 * ( TABLE 的实际宽度 - 明确指定宽度的 TD 的计算后宽度)。

注:本例子中取值均为整数,是为了清楚的说明这个问题,实际 TD 的计算后宽度可能会有一些偏差。

解决方案

避免出现明确指定的单元格宽度小于当前列 MCW 的情况。

参见

知识库

相关问题

测试环境

操作系统版本: Windows 7 Ultimate build 7600
浏览器版本: IE6
IE7
IE8
Firefox 3.6.10
Chrome 7.0.552.0 dev
Safari 5.0.2
Opera 10.63
测试页面: specify_TD_width.html
本文更新时间: 2010-10-13

关键字

自动表格布局 MCW TD width