2017-11-28 7 views
0

Ich verwende derzeit Angular 5, das eine Schleife ausführt und mehrere Container als Liste anzeigt (Tausende von Ergebnissen).Gleicher Abstand zwischen Divs mit Angular 5 und Flex Layout

<div class="temp-list"> 
     <div> 
      <ng-container #activityCards *ngFor="let activity of (activityCollection.activities | filters: filtersObject); let i = index;"> 
       <div class="activity-card-container" *ngIf="checkIsVisible(i)" [ngClass.gt-md]="{'display-inline': true, 'large-activity': i < 3, 'medium-activity': i > 2 && i < 7, 'small-activity': i > 6 }" > 
        <activity-card [activity]="activity"></activity-card> 
       </div> 
      </ng-container> 
     </div> 
</div> 

Sie können auch auf dem Index des Elements sehen, dass ich eine Flex-Layout ngClass bin mit, die auf Basis einer Klasse zu dem Behälter hinzufügt. Die ersten drei Behälter sind groß (33,33%), die nächsten vier sind mittelgroß (25%) und der Rest ist klein (20%). Ich möchte jedoch 24px Platz zwischen jedem Element; Ich will nur diesen Raum zwischen den Containern, nicht am linken oder am rechten Ende.

enter image description here

Hier ist die CSS ich im Moment haben.

.temp-list { 
    font-size: 0; 
} 
.activity-card-container { 
    position: relative; 
    box-sizing: border-box; 
} 
.display-inline { 
    display: inline-block; 
    padding: 0 24px 24px 0; 
} 
.large-activity { 
    width: 33.333%; 
} 
.large-activity:nth-child(3) { 
    padding-right: 0; 
} 
.medium-activity { 
    width: 25%; 
} 
.medium-activity:nth-child(7) { 
    padding-right: 0; 
} 
.small-activity { 
    width: 20%; 
} 
.small-activity:nth-child(5n + 12) { 
    padding-right: 0; 
} 

Wie Sie sehen können, habe ich 24px Polsterung rechts und unten in jedem Container hinzugefügt. Ich wähle dann das letzte Element jeder Zeile aus und ignoriere das Padding. Das Problem bei dieser Lösung ist, dass das letzte Element immer 24 Pixel breiter als die vorherigen Container ist. Ich brauche sie alle auf die gleiche Breite. Irgendwelche Gedanken?

+0

Haben Sie versucht, dies mit einem Flexbox Layout? Sie würden nicht alle Breiten prozentual oder die n-ten untergeordneten Selektoren benötigen. – jmargolisvt

+0

Jedes Mal, wenn ich Flex zum übergeordneten Container hinzufüge, werden alle, die Divs enthalten, in einer Zeile aufgelistet. Sie stapeln nicht mehr wie ich möchte. –

+0

Wenn Sie Ihre Ergebnisse teilen können (wie 3 in der ersten div, 4 in der nächsten, etc.), dann Sie Flexbox würde den Rest erledigen. – jmargolisvt

Antwort

1

Verwenden Sie anstelle von padding, um ein Leerzeichen zwischen Elementen zu erstellen, Flexbox und space-between, und subtrahieren Sie dann mit CSS Calc den gewünschten Speicherplatz von der Elementbreite.

Der angenommene Hauptbehälter sollte der .activity-card-container Elternteil sein.

Stapel Snippet

.temp-list { 
 
     font-size: 0; 
 
    } 
 
    .temp-list > div {     /* assumed the main parent container */ 
 
     font-size: 0; 
 
     border: 1px solid red;   /* for this demo */ 
 

 
     display: flex; 
 
     flex-wrap: wrap; 
 
     justify-content: space-between; 
 
    } 
 
    .activity-card-container { 
 
     position: relative; 
 
     box-sizing: border-box; 
 
     background: lightgray;   /* for this demo */ 
 
     height: 70px;     /* for this demo */ 
 
    } 
 
    .large-activity { 
 
     width: calc(33.333% - 16px);  /* 2 gaps * 24px = 48px/3 items = 16px */ 
 
    } 
 
    .medium-activity { 
 
     margin-top: 24px; 
 
     width: calc(25% - 18px);   /* 3 gaps * 24px = 72px/4 items = 18px */ 
 
    } 
 
    .small-activity { 
 
     margin-top: 24px; 
 
     width: calc(20% - 19.6px);  /* 4 gaps * 24px = 98px/5 items = 19.6px */ 
 
    }
<div class="temp-list"> 
 
    <div> 
 
    <div class="activity-card-container large-activity"> 
 
     activity-card 
 
    </div> 
 
    <div class="activity-card-container large-activity"> 
 
     activity-card 
 
    </div> 
 
    <div class="activity-card-container large-activity"> 
 
     activity-card 
 
    </div> 
 

 
    <div class="activity-card-container medium-activity"> 
 
     activity-card 
 
    </div> 
 
    <div class="activity-card-container medium-activity"> 
 
     activity-card 
 
    </div> 
 
    <div class="activity-card-container medium-activity"> 
 
     activity-card 
 
    </div> 
 
    <div class="activity-card-container medium-activity"> 
 
     activity-card 
 
    </div> 
 
    
 
    <div class="activity-card-container small-activity"> 
 
     activity-card 
 
    </div> 
 
    <div class="activity-card-container small-activity"> 
 
     activity-card 
 
    </div> 
 
    <div class="activity-card-container small-activity"> 
 
     activity-card 
 
    </div> 
 
    <div class="activity-card-container small-activity"> 
 
     activity-card 
 
    </div> 
 
    <div class="activity-card-container small-activity"> 
 
     activity-card 
 
    </div> 
 
</div> 
 
</div>

+0

Es war flex-wrap: wrap; ... –