展开div以获取剩余宽度

Anu*_*yal 518 html css multiple-columns

我想要一个双列div布局,其中每个都可以有可变宽度,例如

div {
    float: left;
}
.second {
    background: #ccc;
}
Run Code Online (Sandbox Code Playgroud)
<div>Tree</div>
<div class="second">View</div>
Run Code Online (Sandbox Code Playgroud)

我希望'view'dec扩展到'tree'div填充所需空间后可用的整个宽度.目前我的'view'div被调整为它包含的内容.如果两个div占据整个高度也会很好

不重复免责声明:

当float:left设置时,将div扩展到max width, 因为左边的一个具有固定的宽度.

帮助div - 使div适合剩余的宽度, 因为我需要两个向左对齐的列

Xan*_*hir 988

这个问题的解决其实很容易,但不是在所有明显.您必须触发称为"块格式化上下文"(BFC)的东西,它以特定方式与浮点交互.

只需要取第二个div,移除浮子,然后再给它overflow:hidden.除可见之外的任何溢出值都会使其设置的块成为BFC.BFC不允许后代漂浮物逃脱它们,它们也不允许兄弟/祖先漂浮物侵入它们.这里的净效果是浮动的div将完成它的事情,然后第二个div将是一个普通的块,占用除浮点占用的所有可用宽度.

这应该适用于所有当前浏览器,但您可能必须在IE6和7中触发hasLayout.我不记得了.

演示:

  • 这篇文章有一个很好的解释:http://colinaarts.com/articles/the-magic-of-overflow-hidden/ (50认同)
  • 很好的答案!但是当你说"除汽车之外的任何溢出值"将使它成为BFC时,你错了.你的意思是除了*default*(可见)以外的任何溢出值都会使它成为BFC.事实上,溢出自动也完美地工作 - 这就是我推荐的(以防万一你有相对定位的元素,可能会偷看那个div). (27认同)
  • 值得注意的是,孩子们的秩序很重要.具有固定宽度的浮动元件必须高于另一个.花了我太长时间才弄明白,为什么切换顺序对我没用. (10认同)
  • 如果内容大到足以溢出 div 怎么办? (2认同)
  • 不正确。如果没有“溢出”(或触发 BFC 的其他方式),可变长度 div 将不会“避免”另一个 div。它的*文本*将避免浮动的div,但它的背景/边框/等将包含它们,这可能不是我们想要的。 (2认同)
  • 我写了一个答案,解释为什么所有事物的不可见溢出触发BFC,基于David和Boris给出的响应,可以在这里找到:http://stackoverflow.com/questions/9943503/why-does-css2 -1-define-overflow-values-other-than-visible-to-new-a-b/11854515#11854515我的解释是否正确? (2认同)

B T*_*B T 92

我刚刚发现了弹性盒子的魔力(显示:flex).试试这个:

<style>
  #box {
    display: flex;
  }
  #b {
    flex-grow: 100;
    border: 1px solid green;
  }
</style>
<div id='box'>
 <div id='a'>Tree</div>
 <div id='b'>View</div>
</div>
Run Code Online (Sandbox Code Playgroud)

Flex盒子给了我我希望css拥有15年的控制权.它终于来了!更多信息:https://css-tricks.com/snippets/css/a-guide-to-flexbox/

  • @YevgeniyAfanasyev没有特别的原因,除了那就是我喜欢这样做的方式。它使我能够以百分比的方式思考,因此,如果我可以将#a设置为“ flex-grow:10”,然后将#b设置为“ flex-grow:90”,那么#a将是百分比的10%线的宽度和#b将是线的宽度的90%。如果没有其他元素具有可弯曲宽度样式,那么从技术上讲,您放置什么都没有关系。 (2认同)

cle*_*tus 27

这将是一个很好的例子,可以解决表格问题,并且很难(至少在跨浏览器的意义上,如果不是不可能的话)使用CSS.

如果两列都是固定宽度,这将很容易.

如果其中一列是固定宽度,这将稍微困难但完全可行.

两列可变宽度,恕我直言,你需要使用两列表.

  • 在响应式设计中,表格不是很好,您希望右侧列在小型设备的左下方滑动. (11认同)

小智 22

检查此解决方案

.container {
  width: 100%;
  height: 200px;
  background-color: green;
}
.sidebar {
  float: left;
  width: 200px;
  height: 200px;
  background-color: yellow;
}
.content {
  background-color: red;
  height: 200px;
  width: auto;
  margin-left: 200px;
}
.item {
  width: 25%;
  background-color: blue;
  float: left;
  color: white;
}
.clearfix {
  clear: both;
}
Run Code Online (Sandbox Code Playgroud)
<div class="container">
  <div class="clearfix"></div>
  <div class="sidebar">width: 200px</div>

  <div class="content">
    <div class="item">25%</div>
    <div class="item">25%</div>
    <div class="item">25%</div>
    <div class="item">25%</div>
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)

  • Per OP:"我想要一个双列div布局,每个布局都有可变宽度".在你的答案中,你必须知道第一列的宽度,所以它不是变量.您也可以在两列上设置固定宽度,然后浮动它们. (3认同)
  • 这通常是一种优越的解决方案,因为并不总是需要隐藏溢出. (2认同)

Reg*_*ham 17

Flexbox解决方案

html, body {
  height: 100%;
}
.wrapper {
  display: flex;
  height: 100%;
}
.second {
  flex-grow: 1;
}
Run Code Online (Sandbox Code Playgroud)
<div class="wrapper">
  <div style="background: #bef;">Tree</div>
  <div class="second" style="background: #faa;">View</div>
</div>
Run Code Online (Sandbox Code Playgroud)

注意:如果您的支持的浏览器需要,请添加flex供应商前缀.


小智 15

在这里,这可能有帮助......

<html>

<head>
  <style type="text/css">
    div.box {
      background: #EEE;
      height: 100px;
      width: 500px;
    }
    div.left {
      background: #999;
      float: left;
      height: 100%;
      width: auto;
    }
    div.right {
      background: #666;
      height: 100%;
    }
    div.clear {
      clear: both;
      height: 1px;
      overflow: hidden;
      font-size: 0pt;
      margin-top: -1px;
    }
  </style>
</head>

<body>
  <div class="box">
    <div class="left">Tree</div>
    <div class="right">View</div>
    <div class="clear" />
  </div>
</body>

</html>
Run Code Online (Sandbox Code Playgroud)


小智 14

用途calc:

.leftSide {
  float: left;
  width: 50px;
  background-color: green;
}
.rightSide {
  float: left;
  width: calc(100% - 50px);
  background-color: red;
}
Run Code Online (Sandbox Code Playgroud)
<div style="width:200px">
  <div class="leftSide">a</div>
  <div class="rightSide">b</div>
</div>
Run Code Online (Sandbox Code Playgroud)

这个问题是必须明确定义所有宽度,或者作为值(px和em工作正常),或者作为显式定义的东西的百分比.


ani*_*nit 8

如果另一列的宽度是固定的,那么使用适用于所有常见浏览器calcCSS 功能如何:

width: calc(100% - 20px) /* 20px being the first column's width */
Run Code Online (Sandbox Code Playgroud)

这样,第二行的宽度将被计算(即剩余宽度)并响应应用。


小智 5

我不明白为什么人们愿意如此努力地为简单的柱状布局找到纯CSS解决方案,这些布局使用旧TABLE标签很容易.

所有浏览器仍然具有表格布局逻辑......或许叫我恐龙,但我说让它帮助你.

<table WIDTH=100% border=0 cellspacing=0 cellpadding=2>
  <tr>
    <td WIDTH="1" NOWRAP bgcolor="#E0E0E0">Tree</td>
    <td bgcolor="#F0F0F0">View</td>
  </tr>
</table>
Run Code Online (Sandbox Code Playgroud)

在跨浏览器兼容性方面风险也低得多.

  • 是的,但如果一切都是由css完成的,为什么不这样做,至少是好奇心如果可能的话? (2认同)
  • 这是因为如果您想在小型设备中使用“ media-queries”将两列都放在另一列上,那么使用旧的“ table”标签是不可能的。为了使它起作用,您需要应用`CSS`表样式。因此,在当今,如果您想要针对任何屏幕尺寸的自适应布局,最好使用CSS来解决。 (2认同)