如何使用CSS在柔性宽度设计中设置自动边距框?

时间:2011-08-12 14:53:58

标签: html css fluid-layout

我有灵活宽度设置的DIV,例如最小宽度:800px和最大宽度:1400px。在这个DIV中,有许多框的固定宽度为200px并且显示:内联块。因此,根据父DIV宽度,这些框填充整个空间。

我的问题是右侧的空白区域是由父div的可变宽度引起的。有时这个空白区域很小并且看起来很好,但是父div的宽度不同,这个空白区域几乎是200px。

我不知道,如果我详细描述了我的问题,我希望这张照片有助于描述我的实际情况:

enter image description here

这就是我想要的:

enter image description here

使用TABLE可以轻松实现此自动边距。但是,我不知道确切的列数,因为它取决于用户的屏幕分辨率。所以我不能使用表而是坚持使用CSS。

任何人都知道如何解决这个问题?提前感谢您的意见和解答。

编辑:我不需要IE6的支持。我想支持IE7,但IE7是可选的,因为我知道有限制所以我可能会在IE7中使用固定宽度的“div.wrapper”

EDIT2 我需要处理这些框的多行,因此它们不会超过“div.wrapper”框并在多行框中正确包装,而不只是在一条长行中。

EDIT3 我不知道“列”的数量,因为这取决于用户的屏幕分辨率。所以在大屏幕上可以有一排7个盒子,而在小屏幕上,一排可能只有4个盒子。所以我需要的解决方案不会在一行中设置固定数量的方框。相反,当盒子不适合一行时,它们应该只包裹到下一行。

8 个答案:

答案 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>

演示:http://jsfiddle.net/2avwf/

为了小提琴窗口,我没有让它们宽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
});

像这样:http://jsfiddle.net/RcDky/

答案 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;
}

缺点:边距不是自动设置的......

DEMO:http://jsfiddle.net/hexagon13/2avwf/52/

答案 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 */
}