我有灵活宽度设置的DIV,例如最小宽度:800px和最大宽度:1400px。在这个DIV中,有许多框的固定宽度为200px并且显示:内联块。因此,根据父DIV宽度,这些框填充整个空间。
我的问题是右侧的空白区域是由父div的可变宽度引起的。有时这个空白区域很小并且看起来很好,但是父div的宽度不同,这个空白区域几乎是200px。
我不知道,如果我详细描述了我的问题,我希望这张照片有助于描述我的实际情况:
这就是我想要的:
使用TABLE可以轻松实现此自动边距。但是,我不知道确切的列数,因为它取决于用户的屏幕分辨率。所以我不能使用表而是坚持使用CSS。
任何人都知道如何解决这个问题?提前感谢您的意见和解答。
编辑:我不需要IE6的支持。我想支持IE7,但IE7是可选的,因为我知道有限制所以我可能会在IE7中使用固定宽度的“div.wrapper”
EDIT2 我需要处理这些框的多行,因此它们不会超过“div.wrapper”框并在多行框中正确包装,而不只是在一条长行中。
EDIT3 我不知道“列”的数量,因为这取决于用户的屏幕分辨率。所以在大屏幕上可以有一排7个盒子,而在小屏幕上,一排可能只有4个盒子。所以我需要的解决方案不会在一行中设置固定数量的方框。相反,当盒子不适合一行时,它们应该只包裹到下一行。
答案 0 :(得分:5)
这与IE7兼容的CSS可以得到:http://jsfiddle.net/thirtydot/79mFr/
如果这仍然不对,那么现在是时候看看使用JavaScript了,希望也是jQuery。如果你正确地定义了你的要求,那么使用JavaScript来完善它应该是微不足道的。
<强> HTML:强>
<div id="container">
<div></div>
<div></div>
..
<span class="stretch"></span>
</div>
<强> CSS:强>
#container {
border: 2px dashed #444;
text-align: justify;
-ms-text-justify: distribute-all-lines;
text-justify: distribute-all-lines;
min-width: 800px;
max-width: 1400px
}
#container > div {
margin-top: 16px;
border: 1px dashed #f0f;
width: 200px;
height: 200px;
vertical-align: top;
display: inline-block;
*display: inline;
zoom: 1
}
.stretch {
width: 100%;
display: inline-block;
font-size: 0;
line-height: 0
}
额外的span
(.stretch
)可以替换为:after
。
此仍可在上述解决方案的所有浏览器中使用。 :after
在IE6 / 7中不起作用,但无论如何它们都在使用distribute-all-lines
,所以没关系。
请参阅: http://jsfiddle.net/thirtydot/79mFr/2/
:after
有一个小缺点:要使最后一行在Safari中完美运行,你必须小心HTML中的空格。
具体来说,这不起作用:
<div id="container">
<div></div>
<div></div>
</div>
这样做:
<div id="container">
<div></div>
<div></div></div>
答案 1 :(得分:1)
你可以浮动它们,只需将一个包装器应用到.box
,这样就可以margin:auto;
相对于浮动包装器.box
。
CSS:
div.wrapper {
width:100%;
border:3px solid red;
}
div.clear {
clear:both;
}
div.box-wrapper {
float:left;
margin:10px 0;
height:100px;
width:20%;
}
div.box {
border:1px solid black;
width:80px;
height:100px;
margin:auto;
}
HTML:
<div class="wrapper">
<div class="box-wrapper"><div class="box"></div></div>
<div class="box-wrapper"><div class="box"></div></div>
<div class="box-wrapper"><div class="box"></div></div>
<div class="box-wrapper"><div class="box"></div></div>
<div class="box-wrapper"><div class="box"></div></div>
<div class="box-wrapper"><div class="box"></div></div>
<div class="box-wrapper"><div class="box"></div></div>
<div class="box-wrapper"><div class="box"></div></div>
<div class="box-wrapper"><div class="box"></div></div>
<div class="box-wrapper"><div class="box"></div></div>
<div class="clear"></div>
</div>
为了小提琴窗口,我没有让它们宽200px。只需将width:80px
与您想要的宽度交换。
如果你想让它成为一个动态解决方案,其中一行中的盒子数量会根据用户的屏幕尺寸等因用户而异,只需制作3个或4个宽度定义的盒子包装类:
.box-wrapper-25 {
width:25%;
}
.box-wrapper-33 {
width:33%;
}
然后使用JQuery,您可以轻松检测.wrapper
的宽度,并为包装器分配覆盖类:
$('.box-wrapper').each(function(){
$(this).removeClass().addClass('box-wrapper box-wrapper-25'); // only need 4 per row
});
答案 2 :(得分:1)
您需要制作.box
内联块,并在.wrapper
中对文本进行调整。需要.wraper:after
来证明最后一行的合理性。较旧的IE浏览器不理解after
,但在IE text-align-last:center
中将处理最后一行。
.wrapper{
text-align:justify;
max-width:1400px;
min-width:800px;
text-align-last:center;
}
.wrapper:after{
content:'';
display:inline-block;
width:100%;
height:0;
font-size:0;
line-height:0;
}
.box{
display:inline-block;
*display:inline;
vertical-align:top;
width:200px;
height:50px;
background:red;
}
这是jsfiddle。
答案 3 :(得分:0)
试试这个jsFiddle:http://jsfiddle.net/MKuxm/
只需使窗口越来越大以调整div的大小,您将看到红色框之间的边距将相应调整。我知道红色框不再是200px宽,但我担心纯css是不可能的,因为你不应该混合百分比宽度和固定像素宽度。
HTML
<div>
<span>TEXT</span>
<span>TEXT</span>
<span>TEXT</span>
<span>TEXT</span>
</div>
CSS
div {
width: 95%;
}
span {
float: left;
background: red;
width: 20%;
margin-left: 2.5%;
margin-right: 2.5%;
}
答案 4 :(得分:0)
我回答了类似的问题here
使用media queries
和css calc()
例程在纯css3中可以实现这一点。
粗略的这只适用于现代浏览器。 IE9 +,浏览器,Firefox,
请参阅此WORKING DEMO
基本思想是为每个#columns状态设置一个媒体查询,然后我使用calc()来计算每个元素的边距(除了最后一列中的那些)。
答案 5 :(得分:0)
在我的项目中,我遇到了同样的问题,我接下来的决定 - 对我来说最好的方法是使用js,在我的情况下,如果有足够的空间,你可以在容器内有xxx块数在第1行中,第2行的块上升到第1行,依此类推。 这是一个例子http://jsfiddle.net/gVAjN/11/
$(function() {
// Call function when DOM is ready
settingsAlignment();
$(window).resize(function() {
// Call function on window resize
settingsAlignment();
})
$('#new_div').click(function() {
box_number = $('.element').size();
box_add = box_number + 1;
$('.container').append($('<div class="element">Box'+ box_add + '</div>'))
settingsAlignment();
})
function settingsAlignment() {
// calculation of ul's padding-left and li's margin-right
var settingsUl = $('.container');
settingsLi = $('.element');
ul_width = settingsUl.outerWidth(true);
item_width = settingsLi.width();
min_gap = 7;
effective_item_width = item_width + min_gap;
items_in_row = Math.floor((ul_width - min_gap) / effective_item_width);
gaps_sum = ul_width - items_in_row * item_width;
new_gaps = gaps_sum / (items_in_row + 1);
item_margin = Math.floor(new_gaps);
row_width = (item_width + item_margin) * items_in_row - item_margin;
console.log(row_width + '= row_width');
console.log(ul_width + '= ul_width');
ul_left_padding = Math.ceil((ul_width - row_width) / 2);
console.log(ul_left_padding + '=ul_left_padding');
settingsUl.css('padding-left', ul_left_padding + 'px');
settingsLi.css('margin-right', item_margin + 'px');
console.log(settingsLi);
}
});
答案 6 :(得分:0)
相当古老,但值得尝试,因为多行和text-align:justify;在#container中,当最后一行具有较少的div时,会创建间隙。我希望一切都可以浮动。所以我的想法是使用2个包装器。
<div class="wrapper">
<div class="wrapper2">
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="clear"></div>
</div>
</div>
以及溢出:隐藏;在css
.wrapper {
width:620px;
border:3px solid red;
margin:0 auto; overflow:hidden;
}
.wrapper2 {
width:630px;
}
div.clear {
clear:both;
}
.box {
width:200px; background:#000; height:100px; margin-bottom:10px; float:left; overflow:hidden; margin-right:10px;
}
缺点:边距不是自动设置的......
答案 7 :(得分:0)
试试这个:
div.wrapper {
display: flex;
align-items: stretch;
width: 100%;
height: 100%;
justify-content: space-between;
/* justify-content will give the auto margin you looking for
it will place the auto margin only between each div.box
make sure the div.wrapper has "display: flex;"
*/
}
div.box {
display: inline-flex; /* inline-flex will make the boxes all in the same line */
width: 200px; /* notice you don't need width to be a % for this to work */
height: 100%;
margin: auto; /* gives you the auto margin for the first and last box from the border of your wrapper */
}