【问题标题】:CSS table layout with fluid widths具有可变宽度的 CSS 表格布局
【发布时间】:2012-01-17 11:57:07
【问题描述】:

我一直在寻找一种使用 CSS 生成以下 HTML 表格的方法:

<style type="text/css">
    table.frm tr td { vertical-align: top; padding-right: 10px; }
</style>

<table class="frm">
  <tr>
    <td rowspan="2">Label 1:</td>
    <td><input type="text" /></td>
    <td rowspan="2">Label 2:</td>
    <td><input type="text" /></td>
  </tr>
  <tr>
    <td>Validation Message 1</td>
    <td>Validation Message 2</td>
  </tr>
  <tr>
    <td rowspan="2">Label 3:</td>
    <td><input type="text" /></td>
    <td rowspan="2">Label 4:</td>
    <td><input type="text" /></td>
  </tr>
  <tr>
    <td>Validation Message 3</td>
    <td>Validation Message 4</td>
  </tr>
</table>

当我尝试用 div 替换它时遇到的问题是我无法对齐 both 列和行。我尝试使用浮动来对齐列,但随后我松开了行的垂直对齐方式。但是如果我使用 clear 来对齐行,我会失去列的水平对齐方式。

我看到的许多将表格转换为 div 的示例都使用固定或百分比宽度,但我希望布局具有与表格相同的流畅行为,因为验证消息可能会出现也可能不会出现,并且标签/字段会有不同的尺寸。

有没有设计师可以告诉我如何在没有表格的情况下实现这种布局?

【问题讨论】:

  • 好吧,我说的是使用表格。表格用于以类似表格的方式组织事物。 div 用于创建块级元素。为正确的工作使用正确的工具,不要试图将方形钉子放在圆孔中等等等等。
  • 我倾向于同意你的观点,但是设计类型在看到表格标签时会立即皱起眉头!

标签: html css html-table width


【解决方案1】:

这不是display (CSS2) 的问题,但它需要 IE7+。请看this example fiddle:

标记:

<form>
    <span>
        <label for="edit1">First label:</label><input id="edit1" type="text" />
        <label for="edit2">Second label:</label><input id="edit2" type="text" />
    </span>
    <span>
        <br /><p>That sounds right!</p>
        <br /><p>Problem!</p>
    </span>        
    <span>
        <label for="edit3">3:</label><input id="edit3" type="text" />
        <label for="edit4">Fourth and last label:</label><input id="edit4" type="text" />
    </span>
    <span>
        <br /><p>No succes. Try again and enter another value.</p>
        <br /><p>Wait...</p>
    </span>        
</form>

样式表:

form {
    display: table;
}
form span {
    display: table-row;
}
form span * {
    vertical-align: top;
    padding-right: 10px;
    display: table-cell;
}

【讨论】:

  • 这与我会做的类似。它是一种形式。没有人会关心它曾经放在桌子上。
  • 这与我想要的非常接近。我用空的 p 标签替换了 br 标签,这实现了我正在寻找的行为(即,如果没有验证消息,则折叠之间的行)。我更新了小提琴 (jsfiddle.net/gHgdf/2)。
【解决方案2】:

您面临的问题是您将每个单元格视为其自己的小数据块。你需要看大局。那个数据集是什么?它实际上是一个清单吗?它属于 ul 还是 dl?

当它根本不是一张桌子时,不要试图让它看起来像一个包含不同元素的表格。并且表格不应该用于布局。

【讨论】:

  • 我不是想让它看起来像一张桌子,而是想让它表现得像一张桌子。例如,我希望第二列和第四列中的输入字段全部对齐,如果验证消息出现/隐藏我希望整行相应地移动,等等。
  • @Paul - 你拥有的是一个表格,但你正试图让它表现得像一张桌子。上面的 NGLN 得出的结果与我将要展示的内容相似。
【解决方案3】:

流体是一个非常模糊的术语,流体是指它的宽度可以像表格一样针对不同尺寸的屏幕或在调整浏览器窗口大小时扩展和收缩?还是您希望他的列宽都调整为与内容最长/最大的单元格相同的宽度?

第一个是这样完成的

<div style="position: absolute; width: 100%;">
    <div style="position: relative; width: 100%; clear: both;">
        <div style="position: relative; width: 50%; float: left;"> </div>
        <div style="position: relative; width: 50%; float: left;"> </div>
    </div>
    <div style="position: relative; width: 100%; clear: both;">
        <div style="position: relative; width: 50%; float: left;"> </div>
        <div style="position: relative; width: 50%; float: left;"> </div>
    </div>
</div>

这应该模拟两行,每行两列,宽度取决于屏幕尺寸。

第二个是根据内容大小调整列。

<div style="position: absolute; width: 100%;">
    <div style="position: relative; float: left;">
        <div style="position: relative; min-width: 1%; max-width: 75%;"> </div>
        <div style="position: relative; min-width: 1%; max-width: 75%;"> </div>
    </div>
    <div style="position: relative; float: left;">
        <div style="position: relative; min-width: 1%; max-width: 75%;"> </div>
        <div style="position: relative; min-width: 1%; max-width: 75%;"> </div>
    </div>
</div>

即两列,每列两行。将“最小宽度”和“最大宽度”设置为您需要的任何值。我不认为我有理由测试这样的东西,所以如果它不起作用,你可以尝试为每一行设置“显示:内联”。

如果这些都不起作用,请尝试发布您的测试代码。我确信你可以用 div 制作表格。在几年不使用表格后不久,我无意中创建了一个网站,该网站应该使用表格,而不是 div。你想做的事情可以完成,这只是处理 CSS 的问题。

【讨论】:

  • float: left;position: relative; 是冲突的语句,-1
  • @tereško 如果这是真的,那么 position: static;除非另外定义了位置,否则它是元素的默认值。除了第一个示例之外,在所有浏览器中都有效。所以你投票反对一个可行的想法?我认为第二个会有问题,但它展示了一个概念,通过一些工作可能会产生解决方案。
猜你喜欢
  • 2018-08-05
  • 1970-01-01
  • 2017-01-23
  • 2019-07-19
  • 1970-01-01
  • 2011-05-02
  • 2019-06-22
  • 1970-01-01
  • 2013-10-27
相关资源
最近更新 更多