CSS HTML - DIV高度填充剩余空间

20

所以我的布局如下:

div {
  border: 1px solid
}
<div id="col_1" style="float:left;width:150px;">1</div>
<div id="col_2" style="float:left;width:100px;">2</div>
<div id="col_3" style="float:left;width:<REMAINING_WIDTH>;">3</div>

col_1和col_2占据了固定的空间,我希望第三列占据剩余的空间。如何最好地实现这个目标?


谢谢,我会尽力回答所有问题。 - Andy Hin
你刚才不是在问高度而不是宽度吗? - danielrvt
9个回答

28

你可以尝试一些疯狂的做法,放弃使用 JavaScript 和不太成熟的 CSS3 技术,使用绝对定位。

参见这个 jsfiddle。 同时,如果能在浏览器缩放时表现良好,则会得到额外加分。

#col_1 {
  position: absolute;
  top: 0px;
  bottom: 0px;
  width: 100px;
  background-color: #eee;
}
#col_2 {
  position: absolute;
  top: 0px;
  bottom: 0px;
  width: 150px;
  left: 100px;
  background-color: #ccd;
}
#col_3 {
  position: absolute;
  top: 0px;
  bottom: 0px;
  left: 250px;
  right: 0px;
  background-color: #cdc;
}
<div id='col_1'>Column 1</div>
<div id='col_2'>Column 2</div>
<div id='col_3'>
  Column 3
</div>


你测试过你的例子吗?我没有看到col3填充剩余的空间。http://jsfiddle.net/Hb6rL/8/ - Pinkie
JSFiddle已更新。只需在第3列添加“right: 0px;”。 - FMM
4
这是正确的答案,应该被接受。在基础布局中使用JavaScript是一种糟糕的形式。 - Coderer

9

需要使用Javascript。如果您想让所有3个div填满窗口空间(100%),那么我们需要使用javascript来检测剩余的空间并相应地分配col_3的高度。使用jQuery可以这样做:

var one = $('#col_1').height(),
two = $('#col_2').height(), 
remaining_height = parseInt($(window).height() - one - two); 
$('#col_3').height(remaining_height); 

这个基本上是有效的。由于宽度不包括填充/边距等,因此需要添加一些缓冲空间。 - Andy Hin
2
如果您希望使用边距和填充来解决问题,请使用.outerHeight()函数。 - rickyduck
2
有一种方法可以不使用JavaScript来实现;请查看下面的答案。 - FMM
@FMM 您的答案不再下面了 ;) - Savas Vedova

4

1
小心使用flexbox,它可能不像你想象的那样工作,有一个新的草案改变了它们的工作方式,使其更加直观。 - robertc
我并不是在谴责你的建议,但是把浮点数描述为“hack”是否有些过分了?特别是考虑到flexbox(不幸的)缺乏支持。 - verism
现在,除非你必须支持非常老的浏览器,否则Flexbox是最好的选择。 - anthonynorton

2
您需要一个块级格式化上下文:
#c1,#c2 {
    background-color: red;
    float: left;
    width: 200px;
}
#c2 {
    background-color: green;
}
#c3 {
    background-color: yellow;
    height: 40px;
    overflow: auto;
}

正是溢出使其发挥作用。更多信息:http://www.w3.org/TR/CSS2/visuren.html#block-formatting


2

这是我关于仅使用CSS的一些想法。我已在Firefox 12、Google Chrome 18、Safari 5.1和IE 7、8、9以及9CV中进行了测试。

.Clearfix:after {
  content: ".";
  display: block;
  clear: both;
  visibility: hidden;
  line-height: 0;
  height: 0;
}
.Clearfix {
  display: inline-block;
}
html[xmlns] .Clearfix {
  display: block;
}
* html .Clearfix {
  height: 1%;
}
#Wrapper {
  background-color: #FC20C9;
}
#col_1 {
  float: left;
  width: 150px;
  background-color: #FF0000;
}
#col_2 {
  float: left;
  width: 100px;
  background-color: #00CC00;
}
#col_3 {
  width: auto;
  float: none;
  background-color: #0066FF;
  overflow: hidden;
}
<div id="Wrapper" class="Clearfix">
  <div id="col_1">Lorem ipsum</div>
  <div id="col_2">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</div>
  <div id="col_3">Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure
    dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</div>
</div>
enter code here


0

可以使用jQuery计算剩余空间,也可以使用CSS3的弹性盒子填充剩余空间:

http://www.html5rocks.com/tutorials/flexbox/quick/

diagram2 是你想要的情况 - 具有最大“box-flex”的最后一个框将占用剩余空间(默认 box-flex 为 0)


0
如果你的目标是最新版本的浏览器,你可以使用HTML5的calc 函数。

#col_3 {
  width: calc(100%-(100px+150px));
}
#red {
  border: 1px solid goldenrod;
}
div {
  border: 1px solid;
}
<div id="red">
  <div id="col_1" style="width:150px; float:left;">1</div>
  <div id="col_2" style="width:100px; float:left;">2</div>
  <div id="col_3">3</div>
</div>


-1

去掉宽度,它应该扩展到填满整个区域。如果需要,可以设置宽度为100%。你应该尝试使用火狐浏览器的Firebug插件。


1
这在Firefox中不起作用(div元素移到下一行)。Firebug怎样帮助我解决这个问题? - Andy Hin
那样行不通。100% 只会使其宽度与父元素相同,显然这不是预期的结果。 - Renan

-1
将三个 div 放入一个容器中,给第一和第二列固定宽度,将第三列设置为自动。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接