我有一个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>
每个子框都有一个最小宽度(例如 150px)并且它们都向左浮动。因此,如果父容器是[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。
如何做到这一点,如果父框在子框宽度的倍数之间,则子框填充父框的宽度。例如,如果父框的宽度为 660 像素,那么每个子框的宽度将是 660 像素/4 或 165 像素。我还应该提到,如果父框的宽度发生变化,子框也应该相应地改变。
在我的特定情况下,我可以使用媒体查询来执行此操作,因为幸运的是父框取决于视口宽度,但我正在寻找一个通用的解决方案,因为可能在其他地方父框是真正可变的。此外,必须将每个案例都放入带有width
and的媒体查询中也变得乏味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'
});
});