2016-03-06 84 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