table表格单元格的宽度计算规则

table表格单元格的宽度计算规则

表格的计算方式包括两种:固定表格布局自动表格布局
如果设置了border-collapse:separate; 需提前设置 table { border-spacing: 0; },不设置的话会出现tr比table小4px(默认border-spacing: 2px;),如果设置border-collapse: collapse;则不需要设置border-spacing
为了更好的对比,先量出样本内容宽度为117.73px(下面会用到这一串文字作为填充内容)
在这里插入图片描述

table {
	border-collapse: separate;
	border-spacing: 0; /* 需设置这个属性,否则这个属性值默认为2,tr会比table小4px*/ 
}

table {
	border-collapse: collapse;
	/*border-spacing: 0;  不需要设置这个属性,属性值默认为2即可*/ 
}

如果table和td均设置了border之后,tbody、tr的宽度会受table和td的border值影响。首先设定table的width值tw

/* table 和 td的border-width一致,均为b */
table {
	border-collapse: collapse;
	width:500px; /* tw */
	border: 1px solid #000; /* 此处 b = 1 */
}
td {
	border: 1px solid #000;  /* 量出tr的width=499px => tw - b ,b为其他值时依旧如此*/
	box-sizing: border-box;
}
/* table 和 td的border-width不一致,分别为b1 b2 */
/* 情况1 */
table {
	border-collapse: collapse;
	width:500px; /* tw */
	border: 1px solid #000; /* 此处 b1 = 1 */
}
td {
	border: 3px solid #000;  /*b2 = 3, 量出tr宽度为497px => tw-b2 */
	box-sizing: border-box;
}

/* 情况2 */
table {
	border-collapse: collapse;
	width:500px; /* tw */
	border: 3px solid #000; /* 此处 b1 = 3 */
}
td {
	border: 1px solid #000;  /*b2 = 1, 量出tr宽度为497px => tw-b1 */
	box-sizing: border-box;
}

/* 情况3 */
table {
	border-collapse: collapse;
	width:500px; /* tw */
	border: 3px solid #000; /* 此处 b1 = 3 */
}
td {
	border: 3px solid #000;  /*b2 = 1, 量出tr宽度为497px => tw-b2 */
	box-sizing: border-box;
}

所以综上所述:tr宽度 = table宽度 - max( table的border,td的border )

固定表格布局(table-layout:fixed)

在固定表格布局中,表格单元格列的宽度与列的内容多少无关,只与表格宽度、单元格宽度(包括td的padding,border,width)有关

1、所有td均未设置宽度

结果:每列宽度均平均分配。 例:

<table>
   <tr>
        <td class="td td1">1这是第一个td</td>
        <td class="td td2">2这是第二个td</td>
        <td class="td td3">3这是第三个td</td>
        <td class="td td4">4这是第4个td</td>
    </tr>
</table>
table {
    width: 500px;
    table-layout: fixed;
    border-collapse: collapse;
    border: 1px solid #000;
}

实际测量4个td宽度一致
4个td的宽度均等于(500-1) / 4 = 124.75px
在这里插入图片描述
内容长度不一致时,宽度依旧一致
在这里插入图片描述
设置内容不准换行(white-space: nowrap;)会出现内容超出宽度,但宽度依旧和其他td一致

2、每个td均设置了宽度,但td宽度总和小于table宽度

结果:每列按设定的宽度所占比例去分配table宽度 例:

<table>
   <tr>
        <td class="td td1">1这是第一个td</td>
        <td class="td td2">2这是第二个td</td>
        <td class="td td3">3这是第三个td</td>
        <td class="td td4">4这是第4个td</td>
    </tr>
</table>
table {
    width: 500px;
    table-layout: fixed;
    border-collapse: collapse;
    border: 1px solid #000;
}
table td {
    border: 1px solid #000;
    box-sizing: border-box;
}
.td1 {
    width: 100px;
}
.td2 {
    width: 80px;
}
.td3 {
    width: 120px;
}
.td4 {
    width: 150px;
}

td1–100/450 *499 = 110.88px 同理td2–88.7px td3–133.06px td4–166.36px
在这里插入图片描述

3、每个td均设置了宽度,但td宽度总和大于table宽度

结果:每列宽度为自己设定的宽度即tr宽度为各列之和,但table宽度会超出设定宽度,宽度为tr宽度+设定的border值。 例:

<table>
   <tr>
        <td class="td td1">1这是第一个td</td>
        <td class="td td2">2这是第二个td</td>
        <td class="td td3">3这是第三个td</td>
        <td class="td td4">4这是第4个td</td>
    </tr>
</table>
table {
        width: 500px;
        table-layout: fixed;
        border-collapse: collapse;
        border: 1px solid #000;
    }

    table td {
        border: 1px solid #000;
        box-sizing: border-box;
    }

    .td1 {
        width: 200px;
    }
    .td2 {
        width: 180px;
    }
    .td3 {
        width: 220px;
    }
    .td4 {
        width: 100px;
    }

结果:
在这里插入图片描述

4、部分td设置了宽度,但设置了宽度的td宽度总和小于table宽度

结果:给定了宽度的td按设置的宽度,没给宽度的td的宽度为tr宽度-给定宽度td的宽度和求平均值,且宽度和内容长度无关(tr宽度 = table宽度 - border值)。 例:

<table>
  <tr>
        <td class="td td1">1这是第一个td</td>
        <td class="td td2">2这是第二个td</td>
        <td class="td td3">3这是第三个td</td>
        <td class="td td4">4这是第4个td4这是第4个td</td>
    </tr>
</table>
 table {
        width: 500px;
        table-layout: fixed;
        border-collapse: collapse;
        border: 1px solid #000;
    }

    table td {
        border: 1px solid #000;
        box-sizing: border-box;
    }

    .td1 {
        width: 200px;
    }
    .td2 {
        width: 180px;
    }

示例结果:
在这里插入图片描述

5、部分td设置了宽度,且设置了宽度的td宽度总和大于table宽度

结果:设置了宽度值的td宽度按设定值,未设定宽度的td宽度值均为0,且tr宽度为设定宽度td和,table宽度为tr宽度+border值

<table>
   <tr>
        <td class="td td1">1这是第一个td</td>
        <td class="td td2">2这是第二个td</td>
        <td class="td td3">3这是第三个td</td>
        <td class="td td4">4这是第4个td</td>
    </tr>
</table>
table {
        width: 500px;
        table-layout: fixed;
        border-collapse: collapse;
        border: 1px solid #000;
    }

table td {
    border: 1px solid #000;
    box-sizing: border-box;
}

.td1 {
    width: 200px;
}
.td2 {
    width: 380px;
}

示例结果:
在这里插入图片描述
注意:min-width属性对固定表格布局不起作用

自动表格布局(table-layout:auto;此值为默认值)

每列宽度由每列单元格中没有换行的最宽的内容的宽度所决定

1、所有单元格都没有定义最小宽度

结果:各单元格宽度由内容长度决定。且宽度和不会超过table宽度 例:

<table>
   <tr>
        <td class="td td1">1这是第一个td</td>
        <td class="td td2">2这是第二个tdtd</td>
        <td class="td td3">3这是第三个td第三个</td>
        <td class="td td4">4这是第4个td</td>
    </tr>
</table>
table {
   	width: 500px;
    border-collapse: collapse;
    border: 1px solid #000;
}

table td {
    border: 1px solid #000;
    box-sizing: border-box;
}

示例结果:
在这里插入图片描述
在这里插入图片描述

2、定义了表格宽度,所有列都定义了最小宽度,且内容最小宽度和小于表格宽度

结果: 开头部分列先按最小宽度进行分配,剩余宽度经过实验得出结果是随机分配给后几列,且后几列宽度不小于最小宽度(没有找到分配的规律,有知道的可以指点一下)

<table>
   <tr>
        <td class="td td1">1这是第一个td1</td>
        <td class="td td2">1这是第一个td1</td>
        <td class="td td5">1这是第一个td5</td>
        <td class="td td3">1这是第一个td1</td>
        <td class="td td4">1这是第一个td1</td>
    </tr>
</table>
table {
   width: 500px; 
   border-collapse: collapse;
   border: 1px solid #000;
}

table td {
    border: 1px solid #000;
    box-sizing: border-box;
}

.td1 {
    width: 50px;
}
.td2 {
    width: 80px;
}
.td5 {
    min-width: 85px;
}
.td3 {
    min-width: 105px;
}
.td4 {
    min-width: 120px;
}

情况一的示例结果:
在这里插入图片描述
为什么说是剩余宽度随机分配呢,因为td5的min-width:85px,td3的min-width:105px,最后分配的宽度均为122.2px

3、所有列均定义最小宽度,且各列最小宽度之和大于表格宽度

结果:按内容宽度分配(若未设置不可换行,则最后宽度不够时会换行显示),且各列最小宽度不能小于设定宽度。且无论td是否设置可以换行,table宽度都会超出去,如果td设置可以换行最终table宽度为最小宽度和+border值,例:

<table>
   <tr>
        <td class="td td1">1这是第一个td1</td>
        <td class="td td2">1这是第一个td1</td>
        <td class="td td3">1这是第一个td1</td>
        <td class="td td4">1这是第一个td1</td>
    </tr>
</table>
table {
    width: 500px;
    border-collapse: collapse;
    border: 1px solid #000;
}
table td {
    border: 1px solid #000;
    box-sizing: border-box;
}
.td1 {
    min-width: 150px;
}
.td2 {
    min-width: 200px;
}
.td3 {
    min-width: 200px;
}
.td4 {
    min-width: 100px;
}

示例结果:
在这里插入图片描述

4、部分列定义了最小宽度,且根据内容计算的所有列之和小于表格宽度

结果:每列宽度根据内容计算,且不能小于设置的最小宽度。例:

<table>
   <tr>
        <td class="td td1">1这是第一个td1</td>
        <td class="td td2">1这是第一个td1</td>
        <td class="td td3">1这是第一个td1</td>
        <td class="td td4">1这是第一个td1</td>
    </tr>
</table>
table {
        width: 500px;
        border-collapse: collapse;
        border: 1px solid #000;
    }

    table td {
        border: 1px solid #000;
        box-sizing: border-box;
    }

    .td1 {
        min-width: 200px;
    }
    .td2 {
        min-width: 100px;
    }

文章开头已经记录“1这是第一个td1”的宽度117.73px,4个单元格470.92px<表格宽度500px,最终得到实际结果为
在这里插入图片描述

5、部分列定义了最小宽度,且根据内容计算的列宽度和大于表格宽度

结果:每列宽度按内容计算,且不能小于设定的最小宽度。例:

<table>
   <tr>
        <td class="td td1">1这是第一个td1</td>
        <td class="td td2">1这是第一个td1</td>
        <td class="td td3">1这是第一个td1</td>
        <td class="td td4">1这是第一个td1</td>
    </tr>
</table>
table {
    width: 400px;
    border-collapse: collapse;
    border: 1px solid #000;
}
table td {
    border: 1px solid #000;
    box-sizing: border-box;
}
.td1 {
    min-width: 200px;
}
.td2 {
    min-width: 100px;
}

示例结果
在这里插入图片描述
设定了最小宽度的不小于最小宽度,没有设定最小宽度的且剩余宽度又不够的直接换行。如果设置td内容不能换行,则最终结果为各列宽度按内容计算,且不小于最小宽度,table宽度会大于设定的宽度

如有错误之处,请各位大佬不吝赐教!

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要实现表格宽度拖动,可以使用 bootstrap-table 插件中的 resizableColumns 插件。具体使用方法如下: 1. 引入插件: ```html <script src="https://cdn.bootcss.com/bootstrap-table/1.15.4/extensions/resizable/bootstrap-table-resizable.min.js"></script> ``` 2. 初始化表格并添加插件: ```javascript $('#table').bootstrapTable({ resizableColumns: true, // 开启列宽拖动功能 columns: [{ field: 'id', title: 'ID' }, { field: 'name', title: 'Name' }, { field: 'price', title: 'Price' }] }); ``` 3. 如果需要固定表头,可以在 CSS 中添加以下样式: ```css .fixed-table-header { position: fixed; top: 0; left: 0; z-index: 999; } ``` 然后在表格的父容器中添加以下属性: ```html <div class="table-responsive"> <table id="table" data-height="460" data-show-columns="true"> ... </table> </div> ``` 其中,`table-responsive` 类用于使表格可以响应式缩放,`data-height` 属性指定表格高度,`data-show-columns` 属性用于显示列选择器。 ### 回答2: Bootstrap Table表格宽度拖动,固定表头的实现方法如下: 1. 使用bootstrap-table插件的table组件来创建表格,并设置table-layout为fixed来固定列宽。 2. 在表格CSS样式中,设置表格容器的宽度为固定值,以便固定表格宽度。 3. 使用bootstrap-table插件的column的width属性来设置每列的宽度。通过拖拽可调整列宽的方式来改变每列的宽度。 4. 为表格的头部区域创建一个额外的div容器,并设置其CSS样式为固定定位和指定高度。 5. 使用jQuery的scroll事件来监听滚动事件,在滚动时将表格头部的div容器进行滚动,使其保持固定在页面上方。 6. 在colgroup标签中定义每列的固定宽度,使表格的列宽度表格头部的div容器保持一致。 综上所述,通过使用bootstrap-table插件和一些CSS样式和JavaScript代码的设置,我们可以实现Bootstrap Table表格宽度拖动和固定表头的效果。这样,无论用户拖动表格宽度还是滚动页面,表头始终会保持在页面顶部,为用户提供更好的表格浏览体验。 ### 回答3: 要实现表格宽度拖动和固定表头,可以使用 Bootstrap Table 插件结合其他一些技术来实现。 首先,引入 Bootstrap Table 插件的样式和脚本文件。在表格的容器中创建一个 `<table>` 元素,并添加相应的 `class`,如 `table table-bordered table-striped`。 接下来,使用 jQuery UI 的 resizable 方法使表格宽度可以拖动调整大小。为表格添加一个父容器,并给父容器设置合适的宽度。然后,使用 jQuery 选择器选择表格,并调用 resizable 方法,设置拖动范围和回调函数。 为了固定表头,需要创建一个静态的表格头部。复制表格头部的内容并使用 div 包裹起来,添加对应的样式。 接下来,使用 CSS 来实现表格的固定表头。设置父容器的 `position` 为 `relative`,表格头部的 `position` 为 `absolute`。通过调整父容器的 `padding-top` 来使表格正文内容向下错开,然后用 `z-index` 来设置表格头部的层级。 最后,为了使表格正文能够滚动,添加 CSS 样式设置表格的 `overflow-x` 为 `auto`。 通过上述步骤,我们就能够实现 Bootstrap Table 表格宽度的拖动和固定表头的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值