Rozważ główną oś i oś poprzeczną elastycznego pojemnika:
Źródło: W3C
Aby wyrównać elementy elastyczne wzdłuż głównej osi, istnieje jedna właściwość:
Aby wyrównać elementy elastyczne wzdłuż osi poprzecznej, istnieją trzy właściwości:
Na powyższym zdjęciu główna oś jest pozioma, a oś poprzeczna pionowa. Są to domyślne kierunki elastycznego kontenera.
Jednak te kierunki można łatwo zamieniać z flex-direction
właściwością.
/* main axis is horizontal, cross axis is vertical */
flex-direction: row;
flex-direction: row-reverse;
/* main axis is vertical, cross axis is horizontal */
flex-direction: column;
flex-direction: column-reverse;
(Oś poprzeczna jest zawsze prostopadła do osi głównej.)
Chodzi mi o to, żeby opisać, jak działają osie, że wydaje się, że w żadnym kierunku nie ma nic specjalnego. Oś główna, oś poprzeczna, oba są równe pod względem ważności iflex-direction
ułatwiają przełączanie w przód iw tył.
Dlaczego więc oś poprzeczna ma dwie dodatkowe właściwości wyrównania?
Dlaczego align-content
i są align-items
skonsolidowane w jedną właściwość dla głównej osi?
Dlaczego oś główna nie otrzymuje justify-self
właściwości?
Scenariusze, w których te właściwości byłyby przydatne:
umieszczenie elementu elastycznego w rogu pojemnika elastycznego
#box3 { align-self: flex-end; justify-self: flex-end; }
tworzenie grupy elementów elastycznych wyrównywanie do prawej (
justify-content: flex-end
), ale pierwszy element wyrównywanie do lewej (justify-self: flex-start
)Rozważ sekcję nagłówka z grupą elementów nawigacyjnych i logo. Dzięki
justify-self
logo można wyrównać w lewo, podczas gdy elementy nawigacyjne pozostają daleko w prawo, a całość płynnie dostosowuje się („wygina”) do różnych rozmiarów ekranu.w rzędzie trzech elastycznych elementów przymocuj środkowy element do środka pojemnika (
justify-content: center
) i wyrównaj sąsiednie przedmioty do krawędzi pojemnika (justify-self: flex-start
ijustify-self: flex-end
).Należy zauważyć, że wartości
space-around
ispace-between
najustify-content
nieruchomości nie będzie utrzymywać pozycję środkową skupia około pojemnika jeśli sąsiednie elementy mają różne szerokości.
W tym piśmie nie ma wzmianki o specyfikacji Flexboxjustify-self
ani justify-items
o niej .
Jednak w CSS Box Alignment Module , który jest niedokończoną propozycją W3C dotyczącą ustanowienia wspólnego zestawu właściwości wyrównania do użytku we wszystkich modelach pudełek, jest to:
Źródło: W3C
Zauważysz to justify-self
i justify-items
rozważasz ... ale nie dla Flexboksa .
Na koniec powtórzę główne pytanie:
Dlaczego nie ma właściwości „justify-items” i „justify-self”?
źródło
justify-self
się pracować dla elementu elastycznego? Załóżmy, że masz przedmioty a, b, c, d z dodatkową przestrzenią do rozmieszczenia wokół nich, a elastyczny pojemnik majustify-content: space-between
, więc kończą jak | abcd |. Co oznaczałoby dodanie np.justify-self: center
„Justify-self: flex-end” tylko do pozycji „b”? Gdzie byś się spodziewał? (Widzę kilka wersji demonstracyjnych w jednej z odpowiedzi tutaj, ale nie widzę jasnego sposobu, aby to w ogóle działało.)justify-content: flex-start
, więc elementy są na początku zatłoczone, jak | abcd |. Czego byś się spodziewał, gdybyś włożył tamjustify-self: [anything]
przedmiot „b”?)justify-self
pracować dla elementu elastycznego? Powiedziałbym, że nie inaczej niżauto
marginesy, które już działają na elementach elastycznych. W drugim przykładziejustify-self: flex-end
element d przesunąłby go na drugą stronę. To samo w sobie byłoby świetną funkcją, którejauto
marże mogą już zrobić. Odpowiedziałem z demonstracją.justify-content
ijustify-self
są określone tak, że przypadki konfliktów (jak scenariuszach Pytałem o) są jasno i rozsądnie zdefiniowane. Jak zauważyłem w mojej odpowiedzi tutaj,{justify|align}-self
chodzi o wyrównywanie elementów w większym pudełku, który ma wymiary niezależnie od{justify|align}-self
wartości - i nie ma takiego pudełka, w głównej osi, do którego mógłby zostać dopasowany element elastyczny.justify-self
i jak byś wchodził wjustify-content
interakcje, w przypadkach, gdy są one sprzeczne (np. Scenariusze, które przedstawiłem). Automatyczne marginesy po prostu w ogóle nie wchodzą w interakcjejustify-content
- kradną całą przestrzeń pakowania, zanimjustify-content
mają szansę z niej skorzystać. Automatyczne marginesy nie są tak naprawdę dobrym analogiem do tego, jak to by działało.Odpowiedzi:
Metody wyrównywania elementów Flex wzdłuż głównej osi
Jak stwierdzono w pytaniu:
Pytanie brzmi:
Jedna odpowiedź może brzmieć: ponieważ nie są one konieczne.
Specyfikacja Flexbox zapewnia dwie metody wyrównywania elementów elastycznych wzdłuż głównej osi:
justify-content
słowa kluczowego orazauto
marginesyjustify-content
W
justify-content
wyrównuje własności wyginają przedmiotów wzdłuż głównej osi elastycznego pojemnika.Jest nakładany na elastyczny pojemnik, ale wpływa tylko na elastyczne przedmioty.
Istnieje pięć opcji wyrównania:
flex-start
~ Przedmioty Flex są pakowane na początku linii.flex-end
~ Przedmioty Flex są pakowane pod koniec linii.center
~ Przedmioty Flex są pakowane w kierunku środka linii.space-between
~ Elementy elastyczne są równomiernie rozmieszczone, przy czym pierwszy element jest wyrównany do jednej krawędzi pojemnika, a ostatni element do przeciwległej krawędzi. Krawędzie używane przez pierwszych i ostatnich pozycji zależyflex-direction
i trybu zapisu (ltr
lubrtl
).space-around
~ To samo, cospace-between
z wyjątkiem pół-wielkości spacji na obu końcach.Automatyczne marginesy
Dzięki
auto
marginesom elementy elastyczne mogą być wyśrodkowane, oddalone lub spakowane w podgrupy.W przeciwieństwie do tego
justify-content
, który jest stosowany do kontenera elastycznego,auto
marginesy idą na elementach elastycznych.Działają, zużywając całą wolną przestrzeń w określonym kierunku.
Dopasuj grupę elementów elastycznych do prawej, a pierwszą pozycję do lewej
Scenariusz z pytania:
Inne przydatne scenariusze:
Umieść element elastyczny w rogu
Scenariusz z pytania:
Wyśrodkuj element flex w pionie i poziomie
margin: auto
jest alternatywą dlajustify-content: center
ialign-items: center
.Zamiast tego kodu na kontenerze Flex:
Możesz użyć tego na elemencie flex:
Ta alternatywa jest przydatna podczas centrowania elementu elastycznego, który przepełnia pojemnik .
Wyśrodkuj element flex i wyśrodkuj drugi element flex między pierwszym a krawędzią
Elastyczny pojemnik wyrównuje elastyczne przedmioty, rozdzielając wolne miejsce.
Dlatego, aby uzyskać równą równowagę , aby środkowy element mógł być wyśrodkowany w pojemniku z jednym elementem obok, należy wprowadzić przeciwwagę.
W poniższych przykładach wprowadzono niewidoczne trzecie elementy elastyczne (pola 61 i 68) w celu zrównoważenia „rzeczywistych” przedmiotów (pola 63 i 66).
Oczywiście ta metoda nie jest świetna pod względem semantyki.
Alternatywnie możesz użyć pseudoelementu zamiast rzeczywistego elementu DOM. Lub możesz użyć pozycjonowania bezwzględnego. Omówiono tutaj wszystkie trzy metody: elementy Flex wyśrodkowane i wyrównane do dołu
UWAGA: Powyższe przykłady będą działać - pod względem prawdziwego centrowania - tylko wtedy, gdy najbardziej zewnętrzne elementy mają równą wysokość / szerokość. Gdy elementy elastyczne mają różne długości, zobacz następny przykład.
Wyśrodkuj element elastyczny, gdy sąsiednie elementy różnią się rozmiarem
Scenariusz z pytania:
Jak wspomniano, chyba że wszystkie elementy Flex mają równą szerokość lub wysokość (w zależności od
flex-direction
), środkowy element nie może być naprawdę wyśrodkowany. Ten problem jest silnym argumentem zajustify-self
właściwością (oczywiście zaprojektowaną do obsługi zadania).Pokaż fragment kodu
Oto dwie metody rozwiązania tego problemu:
Rozwiązanie nr 1: Absolutne pozycjonowanie
Specyfikacja Flexbox pozwala na absolutne pozycjonowanie elementów flex . Dzięki temu środkowy element może być idealnie wyśrodkowany, niezależnie od wielkości rodzeństwa.
Pamiętaj tylko, że podobnie jak wszystkie absolutnie ustawione elementy, elementy są usuwane z dokumentów . Oznacza to, że nie zajmują miejsca w pojemniku i mogą zachodzić na swoje rodzeństwo.
W poniższych przykładach środkowy element jest wyśrodkowany z absolutnym pozycjonowaniem, a elementy zewnętrzne pozostają w ruchu. Ale ten sam układ można osiągnąć odwrotnie: Wyśrodkuj środkowy element
justify-content: center
i absolutnie ustaw zewnętrzne elementy.Rozwiązanie nr 2: Zagnieżdżone kontenery Flex (bez absolutnego pozycjonowania)
Oto jak to działa:
.container
) to elastyczny kontener..box
) jest teraz elementem elastycznym..box
przedmiot jest podanyflex: 1
w celu równego podziału miejsca w pojemniku.justify-content: center
.span
element jest wyśrodkowanym elementem elastycznym.auto
marginesów elastycznych, aby przesunąć zewnętrznespan
lewe i prawe.Możesz także zrezygnować
justify-content
i użyćauto
wyłącznie marginesów.Ale
justify-content
może tu działać, ponieważauto
marginesy zawsze mają priorytet. Ze specyfikacji:justify-content: space-same (koncepcja)
Wracając do
justify-content
minuty, oto pomysł na jeszcze jedną opcję.space-same
~ Hybrydaspace-between
ispace-around
. Elementy elastyczne są równomiernie rozmieszczone (jakspace-between
), z tym wyjątkiem, że na obu końcach (jakspace-around
) zamiast pół-wielkości znajdują się spacje na obu końcach.Układ ten można osiągnąć
::before
i::after
pseudo-elementów na giętkim opakowaniu.(kredyt: @oriol dla kodu i @crl dla etykiety)
AKTUALIZACJA: Przeglądarki rozpoczęły wdrażanie
space-evenly
, które spełnia powyższe wymagania. Zobacz ten post, aby uzyskać szczegółowe informacje: Równa przestrzeń między elementami elastycznymiPLAC ZABAW (zawiera kod dla wszystkich powyższych przykładów)
źródło
justify-content
aauto
marże. Na drugiej stronie monety - poprzeczna ,align-items
,align-self
ialign-content
- patrz ten post: stackoverflow.com/q/42613359/3597276justify-self
właściwość ...auto
marginesy są pomocne, alejustify-self: center
byłyby idealne. Sposób rozwiązania przedstawionego problemu polegałby na utworzeniu niewidocznych duplikatów po przeciwnej stronie. Zobacz moją odpowiedź tutaj: stackoverflow.com/q/38948102/3597276space-same
koncepcja jest teraz prawdziwa. Nazywa sięspace-evenly
, ale w tej chwili jest obsługiwany tylko przez Firefox: developer.mozilla.org/en-US/docs/Web/CSS/justify-contentspace-evenly
w innych odpowiedziach: stackoverflow.com/q/45134400/3597276space-evenly
był obsługiwany w Chrome 57-60, ale tylko dla układu siatki. To był błąd, który został naprawiony, a od Chrome 61 jest tam obsługiwany również dla Flexbox. Ponadto, nie jest droga do naśladowania go bez pseudo-elementy:.item { margin-right: auto } .item:first-child { margin-left: auto }
.Wiem, że to nie jest odpowiedź, ale chciałbym przyczynić się do tej sprawy za to, co jest warte. Byłoby wspaniale, gdyby mogli wypuścić
justify-self
Flexbox, aby uczynić go naprawdę elastycznym.Uważam, że gdy na osi znajduje się wiele elementów, najbardziej logicznym sposobem
justify-self
zachowania jest wyrównanie się do najbliższych sąsiadów (lub krawędzi), jak pokazano poniżej.Mam nadzieję, że W3C to zauważy i przynajmniej to rozważy. =)
W ten sposób możesz mieć przedmiot, który jest naprawdę wyśrodkowany, niezależnie od wielkości lewego i prawego pudełka. Kiedy jedno z pudeł dotrze do punktu środkowego pudełka, po prostu je popchnie, aż nie będzie już miejsca do rozdzielenia.
Łatwość tworzenia niesamowitych układów jest nieograniczona, spójrz na ten „złożony” przykład.
źródło
justify-self
ijustify-items
.auto
marże nie są kompletnym substytutemjustify-self
. Starałem się sformułować mój poprzedni komentarz, mówiąc, żeauto
marginesy będą obejmować niektóre przypadki użycia . Jak zauważyłeś, nie może wyśrodkować przedmiotu na miejscu, gdy sąsiednie przedmioty mają różne rozmiary. Zapewnia jednak więcej opcji wyrównywania elementów elastycznych. Kiedy zacząłem uczyć się o flexboksie, pomyślałem,justify-content
że jedynym sposobem są niewidoczne elementy dystansowe.Zapytano o to na liście w stylu www, a Tab Atkins (edytor specyfikacji) udzielił odpowiedzi wyjaśniającej dlaczego . Opowiem o tym trochę tutaj.
Na początek załóżmy, że nasz elastyczny pojemnik jest jednokreskowy (
flex-wrap: nowrap
). W tym przypadku istnieje wyraźna różnica w wyrównaniu między osią główną i osią poprzeczną - na osi głównej znajduje się wiele elementów, ale tylko jeden element jest ułożony na osi poprzecznej. Dlatego sensowne jest posiadanie „align-self” z możliwością dostosowywania dla każdego elementu w osi poprzecznej (ponieważ każdy element jest wyrównywany osobno), podczas gdy nie ma to sensu w głównej osi (ponieważ tam elementy są wyrównywane zbiorowo).W przypadku wieloliniowego flexboksa ta sama logika ma zastosowanie do każdej „linii flex”. W danym wierszu elementy są wyrównywane indywidualnie w osi poprzecznej (ponieważ jest tylko jeden element w wierszu, w osi poprzecznej), a kolektywnie w osi głównej.
Oto kolejny sposób frazowania go: tak, wszystko z
*-self
i*-content
właściwości są o tym, jak rozpowszechniać dodatkową przestrzeń wokół rzeczy. Ale kluczową różnicą jest to, że*-self
wersje są przeznaczone dla przypadków, w których na tej osi jest tylko jedna rzecz , a*-content
wersje są, gdy istnieje potencjalnie wiele rzeczy na tej osi . Scenariusze „jedna rzecz kontra wiele rzeczy” to różne rodzaje problemów, więc mają różne rodzaje dostępnych opcji - na przykład wartościspace-around
/space-between
mają sens*-content
, ale nie dla*-self
.SO: W głównej osi Flexboksa istnieje wiele rzeczy do rozłożenia wokół. Więc
*-content
własności sens tam, ale nie*-self
właściwość.Natomiast w osi poprzecznej mamy zarówno właściwość
*-self
a, jak i*-content
właściwość. Jeden określa, w jaki sposób rozdzielimy przestrzeń wokół wielu linii elastycznych (align-content
), a drugi (align-self
) określa, jak rozmieścić przestrzeń wokół poszczególnych osób elementów wygięcia w osi poprzecznej, w obrębie danej linii wygięcia.(Ignoruję
*-items
tutaj właściwości, ponieważ po prostu ustalają wartości domyślne*-self
).źródło
justify-self
może być problem na osi z wieloma przedmiotami, a nie z jednym przedmiotem. Jednak naprawdę mam nadzieję, że przyjrzą się temu dalej, w sytuacji wielu przedmiotów, jak sięjustify-self
zachowają, ponieważ są sytuacje, w których może to być naprawdę przydatne. Na przykład ( stackoverflow.com/questions/32378953/... ).justify-self
.*-self
chodzi o przypadki, w których mamy tylko jedną rzecz do wyrównania, podczas gdy*-content
chodzi o przypadki, w których mamy wiele rzeczy do wyrównania. Czy to czyni to nieco jaśniejszym?auto
marginesy, również będące częścią specyfikacji, umożliwiają wyrównanie * -self z wieloma elementami w wierszu. Nie ma też wyraźnego powodu, dla którego właściwości słów kluczowych również nie mogą.Wiem, że nie używa Flexboksa, ale w przypadku prostego przypadku użycia trzech elementów (jeden po lewej, jeden w środku, jeden po prawej), można to łatwo zrobić
display: grid
na rodzicu,grid-area: 1/1/1/1;
na dzieciach ijustify-self
do pozycjonowania tych dzieci.źródło
Właśnie znalazłem własne rozwiązanie tego problemu, a przynajmniej mojego problemu.
Użyłem
justify-content: space-around
zamiastjustify-content: space-between;
.W ten sposób elementy końcowe zostaną przyklejone do góry i dołu, a Ty możesz mieć niestandardowe marginesy, jeśli chcesz.
źródło