【发布时间】:2013-09-04 11:34:36
【问题描述】:
我有一个包含子框的div(或section,或其他块级元素)。
<section>
<div>Box 1</div>
<div>Box 2</div>
<div>Box 3</div>
<div>Box 4</div>
<div>Box 5</div>
<div>Box 6</div>
<div>Box 7</div>
<div>Box 8</div>
<div>Box 9</div>
<div>Box 10</div>
</section>
每个子框都有一个最小宽度(例如 150 像素)并且它们都向左浮动。因此,如果父容器为 [450, 600) px 宽,则连续 3 个,类似地,如果父容器为 [600, 750) px 宽,则为 4 个,依此类推。
section {
min-width: 150px;
font-family: 'Segoe UI', Ubuntu, sans-serif;
}
div {
min-width: 150px;
height: 150px;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
float: left;
margin: 0 3px 3px 0;
padding: 3px;
background-color: lightblue;
border: 1px solid #000;
}
见jsFiddle。
如果父框在子框宽度的倍数之间,我该如何做到这一点,子框填充父框的宽度。因此,例如,如果父框是 660px 宽,那么每个子框将是 660px/4 或 165px 宽。 我还要提一下,如果父框的宽度发生变化,子框也应该随之改变。
在我的具体情况下,我可以使用媒体查询来执行此操作,因为 幸运的是父框取决于视口宽度,但我正在寻找通用解决方案,因为可能还有其他地方父框是真正可变的。此外,必须将每个案例都放入带有 width 和 max-width 的媒体查询中变得乏味。
我的兼容性要求是现代浏览器(IE 10+、Firefox、Chrome、Safari)。我不介意使用一点 JavaScript/jQuery,但它应该在 IE 9 中正常降级。不支持 IE 8,所以这不是问题。
我已经研究过使用 flexbox,但不幸的是 Firefox 目前只支持单行 flexbox,所以当我尝试它时,子 flex 项目会挤压并溢出 flex 容器。
编辑:
我根据 Siddhartha Gupta 在下面的回答开始使用 JavaScript,但是在某些地方似乎存在一个奇怪的错误,即行没有填满整个空间。 (如果没有足够的子元素,所有行都应该 100% 填充,最后一行除外。)
$(window).resize(function () {
var sectionWidth = $('section').width(),
childWidth = (sectionWidth / Math.floor(sectionWidth/150)) - 3;
$('section').children().css({
'width': childWidth + 'px'
});
});
【问题讨论】:
标签: css user-interface css-float fluid-layout