Dlaczego w CSS Flexbox nie ma właściwości" justify-items "I" justify-self"?

Rozważmy oś główną i oś poprzeczną pojemnika flex:

Tutaj wpisz opis obrazka                                                                                                                         źródło: W3C

Aby wyrównać elementy flex wzdłuż głównej osi istnieje jedna właściwość:

Aby wyrównać elementy flex wzdłuż osi poprzecznej są trzy właściwości:

Na powyższym obrazku główna oś jest pozioma, a oś poprzeczna jest pionowa. Są to domyślne Kierunki kontenera flex.

Jednak te kierunki można łatwo wymienić z flex-direction własność.

/* 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.)

Mój punkt w opisaniu, jak osie" praca polega na tym, że nie wydaje się być nic specjalnego w obu kierunkach. Główna oś, oś poprzeczna, obie są równe pod względem znaczenia i flex-direction ułatwia 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 align-items są skonsolidowane w jedną własność dla osi głównej?

dlaczego oś główna nie otrzymuje właściwości justify-self?


Scenariusze, w których te właściwości byłyby użyteczne:

  • Umieszczenie elementu flex w rogu kontenera flex
    #box3 { align-self: flex-end; justify-self: flex-end; }

  • Tworzenie grupy elementów flex align-right (justify-content: flex-end) ale mieć pierwszy element align left (justify-self: flex-start)

    rozważ sekcję nagłówka z grupą elementów nawigacyjnych i logo. Z justify-self logo może być wyrównane w lewo, podczas gdy elementy nawigacyjne pozostają daleko w prawo, a całość dostosowuje się płynnie ("wygina się") do innego ekranu rozmiary.

  • W rzędzie trzech elastycznych elementów umieść środkowy element na środku kontenera (justify-content: center) i wyrównaj sąsiadujące elementy do krawędzi kontenera (justify-self: flex-start i justify-self: flex-end).

    zauważ, że wartości space-around i space-between na justify-content właściwość nie utrzyma środkowego elementu w środku względem kontenera, jeśli sąsiadujące elementy mają różne szerokości.

#container {
  display: flex;
  justify-content: space-between;
  background-color: lightyellow;
}
.box {
  height: 50px;
  width: 75px;
  background-color: springgreen;
}
.box1 {
  width: 100px;
}
.box3 {
  width: 200px;
}
#center {
  text-align: center;
  margin-bottom: 5px;
}
#center > span {
  background-color: aqua;
  padding: 2px;
}
<div id="center">
  <span>TRUE CENTER</span>
</div>

<div id="container">
  <div class="box box1"></div>
  <div class="box box2"></div>
  <div class="box box3"></div>
</div>

<p>note that the middle box will only be truly centered if adjacent boxes are equal width</p>

JsFiddle wersja


W momencie pisania tego tekstu, nie ma wzmianki o justify-self lub justify-items w Spec .

Jednak w module CSS Box Alignment Module, który jest niedokończoną propozycją W3C, aby ustanowić wspólny zestaw właściwości wyrównania do użytku we wszystkich modelach pudełkowych, jest to:

Tutaj wpisz opis obrazka                                                                                                                         źródło: W3C

Zauważysz, że justify-self i justify-items są rozważane... ale nie dla flexbox .


Na koniec powtórzę główne pytanie:

Dlaczego nie ma właściwości "justify-items" I "justify-self"?

Author: Michael_B, 2015-09-13

5 answers

Metody wyrównywania elementów Flex wzdłuż osi głównej

Jak wskazano w pytaniu:

Aby wyrównać elementy flex wzdłuż osi głównej jest jedna właściwość: justify-content

Aby wyrównać elementy flex wzdłuż osi poprzecznej są trzy właściwości: align-content, align-items oraz align-self.

Pytanie zadaje:

Dlaczego nie ma justify-items i justify-self właściwości?

Jedna odpowiedź może być: Ponieważ nie są konieczne.

Specyfikacja flexbox zawiera dwie metody wyrównywania elementów flex wzdłuż głównej osi:

  1. właściwość słowa kluczowego justify-content oraz
  2. auto marginesy

Justify-content

The justify-content właściwość wyrównuje elementy flex wzdłuż głównej osi kontenera flex.

Jest stosowany do pojemnika flex, ale dotyczy tylko elementów flex.

Istnieje pięć opcji wyrównania:

  • flex-start ~ Elementy Flex są pakowane na początku linii.

    Tutaj wpisz opis obrazka

  • flex-end ~ przedmioty Flex są pakowane pod koniec linii.

    Tutaj wpisz opis obrazka

  • center ~ Elementy Flex są pakowane w kierunku środka Kolejka

    Tutaj wpisz opis obrazka

  • space-between ~ Elementy Flex są równomiernie rozmieszczone, przy czym pierwszy element jest wyrównany do jednej krawędzi kontenera, a ostatni do przeciwległej krawędzi. Krawędzie używane przez pierwszy i ostatni element zależą od flex-direction i tryb zapisu (ltr lub rtl).

    Tutaj wpisz opis obrazka

  • space-around ~ tak samo jak space-between, z wyjątkiem spacji półwymiarowych na obu koniec.

    Tutaj wpisz opis obrazka


Marginesy Automatyczne

Z auto marginesy , elementy flex mogą być wyśrodkowane, odstępowane lub pakowane w podgrupy.

W przeciwieństwie do justify-content, które jest stosowane do kontenera flex, auto marginesy znajdują się na elementach flex.

Pracują, pochłaniając całą wolną przestrzeń w określonym kierunku.


Align Grupa elementów flex w prawo, ale pierwszy element w lewo

Scenariusz z pytanie:

  • Tworzenie grupy elementów flex align-right (justify-content: flex-end) / align = "left" / (justify-self: flex-start)

    rozważ sekcję nagłówka z grupą elementów nawigacyjnych i logo. Z justify-self logo może być wyrównane w lewo, podczas gdy elementy nawigacyjne pozostają prawej, a całość dopasowuje się płynnie ("flexes") do różne rozmiary ekranu.

Tutaj wpisz opis obrazka

Tutaj wpisz opis obrazka


inne przydatne scenariusze:

Tutaj wpisz opis obrazka

Tutaj wpisz opis obrazka

Tutaj wpisz opis obrazka


Umieść element flex w rogu

Scenariusz z pytania:

  • umieszczenie elementu flex w rogu .box { align-self: flex-end; justify-self: flex-end; }

Tutaj wpisz opis obrazka


Center element flex pionowo i poziomo

Tutaj wpisz opis obrazka

margin: auto jest alternatywą dla justify-content: center i align-items: center.

Zamiast tego kodu na kontenerze flex:

.container {
    justify-content: center;
    align-items: center;
}
Możesz użyć tego na elemencie flex:
.box56 {
    margin: auto;
}

Ta alternatywa jest przydatna, gdy centrowanie elementu flex, który przepełnia Pojemnik.


Wyśrodkuj element flex i wyśrodkuj drugi element flex między pierwszym a krawędzią

A kontener flex wyrównuje elementy flex poprzez dystrybucję wolnego miejsca.

Dlatego, aby utworzyć równą równowagę , aby środkowy element mógł być wyśrodkowany w pojemniku z pojedynczym elementem obok, należy wprowadzić przeciwwagę.

W poniższych przykładach wprowadzono niewidoczne elementy trzeciego flexu (pola 61 i 68), aby zrównoważyć "rzeczywiste" elementy (pola 63 i 66).

Tutaj wpisz opis obrazka

Tutaj wpisz opis obrazka

Oczywiście ta metoda jest nic wielkiego pod względem semantyki.

Alternatywnie można użyć pseudo-elementu zamiast rzeczywistego elementu DOM. Możesz też użyć pozycjonowania absolutnego. Omówiono tutaj wszystkie trzy metody: / align = "left" / Linear

uwaga: powyższe przykłady będą działać – pod względem rzeczywistego centrowania-tylko wtedy, gdy najbardziej oddalone elementy mają równą wysokość/szerokość. Gdy elementy flex mają różne długości, Zobacz następny przykład.


Center a flex element, gdy sąsiadujące elementy różnią się rozmiarem [196]}

Scenariusz z pytania:

  • W rzędzie trzech elementów flex, umieść środkowy element na środku kontenera (justify-content: center) i wyrównaj sąsiadujące elementów do krawędzi pojemnika (justify-self: flex-start i justify-self: flex-end).

    zauważ, że wartości space-around i space-between we właściwości justify-content nie utrzymają środkowego elementu wyśrodkowanego względem kontenera, jeśli sąsiednie elementy mają różne szerokości (zobacz demo).

Jak zauważono, chyba że wszystkie elementy flex mają jednakową szerokość lub wysokość (w zależności od flex-direction), element środkowy nie może być naprawdę wyśrodkowany. Ten problem stanowi mocny argument dla właściwości justify-self (zaprojektowanej do obsługi zadania, oczywiście).

#container {
  display: flex;
  justify-content: space-between;
  background-color: lightyellow;
}
.box {
  height: 50px;
  width: 75px;
  background-color: springgreen;
}
.box1 {
  width: 100px;
}
.box3 {
  width: 200px;
}
#center {
  text-align: center;
  margin-bottom: 5px;
}
#center > span {
  background-color: aqua;
  padding: 2px;
}
<div id="center">
  <span>TRUE CENTER</span>
</div>

<div id="container">
  <div class="box box1"></div>
  <div class="box box2"></div>
  <div class="box box3"></div>
</div>

<p>The middle box will be truly centered only if adjacent boxes are equal width.</p>

oto dwie metody rozwiązania tego problemu:

Rozwiązanie # 1: Absolutne Pozycjonowanie

Flexbox spec pozwala dla absolutnego pozycjonowania elementów flex . Pozwala to na idealne wyśrodkowanie środkowego elementu niezależnie od wielkości jego rodzeństwa.

Należy pamiętać, że podobnie jak wszystkie absolutnie pozycjonowane elementy, elementy są usuwane z obiegu dokumentów. Oznacza to, że nie zajmują miejsca w pojemniku i mogą nakładać się na rodzeństwo.

W poniższych przykładach środkowy element jest wyśrodkowany z absolutnym pozycjonowaniem, a zewnętrzne elementy pozostają w przepływie. Ale ten sam układ można osiągnąć w sposób odwrotny: Wyśrodkuj środkowy element za pomocą justify-content: center i absolutnie Ustaw zewnętrzne elementy.

Tutaj wpisz opis obrazka

Rozwiązanie # 2: zagnieżdżone kontenery Flex (bez absolutnego pozycjonowania)

.container {
  display: flex;
}
.box {
  flex: 1;
  display: flex;
  justify-content: center;
}
.box71 > span { margin-right: auto; }
.box73 > span { margin-left: auto;  }

/* non-essential */
.box {
  align-items: center;
  border: 1px solid #ccc;
  background-color: lightgreen;
  height: 40px;
}
<div class="container">
  <div class="box box71"><span>71 short</span></div>
  <div class="box box72"><span>72 centered</span></div>
  <div class="box box73"><span>73 loooooooooooooooong</span></div>
</div>

Oto jak to działa:

  • top-level div (.container) jest kontenerem flex.
  • każdy potomek div (.box) jest teraz elementem flex.
  • każdy .box element jest podana flex: 1 w celu równomiernego rozłożenia przestrzeni pojemnika.
  • Teraz elementy zajmują całą przestrzeń w wierszu i mają równą szerokość.
  • Uczyń każdy element (zagnieżdżonym) elastycznym kontenerem i dodaj justify-content: center.
  • teraz każdy element span jest wyśrodkowanym elementem flex.
  • użyj marginesów flex auto, aby przesunąć zewnętrzne span W lewo i w prawo.

Można również zrezygnować justify-content i używać auto marginesów wyłącznie.

Ale justify-content może tu pracować, ponieważ auto marże zawsze mają priorytet. Od spec:

8.1. / Align = "left" / ]} marginesy

Przed wyrównaniem przez justify-content i align-self, wszelkie dodatnia wolna przestrzeń jest dystrybuowana do marginesów automatycznych w tym wymiarze.


Justify-content: space-same (concept)

Powrót do justify-content na chwilę, oto pomysł na jeszcze jedną opcję.

  • space-same ~ hybryda z space-between i space-around. Elementy Flex są równomiernie rozmieszczone (np. space-between), z tym, że zamiast spacji o połowie wielkości na obu końcach (np. space-around), na obu końcach znajdują się spacje o pełnym rozmiarze.

Ten układ można osiągnąć za pomocą ::before oraz ::after pseudoelementy na kontenerze flex.

Tutaj wpisz opis obrazka

(kredyt: @oriol za kod i @crl za Etykietę)

Aktualizacja: Przeglądarki rozpoczęły wdrażanie space-evenly, który spełnia powyższe. Zobacz ten post po szczegóły: równa przestrzeń między elementami flex


Plac zabaw (zawiera kod dla wszystkich przykładów powyżej)

 841
Author: Michael_B,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-19 00:18:44

Wiem, że to nie jest odpowiedź, ale chciałbym przyczynić się do tej sprawy, jeśli to coś warte. Byłoby wspaniale, gdyby mogli wypuścić justify-self dla flexbox, aby był naprawdę elastyczny.

Uważam, że gdy na osi znajduje się wiele elementów, najbardziej logicznym sposobem zachowania justify-self jest dopasowanie się do najbliższych sąsiadów (lub krawędzi), jak pokazano poniżej.

Naprawdę mam nadzieję, że W3C zwróci na to uwagę i chociaż to rozważy. =)

Tutaj wpisz opis obrazka

W ten sposób możesz mieć przedmiot, który jest naprawdę wyśrodkowany niezależnie od rozmiaru lewego i prawego pudełka. Gdy jedno z pudełek osiągnie punkt środkowego pudełka, po prostu je popchnie, aż nie będzie więcej miejsca do dystrybucji.

Tutaj wpisz opis obrazka

Łatwość tworzenia niesamowitych układów jest nieskończona, spójrz na ten" złożony " przykład.

Tutaj wpisz opis obrazka

 88
Author: Mark,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-23 01:01:57

To zostało zadane na liście w stylu www, a Tab Atkins (spec editor) dostarczył odpowiedź wyjaśniającą dlaczego. Rozwiążę to trochę tutaj.

Na początek Załóżmy, że nasz kontener flex jest jednowierszowy (flex-wrap: nowrap). W tym przypadku istnieje wyraźna różnica wyrównania między osią główną a osią poprzeczną - istnieje wiele elementów ułożonych w stos w osi głównej, ale tylko jeden element ułożony w osi poprzecznej. Więc ma sens, aby dostosować-na-przedmiot "align-self" w osi poprzecznej (ponieważ każdy element jest wyrównany osobno, na własną rękę), podczas gdy nie ma to sensu w osi głównej (ponieważ tam, elementy są wyrównane łącznie).

Dla multi-line flexbox, ta sama logika odnosi się do każdej "flex line". W danej linii elementy są wyrównywane pojedynczo w osi poprzecznej (ponieważ w osi poprzecznej jest tylko jeden element na linię), a zbiorczo w osi głównej.


Oto inny sposób wyrażenia tego: tak, wszystkie właściwości *-self i *-content dotyczą sposobu rozprowadzania dodatkowej przestrzeni wokół rzeczy. Ale zasadnicza różnica polega na tym, że wersje *-self są dla przypadków, w których istnieje tylko jedna rzecz w tej osi , A wersje *-contentsą dla sytuacji, w których istnieje potencjalnie wiele rzeczy w tej osi. Scenariusze one-thing vs. many-things są różnymi rodzajami problemów, a więc mają różne rodzaje dostępnych opcji - na przykład space-around / space-between wartości mają sens dla *-content, ale nie dla *-self.

Tak więc: w osi głównej flexboxa jest wiele rzeczy do rozmieszczenia przestrzeni wokół. Więc *-content właściwość ma tam sens, ale nie *-self właściwość.

Natomiast w osi poprzecznej mamy zarówno *-self, jak i *-content własność. Jeden określa, w jaki sposób będziemy dystrybuować przestrzeń wokół wielu linii flex (align-content), podczas gdy drugi (align-self) określa, jak dystrybuować przestrzeń wokół poszczególnych elementów flex w osi poprzecznej, wewnątrz biorąc pod uwagę linię flex.

(ignoruję tutaj właściwości *-items, ponieważ po prostu ustalają wartości domyślne dla *-self.)

 15
Author: dholbert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-27 18:54:26

Jest justify-self, ale w Chrome Canary, a nie w Chrome stable version. Istnieje nawet justify-items:

Tutaj wpisz opis obrazka

Ale z tego co wiem te właściwości też nie działają. Więc prawdopodobnie Google zapisał go wcześniej dla przyszłych wydań CSS. Mam tylko nadzieję, że wkrótce dodadzą właściwości.

 0
Author: Green,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-16 17:25:29

Jest justify-items.

Myślę, że to nowa funkcja. Brak kompatybilności przeglądarki.

 -3
Author: Alex Tan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-20 11:13:48