跨元素的舍入固定表格布局单元格宽度百分比计算

Posted

技术标签:

【中文标题】跨元素的舍入固定表格布局单元格宽度百分比计算【英文标题】:Rounded fixed table layout cell width percentage calculation for spanned elements 【发布时间】:2020-02-29 17:20:36 【问题描述】:

注意:这个问题似乎只发生在 Chrome 等 Blink 浏览器中。在撰写本文时它还没有出现在 Firefox 中。

我有一个table-layout: fixed 表,其中包含一些跨越多列的元素。为确保它们填满整个列,它们使用calc() 将它们的宽度确定为 100% 的(colspan)倍数,加上它们的边界占用的空间。

例如,跨越三列的项目将是calc(300% + 2px),即三个列宽加上它们之间的两个 1px 厚的边框。

在 Chrome 中,此计算会导致项目无法填充特定屏幕宽度的列。当您调整屏幕大小时,四舍五入会导致项目在达到正确值时“跳跃”。

除了四舍五入之外还有其他原因会发生这种情况,我能做些什么来防止它发生吗?大概将整个表格换成相等的 div 单元格会起作用,但我更愿意使用我所拥有的。

table 
  table-layout: fixed;
  width: 100%;
  border-collapse: collapse;

td 
  position: relative;
  padding: 0;
  border: 1px solid black;

.spanner 
  width: calc(600% + 5px);
  background-color: rgba(254,0,11, 0.3);
<table>
  <tbody>
    <tr>
      <td>Some</td>
      <td>table</td>
      <td>cells</td>
      <td>are</td>
      <td>up</td>
      <td>here</td>
    </tr>
    <tr>
      <td>
        <div class="spanner">Here's some div that is meant to span the first two table cells, but it doesn't quite do that</div>
      </td>
      <td></td>
      <td></td>
      <td></td>
      <td></td>
      <td></td>
    </tr>
  </tbody>
</table>

【问题讨论】:

【参考方案1】:

你应该使用“colspan”属性

<table>
  <tbody>
    <tr>
      <td>Some</td>
      <td>table</td>
      <td>cells</td>
      <td>are</td>
      <td>up</td>
      <td>here</td>
    </tr>
    <tr>
      <td colspan="2">
        Here's some div that is meant to span the first two table cells
      </td>
      <td></td>
      <td></td>
      <td></td>
      <td></td>
    </tr>
  </tbody>
</table>

关于宽度,如果你使用 css 属性

box-sizing : border-box

边框应包含在宽度计数中

【讨论】:

我不需要单元格来跨越列,单元格中的一些 div 需要跨越。它们可能是偏移的,并且可能不是全宽的。 box-sizing 在这里似乎没有什么区别,我的已经设置为 border-box

以上是关于跨元素的舍入固定表格布局单元格宽度百分比计算的主要内容,如果未能解决你的问题,请参考以下文章

table-layout

iOS 自动布局:表格视图单元格宽度 = 0

达到固定宽度后防止在表格单元格上输入?

table-layout:fixed的作用

为啥 iOS 自动布局会导致预 Retina 显示器出现明显的舍入错误(包括单元测试)

如何将表格样式设置为容器的全宽并使单元格使用宽度的百分比?