IE 中单元格的 colspan 属性在某些情况下会影响 TABLE 元素的自动布局

今天在写一个jsp页面时,遇到一个如下的问题:在一个table中写了如下内容,table中定义了4列,在firefox中能正常显示,而在ie8中,显示不正常,

如下如图1:第二,三,四列宽度发生变化,和代码中定义的宽度显示不一致,

图1(IE8):

图2(firefox):

代码如下:

 1 <table id="cont2">
 2     <tbody>
 3             <tr>
 4                     <td class="ct_t">
 5                             是否分包<font style="color: red;"> * </font>:
 6                     </td>
 7                     <td style="width:200px;">
 8                             <s:if test="agencyActionVO.activityVO.isSub.equals(\"1\")">是</s:if>
 9                             <s:else>否</s:else>
10                     </td>
11                     <td class="ct_t">
12                             分包数量
13                     <font style="color: red;"> * </font>:
14                     </td>
15                     <td>
16                             <s:property value="agencyActionVO.activityVO.num" />
17                     </td>
18             </tr>
19             <tr>
20                     <td class="ct_t">
21                             候选招标代理机构:
22                     </td>
23                     <td colspan="3">
24                             <s:property value="agencyActionVO.activityVO.agencysName" />
25                     </td>
26             </tr>
27             <tr>
28                     <td class="ct_t">
29                             回避及理由:
30                     </td>
31                     <td colspan="3">
32                              <s:textarea name="agencyActionVO.activityVO.reason"
33                                         cssStyle="width:580px;height:100px;" id="reason" disabled="true"></s:textarea>
34                     </td>
35                 </tr>
36
37                 .......

最后查找资料才明白是 单元格的 colspan属性在ie8中影响了table的布局

标准参考

关于表格元素的自动布局

在 W3C CSS2.1 文档中,TABLE 元素在自动布局时的列的宽度计算规则是这样的:

  • 1. 计算每一个单元格的最小宽度 (MCW):经过格式化的内容可能会扩展到很多行,但是不会溢出单元格。如果某列的宽度设置值 (W) 大于 MCW,那么 W 就是单元格的最小宽度。另外,计算每个单元格的“最大”单元格宽度:不换行的将内容格式化,除非有显式的换行。
  • 2. 对每一列,根据只占该列的单元格的宽度确定最大最小宽度。最小值是其 MCW 最大的那个单元格的宽度(或列的 ‘width‘,取较大的)。最大值是取最大单元格宽度最大的单元格宽度(或列的 ‘width‘,取较大的)。
  • 3. 对于跨越多列的单元格,增加这些列的最小宽度,使它们的和至少跟单元格等宽。对于最大宽度也照样处理。如果可能的话,每个扩展到的列增加的宽度应大致相同。
  • 4. 对于每一个宽度值不是 auto 的列组,增加它所跨列的最小宽度,使宽度和至少跟列组的宽度等宽。

其中在第三步,提到了当表格中出现跨越多列的单元格时,它所跨列宽的计算规则:相应的增加所跨列的最小宽度。

虽然如此,但是对增加的方式没有明确说明,只是说,如果可能,所跨列增加的宽度应大致相同。

因此,对于跨列后的列宽计算方式,在各浏览器也就产生了差异。

关于 表格元素的自动布局 的详细信息,请参考 W3C CSS2.1 规范 17.5.2.2 Automatic table layout 中的内容。

问题描述

单元格的 colspan 属性在 IE 中可能影响 TABLE 元素的自动布局。

造成的影响

此问题严重时可能会导致页面布局混乱。

受影响的浏览器

IE6 IE7 IE8  

问题分析

请看以下测试用例。

分析以下代码:

<script type="text/javascript">
    window.onload = function() {
        function $(id) {
            return document.getElementById(id);
        }

        $("info").innerHTML = "red cell clientWidth : " + $("td1").clientWidth +
                "<br/>blue cell clientWidth : " + $("td2").clientWidth +
                "<br/>gold cell clientWidth : " + $("td3").clientWidth;
    }
</script>
<table id="T" style="color:white;" cellpadding="0" cellspacing="0">
    <tr>
        <td id="td1" style="">td1</td>
        <td id="td2" style=" width:100px;">td2</td>
    </tr>
    <tr>
        <td id="td3" style="  width:300px;" colspan="2">td3</td>
    </tr>
</table>
computed clientWidth:
<div id="info" style="border:1px dashed red; width:300px;"></div>
  • T 是一个自动布局的表格,含两行,两列。T 中『cellpadding="0" cellspacing="0"』的设置是为了去除单元格之间 padding 等的影响。
  • td2 的宽度是100px,大于其内容宽度;
  • td3 的宽度是300px,大于其内容宽度。

根据 CSS2.1 规范中的描述可知,td1 的最终宽度应为 200px。

这段代码在不同的浏览器环境中的表现:

将 td2 的宽度设置 (width:100px;) 去掉后:可见,在 IE 中,单元格的 td1 和 td2 宽度被重新分配。

1. 设置 TABLE 的 ‘table-layout‘ 特性值为 fixed,使用固定布局的表格元素可避免此问题。解决方案

2. 单元格所跨过的列的宽度都设置成 auto。

时间: 2024-10-25 11:22:10

IE 中单元格的 colspan 属性在某些情况下会影响 TABLE 元素的自动布局的相关文章

c# WinForm开发 DataGridView控件的各种操作总结(单元格操作,属性设置)

一.单元格内容的操作 *****// 取得当前单元格内容 Console.WriteLine(DataGridView1.CurrentCell.Value); // 取得当前单元格的列 Index       Console.WriteLine(DataGridView1.CurrentCell.ColumnIndex); // 取得当前单元格的行 Index       Console.WriteLine(DataGridView1.CurrentCell.RowIndex); ******

border-collapse:collapse;清除表格中单元格的空隙

border-collapse:collapse;清除表格中单元格的空隙

ASP.NET 导出Excel时,某单元格内一部分文字加粗加下划线

一.简述 在项目中的某个导出Excel的功能就需要在某个单元格中使一部分文字加粗和加下划线. 二.内容 在这个导出Excel的功能里用到了 Microsoft.Office.Interop.Excel 这个类库. 然后操作单元格: Microsoft.Office.Interop.Excel.Range cells = (Microsoft.Office.Interop.Excel.Range)xlsWorkSheet.Cells; cells["1", "A"]

Excel单元格内容太多会覆盖遮住下一单元格范围

Excel单元格内容太多会覆盖遮住下一单元格范围分步阅读 Excel中的单元格内容,有着不同的对齐方式.用户可根据自己的需求,在处理数据的时候,自行设置所需要的对齐方式. 当您在处理数据的时候,如果设置不当,就会遇到这样的问题:Excel单元格内容太多会覆盖遮住下一单元格范围. 可以通过如下的方法来解决. 方法/步骤 如下图,B2单元格,仅输入了几个中文,但是,由于列的宽度不够,因此,该单元格的内容会延伸到下一单元格并覆盖了下一单元格的范围.从而影响了下一单元格的输入与修改. 此时,我们需要的方

Kendo UI:Grid中单元格样式控制

问题 Grid某个单元格的样式怎么设置? 解决方案 使用attributes属性设置,如果有css中class属性,需要加双引号"".如 { field: "name", title: "Name", attributes: { "class": "table-cell", style: "text-align: right; font-size: 14px" } }

报表FineReport中单元格中各种颜色的标识说明

过滤标记-黄色小三角 B9单元格中设置了过滤,其中标识为左下黄色小三角,如扩大B9单元格效果图如下: 可通过双击B9单元格查看设置的过滤条件,在弹出对话框中选择过滤,就可看到设置的过滤条件:订单ID等于C2.   行后分页标识-绿色小三角 A10单元格中设置了行后分页,其中标识为右上绿色小三角,如扩大A10单元格效果图如下: 其中A10下方边框带有虚线标志,即为A10行后的单元格都分为下一页显示,行前分页标识相同,分割线在单元格的上方,具体分页的设置可参照单元格其他属性文档.   条件属性标识-

【原创】有关Silverlight中“DataGrid中单元格动态绑定ComboBox单击时数据项莫名被清除 ”的解决方案及思路。

今天上班遇到一个很古怪的问题,搞了半天愣是没找到原因.是这样的,在Datagrid中有绑定一个ComboBox列,其不包含在 model数据中,而是单独在LoadingRow事件中去 从数据库拿数据绑定. 绑定成功以后,但在对 单元格进行编辑时(也就是点击ComboBox),瞬间ComboBox内内容都被莫名清空了. 查看了前台绑定的datagrid事件,并没有太多事件里 对ComboBox进行了清空操作,于是找到了一个最有嫌疑的 事件"CurrentCellChanged", 代码如

Excel 中单元格和范围的引用(即访问的表示方法)

计算机中,无非是数据和数据的处理这两件事.Excel的工作表能存储大量数据,除了这些原始数据,我们还要用函数来处理这些数据,比如求和求积,求平均值,排序等等,并把处理结果也存在单元格里.在Excel中,我们通常不给这些数据起个专门的名字,比如StudentName1,StudentName2,Score1,Score2(我在另外一篇文章讲如何给单元格或范围内的数据命名),Excel本身已经隐含了指代这些变量的方式,不会让它们成为"失落的存储空间".一般我们在编程时,向函数传递的是我们程

VBS读取txt文档数据查找Excel中单元格数据符合条件的剪切到工作表2中

Dim fso,f,a set oExcel = CreateObject( "Excel.Application" ) oExcel.Visible = false '4) 打开已存在的工作簿: oExcel.WorkBooks.Open( "F:\1.xlsx" ) On Error Resume Next '判断是否存在Sheet2工作表,不存在新建 If oExcel.WorkSheets("Sheet2") Is Nothing The