我有一个看起来有点像这样的HTML

<html><body><table>
  <thead><tr><th>A</th><th>B</th><th>C</th><th>D</th><th>E</th></tr></thead>
  <tbody>
    <tr><td>1A</td><td>1B</td><td>1C</td><td>1D</td><td>1E</td></tr>
    <tr><td>2A</td><td>2B</td><td>2C</td><td>2D</td><td>2E</td></tr>
    <tr><td>3A</td><td>3B</td><td>3C</td><td>3D</td><td>3E</td></tr>
  </tbody>
</table></body></html>

每行表示一个对象,列是其属性.实际上,单元格值相当长--有时甚至是20-30个字符.它在大多数设备上呈现得很好,但在较小的手机上可能会出现问题.我知道我可以在狭窄的设备上隐藏某些列,但在这种情况下感觉不正确.目前我的桌面上有x-overflow: scroll个,但我更愿意有一些CSS,使表格在狭窄的设备上呈现得更像这样:

A: 1A
B: 1B
C: 1C
D: 1D
E: 1E
-----
A: 2A
B: 2B
C: 2C
D: 2D
E: 2E
-----
(etc)

我了解如何测试设备宽度,因此,出于这个问题的目的,让我们假设我想无条件地执行此操作.稍微更改一下HTML标记是可以的,例如添加额外的类或属性,尽管我希望使用<table>元素,每个逻辑行有一个<tr>.这是为了向后兼容,因为我知道有相当多的用户刮网站(尽管存在一个更干净的API).由于内部政治的原因,如果可能的话,我倾向于避免需要使用Java脚本的解决方案(而且无论如何,如果需要的话,我知道如何编写JS解决方案).

我可以用这个来完成一部分,但我不确定如何从硬编码为'X'的字段名称开始:

  thead { display: none; }
  table, tr, td { display: block; }
  tr + tr { border-top: thin solid black; }
  td::before { content: "X:"; display: inline-block; width: 2em; }

我见过很多网站做这种事情,但目前我很难找到一个用css做这件事的网站.这似乎应该是一个经常被问到的问题,但我正在努力知道要搜索哪些术语,所以可能会遗漏一些好的解释,无论是这里还是其他地方.

推荐答案

你就快到了.可以在<td>个元素上使用data-col个属性,并在:before上的CSScontent中引用它们

thead {
  display: none;
}

table,
tr,
td {
  display: block;
}

tr+tr {
  border-top: thin solid black;
}

td::before {
  content: attr(data-col)':';
  display: inline-block;
  width: 2em;
}
<table>
  <thead>
    <tr>
      <th>A</th>
      <th>B</th>
      <th>C</th>
      <th>D</th>
      <th>E</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td data-col="A">1A</td>
      <td data-col="B">1B</td>
      <td data-col="C">1C</td>
      <td data-col="D">1D</td>
      <td data-col="E">1E</td>
    </tr>
    <tr>
      <td data-col="A">2A</td>
      <td data-col="B">2B</td>
      <td data-col="C">2C</td>
      <td data-col="D">2D</td>
      <td data-col="E">2E</td>
    </tr>
    <tr>
      <td data-col="A">3A</td>
      <td data-col="B">3B</td>
      <td data-col="C">3C</td>
      <td data-col="D">3D</td>
      <td data-col="E">3E</td>
    </tr>
  </tbody>
</table>

另一种使用css变量存储COL的方法重复性较低,因此可能会在较长的表中节省一些字节:

thead {
  display: none;
}

table,
tr,
td {
  display: block;
}

tr+tr {
  border-top: thin solid black;
}

td:before {
  display: inline-block;
  width: 2em;
}

td:nth-child(1):before {
  content: var(--col1)':';
}

td:nth-child(2):before {
  content: var(--col2)':';
}

td:nth-child(3):before {
  content: var(--col3)':';
}

td:nth-child(4):before {
  content: var(--col4)':';
}

td:nth-child(5):before {
  content: var(--col5)':';
}
<table style="--col1:'A'; --col2:'B'; --col3:'C'; --col4:'D'; --col5:'E'">
  <thead>
    <tr>
      <th>A</th>
      <th>B</th>
      <th>C</th>
      <th>D</th>
      <th>E</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1A</td>
      <td>1B</td>
      <td>1C</td>
      <td>1D</td>
      <td>1E</td>
    </tr>
    <tr>
      <td>2A</td>
      <td>2B</td>
      <td>2C</td>
      <td>2D</td>
      <td>2E</td>
    </tr>
    <tr>
      <td>3A</td>
      <td>3B</td>
      <td>3C</td>
      <td>3D</td>
      <td>3E</td>
    </tr>
  </tbody>
</table>

Html相关问答推荐

按钮的字体重量在鼠标悬停时随过渡而变化

如何将数据发送到Flask 应用程序中的表单文本框

CSS/添加margin—top到嵌入式facebook帖子

我如何 Select 外部html文件元素作为选项,并显示在一个div与jQuery?

HTML5章节或文章

为什么我的网页底部是蓝色背景而不是渐变色?

Div内容防止同级大小增加

有没有办法根据另一个项目调整FlexBox项目的大小?

如何使div填充父项的剩余高度

我在桌面版 html css 代码上给出了位置 margin-left margin-top 标签,如何将其删除到手机上以使其响应?

使用 Thymeleaf 将图像水平居中

如何实现与内嵌图像对齐的自动换行?

如何将内容放置在侧边栏旁边?

如何使我的设计适合与我的框架尺寸不同的视口?

如何根据行中的其中一列将行居中?

我应该如何使这个带有标签的隐藏复选框可访问

把标题、段落和图片放在一起

如何使用 CSS Flex 设计一个导航栏,其中一组项目左对齐而另一组项目右对齐?

发光效果html动画

CSS:如何在模糊的背景上剪切文本?