`

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

阅读更多
http://www.w3help.org/zh-cn/causes/HE1001



标准参考
关于表格元素的自动布局

在 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="background-color:red;">td1</td>
        <td id="td2" style="background-color:blue; width:100px;">td2</td>
    </tr>
    <tr>
        <td id="td3" style=" background-color:gold; 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。

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

IE Firefox Opera Safari Chrome
 

可见,在 IE 中,单元格的 td1 和 td2 宽度被重新分配。

将 td2 的宽度设置 (width:100px;) 去掉后:

IE Firefox Opera Safari Chrome


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

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

关键字
cell width colspan table

分享到:
评论

相关推荐

    table数据相同合并单元格

    table数据相同时合并单元格,原理:逐行进行比较,相同时隐藏第二行,对第一行添加rowspan 【table数据相同时合并单元格,原理:逐行进行比较,相同时隐藏第二行,对第一行添加rowspan】

    table-rowspan表格自动合并单元格插件

    对table表格进行操作,两行根据点击添加 删除按钮 进行单元格的删除 添加 合并单元格。

    html table实现复杂表头的示例代码

    在html中&lt;td&gt; 标签定义 HTML 表格中的标准单元格。  (1)rowspan 属性规定单元格可横跨的行数;  (2)colspan 属性规定单元格可横跨的列数。 &lt;html&gt; &lt;head&gt; &lt;meta ...

    HTML表格标记教程(35):跨列属性COLSPAN

    在复杂的表格结构中,有的单元格在垂直方向上是跨多个单元格的,这就需要使用跨列属性COLSPAN。 基本语法 &lt;TD COLSPAN=VALUE&gt; 语法解释 VALUE代表单元格跨的列数。 文件范例:10-33.htm 通过COLSPAN属性实现跨列的...

    表格设置table-layout:fixed后对单元格宽度设置无效

    在对设置表格设置table-layer:fixed样式后,发现表格中有一行合并过,其它没有合并的行的列宽会平均化,对列宽的设置会失效,下面有详细的解决方法,大家可以学习学习

    IE6、IE7中setAttribute不支持class/for/rowspan/colspan等属性

    IE6、IE7中setAttribute不支持class/for/rowspan/colspan等属性的说明,需要的朋友可以参考下。

    通过jquery还原含有rowspan、colspan的table的实现方法

    代码原理 对table进行遍历,如果td的rowspan属性值大于1,则给当前的td的父元素的兄弟元素添加td,如果td的colspan属性值大于1,则在当前的td元素后添加td 代码如下: //本文首发博客园:http://artwl.cnblogs.com...

    js统计Table单元格实际行列 不用rowSpan colSpan,而用offsetLeft

    NULL 博文链接:https://fireinjava.iteye.com/blog/759190

    bootstrap table实现合并单元格效果

    本文实例为大家分享了客户端运用bootstrapTable 的mergeCells属性合并单元格来达到报表分析展示的直观效果。 JavaScript代码 声明mergeCells函数,如: /** * 合并单元格 * @param data 原始数据(在服务端完成...

    javascript 动态table添加colspan\rowspan 参数的方法

    解决方法:取得表对象,并取得他下面对应的行对象下的某个元素,这里如document.tableId.rows[i].cells[j]即取得表下第i行下的第j个元素,然后document.tableId.rows[i].cells[j].colspan=n即可。 eg: dempTHFirst为...

    网页设计实验 Table的使用

    选中第一列,右键会有合并单元格,拖动单元格或者在代码段的height和width输入值来设置单元格大小,用colspan表示合并几列单元格,若是想要对单元格的内容进行加粗显示,可以用来代替,另外可以用表示表标题 ...

    使用HTML开发商业网站-td标签属性课件.pptx

    标签属性 表格 属性名 含义 常用属性值 width ...在标签的属性中,重点掌握colspan和rolspan,其他的属性了解即可,不建议使用,均可用CSS样式属性替代。 当对某一个标签应用height属性设置高度时,该

    JavaScript Table行定位效果

    第一个问题是fixed的tr在ie7中不能进行定位,而且td在定位后并不能保持在表格中的布局,这样在原表格插tr就没意义了。 ps:fixed的相关应用可参考仿LightBox效果。 最后我用的方法是新建一个table,并把源tr克隆到...

    HTML表格单元格的合并

    colspan等于几就是合并几个列的单元格。du比如:zhicolspan="2",就是合并了2个列的单元格。 rowspan,表示合并行dao。rowspan等于几就是合并几个行的单元格。比如:rowspan="2", 就是合并了2个行的单元格

    html表格<table></table>

    html表格 &lt;table border="1"&gt; ... &lt;td colspan="2" align="center"&gt; 第二行的单元格 第一行的单元格 第二行的单元格 第三行的单元格 &lt;/table&gt;

    jquery 动态合并单元格的实现方法

    ////table中指定行第N列合并单元格(合并后会多出一列,删除N+1单元格即可) var tds = $("#dgList .TableHeader1").find('td'); tds[6].setAttribute("colSpan", "2"); 还可以写成:tds[6].attr("rowSpan", 2);

    js动态修改表格行colspan列跨度的方法

    主要介绍了js动态修改表格行colspan列跨度的方法,实例分析了javascript动态修改html中table属性的技巧,具有一定参考借鉴价值,需要的朋友可以参考下

    prosemirror-tables:ProseMirror的表格模块

    该模块定义了一个架构扩展,以支持具有rowpan / colspan支持的表,用于此类表中单元格选择的自定义选择类,用于管理此类选择并在此类表上实施不变式的插件,以及用于该表的许多命令。 顶层目录包含demo.js和index....

Global site tag (gtag.js) - Google Analytics