【问题标题】:Make a line of divs with borders and margins fill the width dynamically使一行带有边框和边距的 div 动态填充宽度
【发布时间】:2012-07-11 00:19:05
【问题描述】:

考虑以下代码:

CSS:

.output {
    margin-right:10px;
    border:1px solid #000;
}
.box{
    border-right:1px solid #000;
}
.first{
    border-left:1px solid #000;
}

HTML:

<div class="line">
    <div class="output">5</div>
    <div class="boxes">
        <div class="box first"><span>&nbsp;</span></div>
        <div class="box"><span>&nbsp;</span></div>
        <div class="box"><span>&nbsp;</span></div>
        <div class="box"><span>&nbsp;</span></div>
        <div class="box last"><span>&nbsp;</span></div>
    </div>
</div>

我希望 div 水平排列并填充 'line' div'(父级的空间),但动态例如我不想为每个框指定固定宽度,我只想让它们填满水平空间。

这个可以吗?

【问题讨论】:

  • "我希望 div 水平排列..." - 您指的是 .box 元素还是 .line 元素的直接后代(.output 和 .boxes)?为了清楚起见,请重新表述您的问题。
  • 输出和盒子应该并排放置。盒子将包含 2 个或更多“盒子”,我希望它们水平排列在一行中的输出旁边 - 希望这是有道理的
  • 所以上面应该看起来像 | 5 | | | | | | |
  • 我真的不知道你想做什么。你能说得清楚一点吗?或者您可以附上一些图片或示例吗?
  • 我只希望上面 html 中的所有内容都水平放置在一行上。我不能指定宽度,我需要它是流动的,因为“盒子”的数量是可变的。因此,例如,我不能将输出和框向左浮动并给每个框 20% 的宽度,因为我可能有 100 个框。

标签: html css fluid-layout


【解决方案1】:

一个简单的widely supported 方法是display: table。

见:http://jsfiddle.net/thirtydot/tPCwD/

请注意,您可以更改 .box 元素的数量,它仍然有效。

.line {
    border: 3px solid red;
    display: table;
    width: 100%;
}
.output {
    padding-right: 10px;
    display: table-cell;
    width: 1px; /* take the minimum amount of space */
    white-space: nowrap;
}
.output > span {
    border:1px solid #000;
}
.boxes {
    display: table;
    width: 100%;
    table-layout: fixed; /* to force equal width columns */
}
.box {
    border-right:1px solid #000;
    display: table-cell;
    background: #ccc;
}
.first {
    border-left:1px solid #000;
}

如果需要对 IE7 及更低版本的支持,您可以仅对这些浏览器使用 JavaScript(条件注释)。有一个.htc JavaScript polyfill available,但我不确定它在这种布局下的效果如何。或者,您可以只使用真正的&lt;table&gt;。

【讨论】:

  • 不!不是用于布局的表格! ;-)
  • 优秀的答案这正是我想要的谢谢!我有最后一个小问题,我需要将每个 div 包装在一个锚标记中以使其可点击,但是当我这样做时,它会破坏该 div 的宽度,有什么方法可以使这些 div 可点击?
  • 不客气。最快的解决方法是将div 元素更改为a 元素:jsfiddle.net/thirtydot/tPCwD/1。
  • 嗨,我肯定会接受它,只是想让它在我的代码上运行。是否有任何理由将锚点包裹在 div 周围使其不继承宽度?
  • 没关系,我搞定了,只是拼错了一些东西。非常感谢您的帮助,jsFiddle 示例完美运行!
【解决方案2】:

如果您只想用output 和boxes 填充水平空间,我会在output 上使用float:left。这样,它将根据需要占用尽可能多的空间,boxes 框将填满其余空间。

另一方面,如果您想让五个 box divs 填充其父代,只需给每个 width:20% 并设置 box-sizing:border-box 以考虑边界。在这种情况下,你必须让浏览器知道每个盒子之间的关系应该有多大,否则它怎么知道要扩展哪个盒子来填充空间?

5 boxes 的另一种选择是,如果您想走在“前沿”,请查看 flexbox specification。

【讨论】:

  • 嗨,gareth,我不能将宽度设置为 20%,因为我可能拥有的盒子数量可能从 2 到 100 不等,抱歉我应该在问题中提到这一点。当我将它们向左浮动时,我总是在右侧得到额外的空间,它们没有填充
  • 在这种情况下,flexbox 听起来正是您所需要的。不幸的是,它目前是实验性的,所以它不能在 IE 或 Opera 中运行,并且根据this page Firefox 和 Safari 目前只有部分支持。
  • 我也希望它得到广泛支持,而不是 CSS3 或 HTML5,谢谢!
  • @sam:你需要 IE7 支持吗?
猜你喜欢
  • 1970-01-01
  • 2012-11-07
  • 2013-05-10
  • 2012-04-08
  • 2012-11-19
  • 1970-01-01
  • 2012-06-13
  • 2011-04-17
相关资源
最近更新 更多