【发布时间】:2021-02-01 02:05:52
【问题描述】:
我想在一个类似表格的布局中展示一些内容,这些内容会根据媒体查询发生变化。对于大屏幕,一些内容显示在第三个表格列中,而对于小屏幕,此内容显示在一个额外的行中。我希望代码 sn-p 能说明这一点。
在这两种情况下,我都需要单元格的宽度由最大单元格的内容来确定。我不在乎标记实际上是 <table> 还是只是一些 <div>s。
到目前为止我发现:使用display: table 似乎不是一个选项,因为它不支持 colspan/rowspan。对于 flexbox 布局或其他基于 <div> 的方法,我只是看不到一种方法可以自动将宽度调整为文本的长度,并为一列的所有单元格提供共同的宽度。
我看到的唯一选择是将大单元格两次添加到标记中,并根据媒体查询隐藏其中一个。有没有更优雅的选择(即没有重复和没有 JavaScript)?
<p>layout for large screen sizes:</p>
<table border="1">
<tr><td>A1</td><td>A2</td><td rowspan="2">this is<br>the first<br>multiline cell</td></tr>
<tr><td>cell B1</td><td>this is cell B2</td></tr>
<tr><td>C1</td><td>C2</td><td rowspan="3">this is<br>the second<br>multiline cell</td></tr>
<tr><td>D1</td><td>D2</td></tr>
<tr><td>E1</td><td>E2</td></tr>
<table>
<p>layout for small screen sizes:</p>
<table border="1">
<tr><td>A1</td><td>A2</td></tr>
<tr><td>cell B1</td><td>this is cell B2</td></tr>
<tr><td colspan="2">this is<br>the first<br>multiline cell</td></tr>
<tr><td>C1</td><td>C2</td></tr>
<tr><td>D1</td><td>D2</td></tr>
<tr><td>E1</td><td>E2</td></tr>
<tr><td colspan="2">this is<br>the second<br>multiline cell</td></tr>
<table>
编辑:我注意到,在将问题简化为一个抽象的最小示例时,我未能明确哪些假设是有效的,哪些是无效的。我通过添加 E1/E2 行稍微更改了示例表。一些附加信息:
- 大单元格需要跨越任意数量的行。 (实际上这可能会限制在 20 个左右。)
- 表格中的行数不受限制,取决于内容。列布局是固定的。
这是使用<div>s 的自然标记的建议。将 col1 和 col2 视为项目列表,而每个 col3 包含有关前一组项目的更多信息。如果可能,最好不要使用col3-rowspanN 类。
<div class="table">
<div class="col1">A1</div>
<div class="col2">A2</div>
<div class="col1">cell B1</div>
<div class="col2">this is cell B2</div>
<div class="col3 col3-rowspan2">this is
<br>the first
<br>multiline cell
</div>
<div class="col1">C1</div>
<div class="col2">C2</div>
<div class="col1">D1</div>
<div class="col2">D2</div>
<div class="col1">E1</div>
<div class="col2">E2</div>
<div class="col3 col3-rowspan3">this is
<br>the second
<br>multiline cell
</div>
</div>
【问题讨论】:
-
嗨!我认为您最好的解决方案是使用 flex ,您可以在其中定义部分的 flex 增长。你有没有想过使用类似 bootstrap 的东西来让你更轻松?
-
我对 flexbox 没有太多经验,所以你能解释一下这将如何解决我的问题吗?我认为随着 flex 增长,我必须自己指定列宽的比率。但是,我需要它们像表格一样适应单元格的内容。所以现在,文本“cell B1”定义了第一列的宽度。如果文本更改为“B1”,则单元格 A1、B1、C1 和 D1 的宽度需要相应减小。
-
如果您想将类似表格的布局更改为汉堡布局,css 网格是更好的解决方案。在这种情况下甚至比使用 flex-boxes 更好。
标签: html css html-table flexbox