`

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

分享到:
评论

相关推荐

    vue-easytable合并单元格

    在传统的HTML表格中,合并单元格通常使用`&lt;td&gt;`的`colspan`和`rowspan`属性来完成,但在Vue Easytable组件中,这种方式并不适用。Vue Easytable提供了自定义渲染(render)和数据处理(data processing)的方法来...

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

    3. **单元格合并**:在网页开发中,如果需要将多个相邻的单元格合并成一个大单元格,可以使用`rowspan`和`colspan`属性。`colspan`与`rowspan`类似,但作用于列的跨度。合并单元格可以提高表格布局的复杂性和美感。 ...

    layui table合并单元格.zip

    "layui table合并单元格.zip" 这个压缩包正是提供了关于如何在layui的表格中实现单元格合并的示例和资源。 首先,"layui table.txt" 文件可能包含了layui表格组件的基础用法和API介绍。layui的表格组件支持动态加载...

    table合并单元格的多种方法

    在表格(Table)设计中,有时我们需要合并单元格来达到特定的展示效果,例如创建标题行或列,或者为了美观和布局对齐。在HTML、CSS以及JavaScript中,都有多种方式可以实现单元格的合并。这里我们将详细探讨六种合并...

    table数据相同合并单元格

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

    bootstrap-table导出合并单元格

    在描述中提到的"bootstrap-table导出合并单元格"是该插件的一个高级特性,允许用户在导出表格时,将具有相同内容的单元格进行合并,以提高数据的可读性和美观性。 1. **Bootstrap Table简介** Bootstrap Table是一...

    JS 实现Table相同行的单元格自动合并示例代码

    表格中的每个单元格可以跨越多个行或列,分别通过`rowSpan`和`colSpan`属性来设置。 在上述示例代码中,我们看到了一个自定义的JavaScript函数`autoRowSpan(tb, row, col)`,它接受三个参数:表格对象`tb`、起始行`...

    JS实现动态修改table及合并单元格的方法示例

    在JavaScript中,动态修改表格(Table)以及合并单元格是常见的需求,特别是在处理数据展示或者报表生成时。以下将详细介绍如何使用JS实现这些功能。 首先,要动态修改表格,我们需要获取表格元素。在HTML中,表格...

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

    在JavaScript编程中,统计Table单元格的实际行列位置通常涉及到`rowSpan`和`colSpan`属性的使用。然而,有时我们可能需要避开这些属性,转而利用其他方法来获取单元格的位置信息,例如通过计算其`offsetLeft`值。...

    GridView中单元格合并

    4. **设置Rowspan和Colspan属性**:在RowDataBound事件中,你可以获取到GridViewRow对象,然后对其中的TableCell进行操作,设置其RowSpan和ColSpan属性。RowSpan表示跨过的行数,ColSpan表示跨过的列数。例如,`...

    列表多行多列合并单元格

    例如,如果你的列表有三列,但某些情况下需要将第一列和第二列合并,那么可以先生成不合并的表格,然后根据合并规则找到需要合并的单元格,设置其`colspan`属性。 在实际应用中,可能还会遇到一些复杂情况,如: 1...

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

    在对HTML中的表格进行样式设置时,若使用了CSS的table-layout:fixed属性,则可能会遇到列宽设置无效的问题,尤其是当表格中存在跨列或多列合并的单元格时。这主要是因为当表格布局设置为固定时,表格的列宽不是由...

    HTML 第八章 Table局部布局与浏览器兼容性

    在局部布局中,表格可以通过调整这些元素的属性来实现复杂的设计,比如通过`colspan`和`rowspan`属性来合并单元格,创建跨越多列或多行的单元格。 表格的样式可以通过CSS来控制,包括边框、背景色、文字对齐等。`...

    js自动合并相同单元格Demo

    `js自动合并相同单元格Demo`是一个关于如何在JavaScript中实现动态生成表格并自动合并相同单元格的示例。这个插件尤其适用于数据量较大且存在重复信息的场景,可以有效提升表格的可读性和美观性。 首先,我们要理解...

    web程序设计 表格 其中包含table td td常见的属性

    在Web程序设计中,表格是一种重要的布局和数据展示工具,尤其在HTML中,`&lt;table&gt;`元素被广泛用于创建结构化的二维数据。本篇将详细阐述`&lt;table&gt;`、`&lt;td&gt;`(表格数据单元格)及其常见属性,帮助你更好地理解和应用...

    gridview 单元格合并源代码

    然而,GridView默认情况下并不支持单元格的跨行或跨列合并,这在某些数据展示场景下可能会显得不够灵活。针对这一需求,我们可以通过自定义代码来实现GridView的单元格合并功能。 标题“gridview 单元格合并源代码...

    colspan和rowspan

    在网页设计中,`colspan` 和 `rowspan` 是两个非常重要的属性,它们用于HTML表格元素中,帮助我们合并单元格,实现更复杂的布局。本文将深入探讨这两个属性的含义、用法以及它们在实际应用中的作用。 首先,`...

    合并相同的单元格

    在某些情况下,我们可能还需要使用CSS来调整样式,以实现特定的布局效果。 首先,我们来看HTML中的`&lt;td&gt;`或`&lt;th&gt;`元素的`colspan`和`rowspan`属性。这两个属性用于控制单元格的跨越范围。`colspan`定义了单元格横向...

    js 合并单元格2例

    在JavaScript(简称js)中,对HTML表格(table)进行单元格(cell)合并是常见的需求,这在创建复杂布局或者展示数据时尤其有用。本文将深入探讨两种合并单元格的方法,并提供相关操作表格的解决方案。 一、基本...

Global site tag (gtag.js) - Google Analytics