【发布时间】:2011-07-29 06:28:01
【问题描述】:
是否可以使用 CSS 和两个内联块(或其他)DIV 标签而不是使用表格?
表格版本是这样的(添加了边框以便您可以看到它):
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head></head>
<body>
<table style="width:100%;">
<tr>
<td style="border:1px solid black;width:100px;height:10px;"></td>
<td style="border:1px solid black;height:10px;"></td>
</tr>
</table>
</body>
</html>
它产生一个具有 FIXED WIDTH(不是百分比宽度)的左列,以及一个扩展以填充行上的 THE REMAINING SPACE 的右列。听起来很简单,对吧?此外,由于没有任何东西是“浮动的”,因此父容器的高度会适当地扩展以包含内容的高度。
--开始咆哮--
我已经看到了具有固定宽度侧列的多列布局的“明确修复”和“圣杯”实现,它们很糟糕而且很复杂。它们颠倒了元素的顺序,它们使用百分比宽度,或者它们使用浮点数、负边距,并且“left”、“right”和“margin”属性之间的关系很复杂。此外,布局是亚像素敏感的,因此即使添加单个像素的边框、填充或边距也会破坏整个布局,并将整个列发送到下一行。例如,即使您尝试做一些简单的事情,例如将 4 个元素放在一条线上,每个元素的宽度都设置为 25%,舍入错误也是一个问题。
--END RANT--
我尝试过使用“inline-block”和“white-space:nowrap;”,但问题是我无法让第二个元素填充 remaining 空间线。在某些情况下,将宽度设置为“width:100%-(LeftColumWidth)px”会起作用,但实际上并不支持在宽度属性中执行计算。
【问题讨论】:
-
我不认为有一种理智的方法可以做到这一点,除非把它变成一个可以工作的
display: table-*构造,但也不是真正“更语义化”(这是一个可怕的例子divsoup)并破坏了 IE6 兼容性。我个人会坚持使用<table>,除非有人设法想出一个天才的简单想法,而无需 -
是的。从 CSS 时代的曙光开始,我一直遇到所有这些“避免使用表格”的论点,如果你仍然使用表格进行布局,它们的措辞会让你听起来像一个无能的懒惰白痴。快进十年,它仍然是一个理想主义的白日梦。事实是,流布局语义对于用户界面和表单等固定但灵活的布局来说很糟糕。事实上,聪明的人会在方便的时候使用表格,因为他们已经用尽了所有可能的 CSS 解决方案,并意识到它们都不完美,而且比仅仅使用表格要复杂得多。
-
浮动?向我展示工作代码,其中行尾元素不会意外换行,边框和边距不会破坏布局。这就是他们的问题。此外,自动调整大小的父容器是否正确扩展以包含浮动元素而没有“清除修复”黑客?我不这么认为。
-
如果您的父容器中至少有一个非浮动元素,那么清除浮动元素并不是真正的“黑客”,是吗?请记住,CSS 起源于打印 - 请参阅 css-tricks.com/containers-dont-clear-floats 以获得关于为什么您没有获得自动清除功能的精彩讨论。
-
@Triynko:这就是我之前所做的:jsfiddle.net/thirtydot/qx32C - 我认为它符合你的大部分观点。我会听到你对我所做的演示的批评,然后尝试修复它。
标签: css layout fixed-width