CSS:固定宽度+动态宽度子元素,如何填满父元素100%宽度?

4

我有一个父级div(在图表中为“-”),其宽度我事先不知道。

我有两个子div(a和b):

b - 总是一个已知的固定宽度,并且应始终位于右侧

a - 应该填充剩余空间

-----------------------------------
- aaaaaaaaaaaaaaaaaaaaaaaaaa bbbb -
- a                        a b  b -
- aaaaaaaaaaaaaaaaaaaaaaaaaa bbbb -
-----------------------------------

这里有两个等高的元素 a 和 b。

我认为这个问题应该有一个简单的解决方案,但我还没有找到。我尝试过让它们都浮动起来,但其中一个会被推到下面。

有什么想法吗?


解决方案是否必须确保A和B具有相等的高度?还是它们已经具有相等的高度?或者这并不重要? - thirtydot
@thirtydot - 它们是相等且固定高度的(更新的问题) - UpTheCreek
经典的“简单解决方案”已经发布。一个带有float: rightdiv,另一个带有右侧div宽度相等的margin-right - thirtydot
6个回答

6
你正在寻找圣杯布局 :) 这篇文章有完整的示例和步骤,这里是摘要。
你的包装 div 需要有与你想要的静态宽度列相同的右填充。内部 div 左浮动,使用负边距将静态宽度列移入填充区域。
以下是教程中的标记。
<div id="container">
  <div id="center" class="column"></div>
  <div id="left" class="column"></div>
  <div id="right" class="column"></div>
</div>

和 CSS

#container {
  padding-left: 200px;   /* LC width */
  padding-right: 150px;  /* RC width */
}
#container .column {
  position: relative;
  float: left;
}
#center {
  width: 100%;
}
#left {
  width: 200px;          /* LC width */
  right: 200px;          /* LC width */
  margin-left: -100%;
}
#right {
  width: 150px;          /* RC width */
  margin-right: -150px;  /* RC width */
}

这个教程是一个两列的示例,但是如果你去掉左边的列,并从容器中删除左内边距,那么你就可以开始了。


我喜欢这个想法,但是似乎给包含的 div 添加 padding-right 只会扩展它,而不是限制子元素。 - UpTheCreek
右侧栏可能只需要微调CSS才能正确显示。我已经更新了我的答案,并添加了一些HTML以尝试解决问题。 - Paul Sheldrake

4

也许您可以像这样使用display:table属性 http://jsfiddle.net/sandeep/NCkL4/8/

HTML:

<div class="left"></div>
 <div class="right">fixed</div>

CSS:

#parent{
    overflow:hidden;
    background:yellow;
    position:relative;
    display:table;
}
.left{
    display:table-cell;
}
.right{
    background:red;
    width:50px;
    height:100%;
    display:table-cell;
}

但它不支持IE7。

或者你可以这样做:

HTML:

<div class="right">fixed</div>
<div class="left"></div>

CSS:

.right {float:right; width:200px; }
.left { background: green;}

请查看此链接

新的示例代码请参考此链接


嗯,有趣 - 浏览器支持如何? - UpTheCreek
你更新后的答案看起来很有前途 - 我会去尝试一下。谢谢。 - UpTheCreek
第一个不支持IE7及以下版本,但第二个支持所有浏览器。 - sandeep
第二个问题是,div a 扩展到 div b 的后面。我猜这是由于使用了 padding-right。我会尝试使用 margin-right。 - UpTheCreek
使用margin-right代替padding-right,请检查更新后的fiddle。 - sandeep

1
关于 display: flex 怎么样?
#parent{   
    background:yellow;  
    display:inline-flex;
}
.left{
    display:flex;
    flex: 1 1 auto;
}
.right{   
    display:flex;  
    background-color:red;
}

http://jsfiddle.net/NCkL4/1037/


1

谢谢 - 不过那是许多div! - UpTheCreek

0

这个使用浮动,而另一个优秀的答案使用定位。你可以选择哪种方法。每种方法都有其优点和缺点。

CSS

html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, font, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend, button,
table, caption, tbody, tfoot, thead, tr, th, td { margin: 0; padding: 0; border: 0; outline: 0; vertical-align: baseline; font-weight: inherit; font-style: inherit; font-size: 100%; font-family: inherit; }
body { font: normal 100%/1.5em "Helvetica Neue", Helvectica, Arial, sans-serif; color: #353E34; background: #FFF; text-align: left; }
html>body { font-size: 16px; }
.content-wrapper { width: 100%; float: left; }
.content { margin-right: 220px; background: #9CC; }
.sidebar { float: right; width: 200px; margin-left: -200px; background: #FDE95E; }
.inner { margin: 10px; }
.footer { clear: left; width: 100%; background: black; color: #FFF; text-align: center; padding: 4px 0; }

HTML

<div class="content-wrapper">
  <div class="content">
    <div class="inner">
      <p>Content</p>
    </div>
  </div>
</div>
  <div class="sidebar">
    <div class="inner">
      <p>Sidebar</p>
    </div>
  </div>
  <div class="footer">
    <p>Footer</p>
  </div>

0

这是一种干净且非常可接受的方式。利用浮动的工作原理,使用了清除浮动技巧,但是为了清除浮动,您还可以在容器结束标签之前添加一个带有clear:right的额外div。

http://jsfiddle.net/sg3s/sSJvT/


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