【问题标题】:Fill parent div with multiple child divs by adjusting margins通过调整边距用多个子 div 填充父 div
【发布时间】:2012-09-27 10:14:17
【问题描述】:

我有什么:

父 div .parent 将整个窗口 width=100% 作为宽度,但有一定的最小宽度,例如 min-width=800px

现在我有大约 20 个 .child div,假设使用宽度为 width=300px,未定义高度,margin:20pxdisplay:inline-block

现在的问题是,例如较小的屏幕每行将显示两个 div,但它们将不再居中,因为它们的邻居掉到了下一行。

我在孩子身上尝试了float:centermargin:5px auto 5px auto;,但浮动似乎根本不起作用,边距只会导致 0 边距

所以我想要的是:

将所有子 div 水平居中在父级中,同时仍在使用例如通过调整它们之间的边距,屏幕宽度的 80%。第 2 部分更多是可选的

现在的样子(当然不工作)

HTML

<div class="buttons">
    <div class="host 1">&nbsp;</div>
    <div class="host 2">&nbsp;</div>
    <div class="host 3">&nbsp;</div>
    <div class="host 4">&nbsp;</div>
    <div class="host 5">&nbsp;</div>
    ...
</div>

CSS

.buttons {
    position:relative;
    width:100%;
    margin:50px 0 0 0;
    padding:0;
}
.host {
    display:inline-block;
    padding:0;
    margin:20px 20px 5px 20px;
    height:20px;
    width:300px;
    float:center;
}

【问题讨论】:

  • 你能发布一些代码吗?理想情况下只是一个相关的 css & html 的 sn-p。甚至更好的 jsfiddle 来说明这个问题。 ta!
  • 请提供一些代码,反正float:center不存在,你有没有在容器中试过text-align:center
  • @GionaF 很快 :D 。让它成为一个答案,我会接受它,因为它正在工作

标签: css html css-float margin


【解决方案1】:

要将它们水平居中,请将text-align:center; 添加到父级:

.buttons {
    position:relative;
    width:100%;
    margin:50px 0 0 0;
    padding:0;
    text-align:center;
}

Demo


四周边距相等

可能有数百种更好的方法可以做到这一点,但是 ...这是我在星期六慵懒的下午 :)

Demo(调整窗口大小)

(与上面相同的html和css)

var hosts = $('.host');
var buttons= $('.buttons');
$(window).on('load resize',function(){
    var w = buttons.width();
    /* how many .host in one row ? */
    var oneRow = Math.floor(w/300);
    /* let's go! */
    if(oneRow>1){
        /* send hosts to the margin calculation function */
        calcMargins(hosts,w,oneRow);
        /* do we have some orphans?! */
        var orphans = hosts.length%oneRow;
        if(orphans!=0){
            /* let's do the same for them */
           var orphansEl = hosts.slice(-orphans);
           calcMargins(orphansEl,w,orphans);
       }
    }else{
        /* there's only one div per row, so
            we reset everything */
        hosts.css({'margin-left':'auto','margin-right':'auto','float':'none'});
    }
});

/* here's the function */
function calcMargins(els,l,r){
    /* total blank space */
    var tSpace = l - (r*300);
    /* we'll add a right margin for each .host and
         a margin-left for the first of each row */
    var nElements = r + 1; 
    /* it's better to leave some pixels behind
        than cause a line wrap, so we'll floor the division */
   var rightMargin = Math.floor(tSpace/nElements);
   /* finally, we set the margins */
   els.each(function(i){
       if(i%r == 0){
           /* left margin for first .host of each row */
           leftMargin = rightMargin;
       }else{
           /* left margin for the rest */
           leftMargin = 0;
       }
       /* here we go */
       $(this).css({'float':'left','margin-left':leftMargin,'margin-right':rightMargin});
    });
}​

显然,为了清楚起见,它是这样写的,但您可以将其简化为:

var hosts = $('.host'), buttons= $('.buttons');
$(window).on('load resize',function(){
    var w = buttons.width(), oneRow = Math.floor(w/300);
    if(oneRow>1){
        calcMargins(hosts,w,oneRow);
        var orphans = hosts.length%oneRow;
        if(orphans!=0) calcMargins(hosts.slice(-orphans),w,orphans);
    }else{
        hosts.css({'margin-left':'auto','margin-right':'auto','float':'none'});
    }
});
function calcMargins(els,l,r){
   var rightMargin = Math.floor((l-(r*300))/(r+1));
   els.each(function(i){
       leftMargin = (i%r == 0) ? rightMargin : 0;
       $(this).css({'float':'left','margin-left':leftMargin,'margin-right':rightMargin});
    });
}​

如果您不希望“孤儿”居中,这里有一个更小的版本:

var hosts = $('.host'), buttons= $('.buttons');
$(window).on('load resize',function(){
    var l = buttons.width(), r = Math.floor(l/300);
    if(r>1){
       var rightMargin = Math.floor((l-(r*300))/(r+1));
       hosts.each(function(i){
           leftMargin = (i%r == 0) ? rightMargin : 0;
           $(this).css({'float':'left','margin-left':leftMargin,'margin-right':rightMargin});
        });
    }else{
        hosts.css({'margin-left':'auto','margin-right':'auto','float':'none'});
    }
});

...带有 demo


如果有人有更短的解决方案,我很乐意学习 :)

【讨论】:

  • 再次感谢。任何想法如何给 .host 某种可变边距给另一个 .host ,但不会变得小于例如10px ?
  • 嗯,没有min-/max- margin @Wurstbro :( 但如果你向我解释你想要达到的目标,我可以尝试找到解决方法。
  • 如果我打开你的小提琴,前两行各有两个 div,最后一行有一个。我想要做的是使第一行中的两个 div 彼此之间的距离相同,就像它们到窗口的边框一样。
  • 不是那么容易@Wurstbro :) 你已经在你的项目中使用 jQuery 了吗?也许我可以找到一个js解决方案。
  • 好的 @Wurstbro ,如果你想尝试一下,我在这里做了一个快速编辑:jsfiddle.net/gionaf/Vjeyz 在每一行之后添加一个 clearfix。无论如何,把网址pm我(你能PM吗?!不知道!)
猜你喜欢
  • 2011-04-17
  • 1970-01-01
  • 2014-03-24
  • 2013-01-19
  • 2018-11-05
  • 2021-05-07
  • 2012-02-14
  • 2012-12-01
  • 1970-01-01
相关资源
最近更新 更多