2016-11-22 41 views
8

Potrzebuję następującego układu dla Angular Material, gdy karty są wstawiane od lewej do prawej, zawijanie na końcu dostępnej szerokości i wypełnienie pionowej przestrzeni między kartami. Wszystkie karty mają taką samą szerokość, ale różne wysokości:Układ Pinterest z materiałem kątowym

enter image description here

to możliwe ze zwykły kątowe i CSS? W jaki sposób?


starałem się tego dokonać z display:flex ale nie mogłem pozbyć pionowej przestrzeni:

.cards { 
     display: flex; 
     justify-content: flex-start; 
     flex-wrap: wrap; 
} 

enter image description here


Znalazłem również czystego roztworu CSS, który rozwiązuje problem z przestrzenią, ale ma inną kolejność i wymaga stałej wysokości: https://codepen.io/michellebarker/pen/zvxpoG

enter image description here


Aktualizacja

Wymagania dodatkowe:

  • Responsive układ: w zależności od okna z, istnieje mniej lub więcej kolumn; ale zawsze wypełnić całą dostępną przestrzeń (Adaptive szerokość kolumny, na przykład 100%, 50% itp)
  • Umieszczenie kart musi pracować ng-repeat="card in cards | orderBy:order:reverse"
+0

Czy istnieje powód, dla którego cała zawartość musi znajdować się w jednym pojemniku? Czy mógłbyś potencjalnie mieć trzy (kolumny) pojemniki i wstawić każdą kartę do kolumny cardCount% 3? – pulekies

+0

Powód jednego kontenera polega na tym, że układ musi reagować, dlatego w zależności od bieżącej rozdzielczości (krajobraz/portret/rozmiar ekranu) układ ma inną liczbę kolumn. –

+2

Użyj [muru kątowego] (https://passy.github.io/angular-masonry/) –

Odpowiedz

1

nie mogę pomóc Kątowymi roztworu w W tej chwili jednak, jeśli jesteś w stanie przetłumaczyć rozwiązanie React na Angular jeden z następujących algorytmów i kod może być pomocny.

Aby wygenerować ten układ, należy podzielić elementy na n kolumn i pozwolić układowi domyślnemu ustawić je w pionie. Następnie ułóż te kolumny za pomocą flexboksa lub szerokości procentowej.

Aby sieć reagowała, zasubskrybuj zdarzenia zmiany rozmiaru okna i obliczyć pożądaną liczbę kolumn. columnCount = itemWidth => availableWidth => Math.floor(availableWidth/itemWidth)

Spójrz na working React solution. Responsywne rozwiązanie to available here.

+0

Brzmi to bardzo obiecująco - jednak byłoby świetnie mieć wersję responsywną bezpośrednio jako wtyczkę - więc nie chcę musicie się martwić o aktualizację/utrzymanie wytycznych układu ... –

0

Powinieneś być w stanie wykorzystać właściwości układu przewidzianych przez materiał kątowej ....

Twój kontener div

<div layout="column" layout-wrap layout-align="start space-between"> 

...inner divs 

</div> 

Docs można znaleźć tutaj: https://material.angularjs.org/latest/layout/introduction

0

Flexbox nie system kratowy - więc nie możesz wypełnić pionowych przestrzeni, gdy jesteś wrap - więc najlepsze, co możesz uzyskać, to także, jeśli znasz wysokość.

Najlepszym rozwiązaniem jest zatem użycie systemu, który pozwala systemom sieciowym - i Angular Masonry pasuje do przypadku użycia tutaj.

zobacz demo poniżej:

angular.module("app", ['wu.masonry']).controller("ctrl", function($scope) { 
 
    $scope.cards = [ 
 
    "http://placehold.it/200x100", 
 
    "http://placehold.it/200x100", 
 
    "http://placehold.it/200x200", 
 
    "http://placehold.it/200x300", 
 
    "http://placehold.it/200x100", 
 
    "http://placehold.it/200x200" 
 
    ]; 
 
});
* { 
 
    box-sizing: border-box; 
 
} 
 
.wrapper > .block { 
 
    margin: 0 auto; 
 
} 
 
.grid-item { 
 
    margin-bottom: 5px; 
 
    display: block; 
 
    border: 1px solid #FFA500; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 

 
<!-- Angular masonry scripts --> 
 
<script src="https://npmcdn.com/[email protected]/imagesloaded.pkgd.js"></script> 
 
<script src="https://unpkg.com/[email protected]/dist/masonry.pkgd.js"></script> 
 
<script src="https://passy.github.io/angular-masonry/angular-masonry.js"></script> 
 

 
<div ng-app="app" ng-controller="ctrl" class="wrapper"> 
 

 
    <div class="block" masonry="{columnWidth: 200, gutter: 5, itemSelector:'.grid-item',fitWidth:true}"> 
 
    <div class="masonry-brick" ng-repeat="img in cards track by $index"> 
 
     <img class="grid-item" ng-src="{{img}}"/> 
 
    </div> 
 
    </div> 
 
</div>

+0

Dziękuję bardzo, to naprawdę bardzo dobre rozwiązanie!Jednak, o ile chciałbym go użyć - obawiam się, że bardzo trudno jest znać wysokość z góry, ponieważ zależy to od długości tytułu i liczby podpowiedzi, które są różne dla każdego wpisu, patrz tutaj w pełnej wersji/website: http://dev.sonnige-aussichten.ch/ - czy masz jakiś dodatkowy pomysł, jak to zrobić najlepiej? –

+0

Jestem zdezorientowany ... nie musisz znać wysokości każdego kafelka, jak sądzę, dostosowuje się sam, prawda? – kukkuz

1

Tworzę plunkr, więc pokaż dowód koncepcji, jak można to osiągnąć.

http://plnkr.co/j5yZQHK3D7l3nPJ8cPlB

Można wykorzystać layout-wrap i flex aby osiągnąć ten typ układu, który ma zasadniczo bez potrzebnej css.

<div layout="column" layout-wrap> 
    <md-card ng-repeat="card in vm.cards | orderBy:'order':!reverse" flex> 
    ... 
    </md-card> 
</div> 

To, co się robi, polega na dostosowywaniu wierszy, tak aby zawartość zajmowała tylko potrzebne miejsce, ale każda kolumna pozostała tego samego rozmiaru. To najlepsze z obu światów! Dodatkowo, można zamówić je w jakikolwiek sposób w razie potrzeby (również wykazane w plunkr)

layout-wrap cards

+0

Przyglądając się mu dokładnie, kolejność nie jest właściwa. Powinno to iść w rzędzie (od lewej do prawej), a nie kolumnowo (od góry do dołu). Tak jak byś tego oczekiwał od 'float: left'. Poza tym wypełniają one przestrzeń pionową. Czy wiesz o co mi chodzi? –

1

ja potrzebowałem dokładnie ten sam składnik. Ale nie mogłem znaleźć czystego rozwiązania css, a flexbox zamawia karty od góry do dołu.

Istnieje kilka opcji opartych na AngularJS. Ale ponieważ używam Angular, nie mogłem ich użyć.

Z tego powodu opracowałem komponent, który ustawia elementy od lewej do prawej. Elementy mają taką samą szerokość i różną wysokość. Pozycje elementów każdy element obliczając X i Y:

https://github.com/kodfarki/ng-pinterest-layout

Możesz spróbować, nawet jeśli składnik jest w fazie rozwoju.

+0

Brzmi świetnie! Czy masz działające demo online? –

+0

Możesz sklonować, a następnie uruchomić projekt za pomocą 'ng serve' i wyświetlić go na' localhost: 4200'. Wystąpiły drobne problemy z komponentem. Tak więc każda pomoc będzie doceniona. – Halil