How to make an inline-block element fill the remainder of the line?
使用CSS和两个内联块(或其他)DIV标记而不是使用一个表,这是可能的吗?
表格版本如下(添加边框以便您查看):
1 2 3 4 5 6 7 8 9 10 11 12
| <!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> |
它生成一个宽度固定(不是百分比宽度)的左列和一个扩展以填充行上剩余空间的右列。听起来很简单,对吧?此外,由于没有"浮动",父容器的高度适当地扩展到包含内容的高度。
--开始咆哮——我已经看到了"清晰的修复"和"圣杯"的实现,它们用于具有固定宽度的侧栏的多栏布局,它们很糟糕,而且很复杂。它们颠倒元素的顺序,使用百分比宽度,或者使用浮动、负边距,并且"左"、"右"和"边距"属性之间的关系很复杂。此外,布局对亚像素敏感,因此即使添加单个像素的边框、填充或边距也会破坏整个布局,并将整个列包装发送到下一行。例如,舍入误差是一个问题,即使你尝试做一些简单的事情,比如在一条线上放置4个元素,每个元素的宽度设置为25%。最后的咆哮——
我尝试过使用"inline block"和"white space:nowrap;",但问题是我无法让第二个元素填充行中的剩余空间。在某些情况下,将宽度设置为"width:100%-(leftcolumwidth)px"可以工作,但实际上不支持在width属性中执行计算。
- 我不认为有一个明智的方法来做到这一点,除非把它变成一个可以工作的display: table-*结构,但也不是真正的"更语义"的(这是div汤的一个可怕的情况),并破坏了ie6的兼容性。我个人会坚持使用
,除非有人能想出一个天才的简单想法,这个想法在没有
- 浮球怎么了?
- 是啊。从CSS时代的开始,我就不断地遇到这些"避免使用表格"的争论,如果你仍然使用表格进行布局,它们的措辞会让你听起来像一个无能的懒惰的白痴。十年来,这仍然是一个理想主义的白日梦。事实上,流布局语义对于固定但灵活的布局(如用户界面和表单)很差劲。事实上,聪明人会在方便的地方使用表格,因为他们已经用尽了所有可能的CSS解决方案,并且意识到他们都不完美,而且比仅仅使用表格要复杂得多。
- Floats?显示工作代码,其中行尾元素不会意外换行,边框和边距不会破坏布局。这就是他们的问题所在。此外,自动调整大小的父容器是否正确地扩展以包含不包含"清除修复"的浮动元素?我不这么认为。
- 如果您的父容器中至少有一个非浮动元素,那么清除浮动实际上不是一个"黑客",现在是吗?记住,CSS的根源在于打印——请参阅css-tricks.com/containers-don t-clear-floats,了解为什么不进行自动清除。
- 我不喜欢你问题中的抱怨声。我做了一些与你的演示完全相同的东西(不使用任何类型的table),但我仍然不清楚你到底想要什么;你只是想要一个没有table的table代码的版本,还是想要更多的?牢房里有什么?他们必须保持同样的高度吗?
- CSS3去营救!新的灵活的方框布局模块将有所帮助,请参阅我在这里的答案,例如:stackoverflow.com/questions/4433931/&hellip;。不幸的是,和往常一样,这在Internet Explorer中是不可能的。
- @三十点:让我们看看。我想分析一下你的解决方案。
- @ Chowlett。我的容器中没有非浮动元素。只有两个沙发。左栏和右栏。我希望左边的列有一个固定的宽度,右边的列展开以填充剩余的行宽。另外,我希望父容器的高度扩展到包含这两列,这样它们就不会溢出。对于父容器而言,浮动元素通常没有大小,因此它们会溢出,除非父容器的"溢出"不是可见的,并且它可能必须是"隐藏"的,因此滚动条不会显示。
- @第三十点:要清楚。一个容器分区,有任何宽度(固定/百分比/不关心,只要它有一些宽度)。两个形成并排柱的子分隔。左DIV是固定的像素宽度,可变的高度。右DIV的高度也是可变的,但其宽度会扩展以填充容器的剩余宽度。列的大小将不相同,应展开(按高度)以适合我要放入的任何内容。容器DIV应该按高度展开以适应(较大的)列。顺便说一句,抱怨是必要的,以描述解决方案是不够的和不稳定的。
- @Triynko:这是我之前做的:jsfiddle.net/thirtydot/qx32c-我认为它击中了你的大部分分数。我会听到你对我做的那个演示的批评,然后再尝试修正它。
- @谢谢,据我所知,这就是解决办法。它很简单,工作正常,满足所有要求。如果你把它贴出来作为答案,我就把它标出来。也可以在这里看到同样的解决方案:stackoverflow.com/questions/3568262/&hellip;
- 该死。如果在右边的列中添加了overflow:hidden或overflow:auto,那么在Safari和Firefox中它的反应会有所不同。Safari看起来像是右边的左边距,导致右栏看起来居中并压扁,因此右边距与左边距相同。火狐不这样做,只留下相同大小的右栏。另外,当为右列设置溢出时,它会响应,例如,浮动左列上的右边距,而在不设置溢出的情况下,左列上的这样一个边距对右列没有影响。这种不一致很糟糕。
- 没有溢出:在Safari中,右栏中的一些内容被强制放在左栏下面…但不是全部!只是第二个或第三个元素,没有明显的原因。这不会发生在火狐上。
- 你提到了空白,这对桌子很有用。
- 如果只有HTML被存档并且为Web2.0发明了一种新语言…
湖:http:/ / / / / jsfiddle.net qx32c 36
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| .lineContainer {
overflow: hidden; /* clear the float */
border: 1px solid #000
}
.lineContainer div {
height: 20px
}
.left {
width: 100px;
float: left;
border-right: 1px solid #000
}
.right {
overflow: hidden;
background: #ccc
} |
为什么一个在.rightreplace margin-left: 100pxoverflow: hidden?编辑:这是两个镜子上面的链接:(死)
- archive.is
- web.archive.org
- http://制作/# colinaarts-com.herokuapp.com for花车室/文章/魔法学院溢出隐藏
- 如果您称自己为Web开发人员,则需要单击该链接。我做到了,我感觉就像是坐在魔毯上的茉莉。
- @上帝啊,这也许是最好的描述方式。这种方法毫无意义,但再一次…这是一个很好的解决方法,你应该能够明确地做一些事情。
- 我更新了jsFiddle页面以说明第三行,保持了灵活的内容。
- @工作:您需要共享到更新后的JSfiddle的链接。
- @Chrisshouts"如果你称自己为网络开发者,你需要点击那个链接"wtf?
- 如果第二个div元素是一个输入文本字段,您能让它工作吗?
- @崔巴尔维:像这样?或者是这个?
- +1只为链接到overflow: hidden魔术!
- 隐藏溢出不是解决方案。假设您不希望隐藏正确容器的溢出。这不会使正确容器的大小填充行上的剩余空间。这是一个两岁大的问题的例子,我仍然没有为这个问题的答案做标记,因为仍然没有令人满意的答案。
- 谢谢,我是从谷歌来的,想找一个与float完全相反的解决方案。@
- 我不确定我喜欢它,但它很管用!
- triynko:即使您使用的是"overflow:hidden",通常也不会隐藏任何内容(至少如果您只在其中包含文本)。DIV中的文本/元素的排列方式将使它们适合DIV(当然,除非您有一个大于DIV的元素)。
- 虽然它证明了CSS有多差劲,但这是我们提出的最佳答案,但在有限的情况下绝对有用。
- "为什么我要用溢出:隐藏在上。右?"我不知道,你使用的链接已经不起作用了,你自己的问题也没有引用的文本。
- @记忆X:这是一面镜子。
- 遗憾的是,如果你左右颠倒的话,这是行不通的:(
- 这将导致右列中的项在可见区域之外部分呈现。下面的display:table解决方案提供了更正确的行为。
- @Rmorrisey:可能只是需要一些box-sizing: border-box在div上。只是猜测一下,因为你没有提供一个展示你描述的行为的演示。也就是说,基于display: table的解决方案通常更好。这是一个非常古老的问题,但我认为我试图避免与这个问题中的表有任何关系,因为OP的行为。
解决方案:一个现代flexbox
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| .container {
display: flex;
}
.container > div {
border: 1px solid black;
height: 10px;
}
.left {
width: 100px;
}
.right {
width: 100%;
background-color:#ddd;
} |
jsfiddle.net http:/ / / / / m5xz2 100
- 显示弹性和宽度100%…必须记住
- 使用flex时,为什么不使用flex: 1而不是width: 100%?
- 对于刚加入flexbox的用户:flex: 1是flex-grow: 1的简写。它是一个组合属性:flex: 。
- 只是一个简短的提示:在IE<11中不支持flex,而在11中非常不支持。
- @EricShields这不应该阻止任何人使用FlexBox。你知道的,现在我们有了flexbugs。
兼容普通的现代浏览器(IE 8 +):http:/ / / / / 3 m5xz2 jsfiddle.net
1 2 3 4 5 6 7 8 9 10 11 12 13
| .lineContainer {
display:table;
border-collapse:collapse;
width:100%;
}
.lineContainer div {
display:table-cell;
border:1px solid black;
height:10px;
}
.left {
width:100px;
} |
- 回到使用表格进行布局,我明白了,哈哈。
- 反对使用表的论点与它的表示特性无关。它与不可管理的标记、样式/文档混乱和不正确的语义有关。这些论点都不适用于display:table。
- 这并不能回答如何让inline-block填充行的其余部分。
- @translucentcloud我同意我的答案并不完全回答问题标题,但它提供了一种使用div填充可用宽度的方法,如问题正文中所要求的那样。
- 我非常喜欢这个解决方案。您不必强制使用隐藏的CSS逻辑中的一些奇怪的样式(比如隐藏的溢出)。
你可以使用Calc(100% 100px)在流体的元素,以及一个显示:内联块的两个元素。
在意识到我不应该是任何空间之间的标签,否则你将不得不认为,空间在你的钙。
1 2 3 4 5 6 7 8
| .left{
display:inline-block;
width:100px;
}
.right{
display:inline-block;
width:calc(100% - 100px);
} |
快速的例子:http:/ / / 1 / / dw689mt4 jsfiddle.net
当你放弃的内嵌块
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| .post-container {
border: 5px solid #333;
overflow:auto;
}
.post-thumb {
float: left;
display:block;
background:#ccc;
width:200px;
height:200px;
}
.post-content{
display:block;
overflow:hidden;
} |
jsfiddle.net http:/ / / / / 3 rxrvz
(从CSS浮动:浮动图像到左的文本)
如果你不能使用overflow: hidden(因为你不想overflow: hidden)或如果你喜欢CSS Hacks /变通方法,你可以使用JavaScript而不是。注意,它可能需要做的工作,因为它的JavaScript。
1 2 3 4 5 6 7
| var parent = document.getElementsByClassName("lineContainer")[0];
var left = document.getElementsByClassName("left")[0];
var right = document.getElementsByClassName("right")[0];
right.style.width = (parent.offsetWidth - left.offsetWidth) +"px";
window.onresize = function() {
right.style.width = (parent.offsetWidth - left.offsetWidth) +"px";
} |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| .lineContainer {
width: 100% border: 1px solid #000;
font-size: 0px;
/* You need to do this because inline block puts an invisible space between them and they won't fit on the same line */
}
.lineContainer div {
height: 10px;
display: inline-block;
}
.left {
width: 100px;
background: red
}
.right {
background: blue
} |
jsfiddle.net http:/ / / / ys2eogxm