我有一个包含四个div的容器(宽度未知),如下所示:
| Div1 | Div2 ............... | .............. Div3 | Div4 |
最左边和最右边的div(Div1 / Div4)是固定宽度;这很容易。
Div2 / Div3的宽度是未知的,我想避免为它们设置一个固定的宽度,因为根据内容可以比另一个宽得多(所以我不能只是让每个人使用50可用空间的百分比)
我希望浏览器自动计算Div2 / Div3的宽度,然后如果剩下剩余空间,它们应该伸展以填充任何剩余空间(Div2之间的剩余空间如何分开并不重要/ DIV3)
我现在接近这个的方式是:
我的问题是,如何让Div2和Div3拉伸以填充剩余的可用宽度?我猜一个选项是使用display:table,另一种可能是flex-box。还有其他选择吗?
更新:为了清晰而编辑。
更新2:请注意我不能假设Div2和Div3每个都应获得50%的可用空间。这在问题中明确说明,但不知何故,我不断得到基于这个假设的答案。
答案 0 :(得分:11)
我想出了3种不同的解决方案来获得合适的宽度:
表格单元格:
parent: {display: table}
childs: {display: table-cell}
Flex grid:
parent: {display: inline-flex}
childs: {flex-grow: 1}
盒装尺寸容器:
parent: {float: left}
container: {box-sizing: border-box; padding: 0 WIDTH}
childs: {width: 50%}
最后一个解决方案使用额外的html标记,并使用相对定位垂直对齐元素(意味着你必须有固定的高度)。
我建议你使用第一个解决方案,因为它与旧版浏览器更兼容,它实现起来很简单,效果很好。
答案 1 :(得分:6)
利用overflow:hidden
(或溢出:自动 - 只要溢出未设置为可见[默认])触发block formatting contexts
填充剩余宽度
(我假设div1和div4的固定宽度为100px)
<强> FIDDLE 强>
<div class="div1">DIV 1</div>
<div class="container">
<div class="div2">DIV 2</div>
<div class="div3">DIV 3</div>
</div>
<div class="div4">DIV 4</div>
html,body,div
{
height: 100%;
}
.div1 {
float:left;
width: 100px;
background: aqua;
}
.container
{
overflow: hidden;
padding-right: 100px;
box-sizing: border-box;
background: green;
}
.div2 {
background:yellow;
float:left;
}
.div3 {
background:brown;
overflow: hidden;
}
.div4 {
position: absolute;
right:0;
top:0;
background:pink;
width: 100px;
}
答案 2 :(得分:2)
这是一个使用display:table的解决方案,实际上没有使用table,tr,td等: (FIDDLE)
HTML
<div id="foo">
<div id="left"></div>
<div id="center1">asdfasdfasdf</div>
<div id="center2"> asdfasdlfkjasl;dkfjalsdjkf</div>
<div id="right"></div>
</div>
CSS
div {
border: solid 1px black ;
height: 20px;
}
#foo {
border: none;
display: table;
width: 100%;
}
#left, #right {width: 100px;}
#foo > div {
display: table-cell;
}
答案 3 :(得分:1)
您可以将Div2和Div3包装在父Div中,并将Div2和Div3的宽度设置为50%。
<div id="div1"> </div>
<div style="margin-left:*div1width*;margin-right:*div4width*;">
<div id="div2" style="width:50%"> </div>
<div id="div3" style="width:50%"> </div>
</div>
<div id="div4"> </div>
答案 4 :(得分:1)
calc(http://caniuse.com/#search=calc)方式:
#foo {
position: relative;
background-color: #ccc;
}
#foo:after {
content: "";
clear: both;
}
#foo > div {
width: calc(50% - 100px);
height: 100px;
float: left;
}
#foo > div:nth-child(1) {
width: 100px;
background-color: #f00;
}
#foo > div:nth-child(2) {
background-color: #0f0;
}
#foo > div:nth-child(3) {
background-color: #00f;
}
#foo > div:nth-child(4) {
width: 100px;
background-color: #000;
}
http://jsfiddle.net/coma/YPWcW/
填充/位置方式:
#foo {
padding: 0 100px;
position: relative;
background-color: #ccc;
}
#foo:after {
content: "";
clear: both;
}
#foo > div {
width: 50%;
height: 100px;
float: left;
}
#foo > div:nth-child(1) {
width: 100px;
background-color: #f00;
float: none;
position: absolute;
top: 0;
left: 0;
}
#foo > div:nth-child(2) {
background-color: #0f0;
}
#foo > div:nth-child(3) {
background-color: #00f;
}
#foo > div:nth-child(4) {
width: 100px;
background-color: #000;
float: none;
position: absolute;
top: 0;
right: 0;
}
http://jsfiddle.net/coma/qqR4Z/
您可以使用min-width:
答案 5 :(得分:1)
我认为可以在css3中使用flex box模型
以下代码适用于IE10,chrome,firefox,safari
<div class="mainbox">
<div class="marpad marpadout">
div1
</div>
<div class="subbox marpad">
div2
</div>
<div class="subbox marpad">
div3
</div>
<div class="marpad marpadout">
div4
</div>
</div>
样式是:
.mainbox{
width:100%;
display:-moz-box;
display:-webkit-box;
display:-ms-flexbox;
display:box;
background:#ff0000;
}
.subbox{
-moz-box-flex:1;
-webkit-box-flex:1;
-ms-flex:1;
box-flex:1;
}
.marpad{
margin:5px;
padding: 0 10px 10px 0;
background:#ccc;
}
.marpadout{
width:100px;
}
答案 6 :(得分:0)
我的解决方案借鉴了已发布的其他内容,但通过测试它们,我发现两个中心div中的内容搞乱了宽度分布 ......它们会保留相同的宽度,只要它们具有完全相同的内容,但只要有更多的内容就会不均匀地宽。
所以在我的解决方案中,我使用jQuery将残余宽度分配给两个中央div,使其宽度均匀,无论内容上的差异。
Bonus #1:
jQuery不需要知道左右div的宽度 显式 ,因为它获取通过CSS定义的任何宽度。
Bonus #2:
轻松指定中心div的数量,并在所有中心div中平均分配剩余宽度。只需更改剩余宽度除以的数字。
Here is a fiddle。下面是简化中提供的解决方案。 当内容进入中央div 时,小提琴更详细地显示了其他解决方案的缺陷。
<style>
div { margin: 5px; padding: 5px; }
.js-container { border: 1px solid red; display: table; }
.with-width { width: 80%; }
.js-child { border: 1px solid gray; display: table-cell; }
.left,
.right { width: 100px; }
</style>
<h3>Using javascript to dynamically distribute the remaining width</h3>
<div class="js-container with-width">
<div class="js-child left">left</div>
<div class="js-child center">center</div>
<div class="js-child center">center</div>
<div class="js-child right">right</div>
</div>
<div class="js-container with-width">
<div class="js-child left">left</div>
<div class="js-child center">center left <em>doesn't get wider</em> because of extra content</div>
<div class="js-child center">center right</div>
<div class="js-child right">right</div>
</div>
<script>
$(document).ready(function() {
function containerWidth() {
var w = parseInt($('.js-container').outerWidth(), 10);
return w;
}
// console.log('containerWidth: ' + containerWidth());
function outerChildrenWidth() {
var wl = parseInt($('.js-container').find('.left').outerWidth(), 10);
var wr = parseInt($('.js-container').find('.right').outerWidth(), 10);
return wl + wr; // bonus #1
}
// console.log('outerChildrenWidth: ' + outerChildrenWidth());
function centerChildWidth() {
var w = (containerWidth() - outerChildrenWidth()) / 2; // bonus #2
return w;
}
// console.log('centerChildWidth: ' + centerChildWidth());
function setCenterChildWidth() {
$('.js-container').find('.center').css('width', centerChildWidth() + 'px');
}
setCenterChildWidth();
});
</script>
请注意,某些类的js-
前缀是存在的,因为我用它将受javascript影响的标记与“普通”标记分开。我还保留了控制台日志,以防你想调试。
答案 7 :(得分:-1)
如果你知道DIV1和DIV4的宽度,那么试着找到宽度 另外两个div在%.try中给出DIV2和DIV3.IT的宽度% 工作