旋转表格列标题

Avatar of Chris Coyier
Chris Coyier

DigitalOcean 为您旅程的每个阶段提供云产品。立即开始使用 200美元免费额度!

假设您有一个表格标题(即 <th>)为“按国家/地区划分的吼猴物种数量”,并且对应 <td> 中的数据为“3”。这在宽度上存在尴尬的不匹配。

尴尬

对于两列来说,这可能不是一个大问题,但如果您有20列,那么导航将非常困难,并且空间利用率很差。更好的空间利用方式是旋转标题,以便列宽可以更窄。

但是,旋转90度过头了。这使得阅读变得困难。

有趣的是,如果我们将标题旋转45度而不是旋转90度,我们将获得几乎相同数量的空间节省,并且它们更容易阅读。

技巧

这里有一些技巧。

我们将需要使用 transform: rotate() 来调整标题的角度。Chrome/Safari 允许您直接在 <th> 上执行此操作,但是我发现 Firefox 中文本以这种方式消失,因此让我们在一个嵌套的 <div> 中执行此操作,我们将强制它成为我们希望列具有的宽度(直接强制单元格变窄也不起作用)。我们还需要另一个嵌套元素,所以…

<th class="rotate"><div><span>Column header 1</span></div></th>
th.rotate {
  /* Something you can count on */
  height: 140px;
  white-space: nowrap;
}

th.rotate > div {
  transform: 
    /* Magic Numbers */
    translate(25px, 51px)
    /* 45 is really 360 - 45 */
    rotate(315deg);
  width: 30px;
}
th.rotate > div > span {
  border-bottom: 1px solid #ccc;
  padding: 5px 10px;
}

请注意那里的神奇数字。我相信你们中的一些人足够聪明,可以找出与那里所有其他数字的数学关系。事实上,我的示例最初是 Jimmy Bonney 的 列标题旋转 文章的分支。我能够在没有他使用的 skew() 的情况下完成它,我认为这使得它更简单了一些,但他也使用 tan()cos() 计算了一些数学内容,如果您自己开始深入研究,这可能是一个好的起点。

后备方案

如果您走这条路,您可能需要确保您没有应用会破坏表格的规则,如果转换不起作用。Modernizr 可以测试这一点并将支持/不支持类应用于 <html> 元素,因此您可以编写如下内容

/* These aren't needed and will be weird if transforms don't work */
.csstransforms th.rotate {
  height: 140px;
  white-space: nowrap;
}

您如何执行后备方案取决于您自己,但它可能比让表格变得非常宽更糟糕

我的最终演示已实施此功能。

演示

它是用 Sass 编写的,如果您想对其进行分叉并找到一些使用变量和数学等方法使其更具适应性的方法,则可以使用它。