Czy można zawijać siatkę CSS bez używania zapytań o media?
W moim przypadku mam niedeterministyczną liczbę elementów, które chcę umieścić w siatce i chcę, aby ta siatka była zawijana. Używając Flexbox, nie mogę niezawodnie ładnie rozmieścić rzeczy. Chciałbym również uniknąć wielu zapytań o media.
Oto przykładowy kod :
.grid {
display: grid;
grid-gap: 10px;
grid-auto-flow: column;
grid-template-columns: 186px 186px 186px 186px;
}
.grid > * {
background-color: green;
height: 200px;
}
<div class="grid">
<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
</div>
A oto obraz GIF:
Na marginesie, jeśli ktoś może mi powiedzieć, jak mogę uniknąć określania szerokości wszystkich elementów, tak jak ja grid-template-columns
, byłoby świetnie. Wolałbym, żeby dzieci określały własną szerokość.
grid-template-columns: auto auto auto auto;
działa w tym przypadku? =)Odpowiedzi:
Użyj jednego
auto-fill
lubauto-fit
jako liczba powtórzeń wrepeat()
notacji.auto-fill
Siatka będzie powtarzać tyle ścieżek, ile to możliwe, bez przepełnienia swojego kontenera.
W tym przypadku, biorąc pod uwagę powyższy przykład (patrz ilustracja) , tylko 5 ścieżek może zmieścić się w kontenerze siatki bez przepełnienia. W naszej siatce są tylko 4 elementy, więc piąty jest tworzony jako pusty tor w pozostałej przestrzeni.
Reszta pozostałej przestrzeni, ścieżka nr 6, kończy jawną siatkę. Oznacza to, że nie było wystarczająco dużo miejsca, aby umieścić kolejny tor.
auto-fit
auto-fit
Kluczowe zachowuje się tak samo jakauto-fill
z tym, że po algorytmu placement pozycja siatki żadnych pustych utworów w pozostałej przestrzeni będzie upadł0
.Siatka będzie nadal powtarzać tyle ścieżek, ile to możliwe, bez przepełnienia swojego kontenera, ale puste ścieżki zostaną zwinięte do
0
.Zwinięty tor jest traktowany jako mający stałą funkcję zmiany rozmiaru
0px
.W przeciwieństwie do
auto-fill
przykładu z obrazkiem, pusta piąta ścieżka jest zwinięta, co kończy jawną siatkę zaraz po czwartym elemencie.auto-fill
vsauto-fit
Różnica między nimi jest zauważalna, gdy
minmax()
używana jest funkcja.Służy
minmax(186px, 1fr)
do określania zakresu elementów od186px
do186px
plus ułamek pozostałego miejsca w kontenerze siatki.Podczas używania
auto-fill
przedmioty będą rosły, gdy nie będzie miejsca na umieszczenie pustych ścieżek.Podczas używania
auto-fit
elementy będą rosły, aby wypełnić pozostałą przestrzeń, ponieważ wszystkie puste ścieżki są zwinięte0px
.Plac zabaw:
CodePen
Sprawdzanie ścieżek automatycznego wypełniania
Sprawdzanie torów autodopasowania
źródło
display: grid
elemencie użyjjustify-content: center
repeat(auto-fill, minmax(186px, 1fr));
nie jest pikselami, ale tak długo, jak długo element div zawiera tekst?Albo chcesz
auto-fit
lubauto-fill
wewnątrzrepeat()
funkcji:Różnica między nimi staje się widoczna, jeśli użyjesz również a,
minmax()
aby umożliwić elastyczne rozmiary kolumn:Dzięki temu kolumny mogą zmieniać rozmiar, od 186 pikseli do kolumn o równej szerokości rozciągających się na całej szerokości kontenera.
auto-fill
utworzy tyle kolumn, ile zmieści się na szerokości. Jeśli, powiedzmy, pasuje pięć kolumn, nawet jeśli masz tylko cztery elementy siatki, pojawi się piąta pusta kolumna:Użycie
auto-fit
zamiast tego zapobiegnie pustym kolumnom, rozciągając je dalej, jeśli to konieczne:źródło
Możesz szukać
auto-fill
:Demo: http://codepen.io/alanbuchanan/pen/wJRMox
Aby efektywniej wykorzystać dostępne miejsce, możesz użyć
minmax
i przekazaćauto
jako drugi argument:Demo: http://codepen.io/alanbuchanan/pen/jBXWLR
Jeśli nie chcesz pustych kolumn, możesz użyć
auto-fit
zamiastauto-fill
.źródło
Miałem podobną sytuację. Oprócz tego, co zrobiłeś, chciałem wyśrodkować moje kolumny w kontenerze, nie pozwalając pustym kolumnom na lewą lub prawą:
źródło
Oto moja próba. Przepraszam za puch, czułam się wyjątkowo kreatywna.
Moja metoda to rodzic
div
o stałych wymiarach . Reszta to po prostu dopasowanie zawartości do tego elementu div.Spowoduje to przeskalowanie obrazów niezależnie od proporcji. Nie będzie też twardego kadrowania .
źródło