2016-03-06 126 views
1

在查看了几个现有问题并尝试了无数次组合后,我无法找到解决此特定居中问题的解决方案。CSS平铺嵌套div多行居中对齐问题

我有一个外部div,其中包含可变数量的div(使用AngularJS)。我有一些行,但在下一行,如果它包含比整行少的div,我需要这些div居中。 (扩展下面的例子中,如果有在第二行两盒,这两个盒一起应在三个框的上方居中)

该图像示出了该问题:

CSS Tile Div Multi-Row Centering Issue Illustration

我当前的代码是在这里:JSFiddle

的CSS:

.outerbox { 
 
    background-color: lightblue; 
 
    margin: 10px auto; 
 
    width: 350px; 
 
    position: relative; 
 
    text-align: center; 
 
} 
 

 
.box { 
 
    background-color: lightgreen; 
 
    border-style: solid; 
 
    border-color: black; 
 
    border-width: 1px; 
 
    margin: 2px; 
 
    height: 100px; 
 
    width: 100px; 
 
    display: inline-block; 
 
    float: left; 
 
}

...以及相关的HTML:

<div ng-if="show" class="outerbox" ng-repeat="box in boxes"> 
     <div class="box">{{box.name}}</div> 
    </div> 

回答

2

这里是一个工作fiddle.

  1. .box

  2. .outer-box摆脱float.outerbox-container内:

    <div class="outerbox-container"> 
        <div ng-if="show" class="outerbox" ng-repeat="box in boxes"> 
         <div class="box">{{box.name}}</div> 
        </div> 
    </div> 
    
  3. 更改相应的CSS:

    .outer-box { 
        display: inline-block; 
        width: 100px; //instead of 350px 
    } 
    
    .outerbox-container { 
        width: 350px; 
        text-align: center; 
    } 
    
+0

优秀!非常感谢您提供完整的解决方案! – Loren

+0

不客气:) –

1

尝试这种方式。

var myApp = angular.module('myApp', []); 
 

 
myApp.controller('myCtrl', function($scope) { 
 
    $scope.boxes = [ 
 
\t \t {name: 'Name 1'}, 
 
\t \t {name: 'Name 2'}, 
 
\t \t {name: 'Name 3'}, 
 
\t \t {name: 'Name 4'} 
 
\t ]; 
 
});
.outerbox { 
 
    background-color: lightblue; 
 
    margin: 10px auto; 
 
    width: 350px; 
 
    position: relative; 
 
    text-align: center; 
 
} 
 

 
.box { 
 
    background-color: lightgreen; 
 
    border-style: solid; 
 
    border-color: black; 
 
    border-width: 1px; 
 
    margin: 2px; 
 
    height: 100px; 
 
    width: 100px; 
 
    display: inline-block; 
 
    float: left; 
 
} 
 
.boxClass{ 
 
    margin-left: 108px; 
 
    
 
    } 
 
    
 
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
<div ng-app="myApp" ng-controller='myCtrl' ng-init="show=false"> 
 
    <button ng-model="show" ng-click="show=!show" ng-bind="show?'Animate Leave':'Animate Enter'"> 
 
    </button> 
 

 
    <div ng-if="show" class="outerbox" ng-repeat="box in boxes"> 
 
     <div class="box" ng-class="{'boxClass': $last}" >{{box.name}}</div> 
 
    </div> 
 

 
</div>

+0

非常感谢您花时间回复!虽然这与接受的答案看起来很相似,但接受的答案提供了一个完整且有效的示例。再次谢谢你! – Loren

1

摆脱浮动!

.outerbox { 
 
    background-color: lightblue; 
 
    margin: 10px auto; 
 
    width: 350px; 
 
    position: relative; 
 
    text-align: center; 
 
} 
 

 
.box { 
 
    background-color: lightgreen; 
 
    border-style: solid; 
 
    border-color: black; 
 
    border-width: 1px; 
 
    margin: 2px; 
 
    height: 100px; 
 
    width: 100px; 
 
    display: inline-block; 
 
}
<div ng-if="show" class="outerbox" ng-repeat="box in boxes"> 
 
    <div class="box">{{box.name}}</div> 
 
    <div class="box">{{box.name}}</div> 
 
    <div class="box">{{box.name}}</div> 
 
    <div class="box">{{box.name}}</div> 
 
</div>

+0

感谢您查看代码!不幸的是,只需删除“浮动”线就可以使所有的框都居中,每行一个。再次感谢您花时间回复。 – Loren

+0

检查您生成的html实际上看起来像我的答案。我希望你在箱子里面重复一个箱子,而不是在一个箱子里重复一个箱子。 –

+0

Steve,你上面提供的代码不会产生所需的结果。使用ng-repeat指令,您不希望重复实际的 '

{{box.name}}
'。无论哪种方式,使用这个没有提供预期的结果。如果您手动输入原始HTML,您的代码将是正确的,但该解决方案需要一个AngularJS组件。再次感谢! – Loren

1

您需要JavaScript来做到这一点,因为据我所知,CSS不能连续计算总申报单的数量,它只能看到:first-childnth-childlast child

这意味着CSS不知道底部行有多少个div,所以你将无法为其制作CSS代码。

+0

感谢您花时间思考这个问题。虽然最终存在一个CSS技巧,正如在接受的答案中所看到的那样,但您将提出一个很好的观点,我将为未来而存储。它必将派上用场! – Loren