Korzystam z okna elastycznego, aby wyświetlić 8 elementów, które będą dynamicznie zmieniać rozmiar na mojej stronie. Jak zmusić go do podzielenia przedmiotów na dwa rzędy? (4 na rząd)?
Oto odpowiedni wycinek:
(Lub jeśli wolisz jsfiddle - http://jsfiddle.net/vivmaha/oq6prk1p/2/ )
.parent-wrapper {
height: 100%;
width: 100%;
border: 1px solid black;
}
.parent {
display: flex;
font-size: 0;
flex-wrap: wrap;
margin: -10px 0 0 -10px;
}
.child {
display: inline-block;
background: blue;
margin: 10px 0 0 10px;
flex-grow: 1;
height: 100px;
}
<body>
<div class="parent-wrapper">
<div class="parent">
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
<div class="child"></div>
</div>
</div>
</body>
Odpowiedzi:
Masz
flex-wrap: wrap
na pojemniku. To dobrze, ponieważ zastępuje wartość domyślną, którą jestnowrap
( źródło ). Z tego powodu w niektórych przypadkach elementy nie są zawijane, aby utworzyć siatkę .W tym przypadku głównym problemem są
flex-grow: 1
elementy elastyczne.flex-grow
Nieruchomość nie faktycznie wielkości flex przedmiotów. Jego zadaniem jest dystrybucja wolnej przestrzeni w kontenerze ( źródle ). Niezależnie od tego, jak mały jest rozmiar ekranu, każdy element otrzyma proporcjonalną część wolnego miejsca w wierszu.Mówiąc dokładniej, w twoim pojemniku znajduje się osiem elastycznych przedmiotów. Z
flex-grow: 1
, każdy otrzymuje 1/8 wolnego miejsca na linii. Ponieważ w twoich przedmiotach nie ma treści, mogą się one zmniejszyć do zera i nigdy się nie zawiną.Rozwiązaniem jest zdefiniowanie szerokości elementów. Spróbuj tego:
Po
flex-grow: 1
zdefiniowaniu wflex
skrócie nie ma potrzeby,flex-basis
aby wynosić 25%, co w rzeczywistości spowodowałoby trzy pozycje z rzędu ze względu na marginesy.Ponieważ
flex-grow
zajmie wolne miejsce w rzędzie,flex-basis
musi być wystarczająco duże, aby wymusić zawijanie. W tym przypadku zflex-basis: 21%
marginesami jest dużo miejsca, ale nigdy nie ma wystarczającej ilości miejsca na piąty przedmiot.źródło
flex: 1 0 calc(25% - 10px);
margin: 2%;
zamiast stałej liczby pikseli, aby zapobiec przeskakiwaniu pudełek do nowej linii na małych urządzeniach / rozdzielczościach. ogólna formuła to(100 - (4 * box-width-percent)) / 8
% dla różnych szerokości skrzynekDodaj szerokość do
.child
elementów. Osobiście użyłbym wartości procentowych,margin-left
jeśli chcesz mieć zawsze 4 na wiersz.PRÓBNY
źródło
Oto kolejny aplet.
Możesz to zrobić również w ten sposób:
Przykład: https://codepen.io/capynet/pen/WOPBBm
I bardziej kompletna próbka: https://codepen.io/capynet/pen/JyYaba
źródło
Zrobiłbym to w ten sposób, używając ujemnych marginesów i obliczeń dla rynien:
Demo: https://jsfiddle.net/9j2rvom4/
Alternatywna metoda siatki CSS:
Demo: https://jsfiddle.net/jc2utfs3/
źródło
Mam nadzieję, że to pomoże. po więcej szczegółów możesz skorzystać z tego linku
źródło
Uważam, że ten przykład jest bardziej prosty i łatwiejszy do zrozumienia niż @dowomenfart.
Dokonuje się tych samych obliczeń szerokości podczas cięcia bezpośrednio do mięsa. Matematyka jest znacznie łatwiejsza i
em
jest nowym standardem ze względu na skalowalność i łatwość obsługi mobilnej.źródło
;)
źródło
justify-content: space-evenly;
do prenta, to ładnie się dopasują i nie musisz robić tegocalc
na dziecku. Ale dziękuję za przykład!Flex wrap + ujemny margines
Dlaczego Flex vs.
display: inline-block
?Dlaczego marża ujemna?
Albo używasz SCSS lub CSS-in-JS dla przypadków krawędzi (tj. Pierwszy element w kolumnie), albo ustawiasz domyślny margines i pozbywasz się zewnętrznego marginesu później.
Realizacja
https://codepen.io/zurfyx/pen/BaBWpja
źródło
Oto inny sposób bez użycia
calc()
.To wszystko. Możesz uzyskać wymyślne wymiary, aby uzyskać bardziej estetyczne rozmiary, ale taki jest pomysł.
źródło