CSS Flex Box Layout (wł. Flexible Box) – moduł zapewniający efektywniejszy i skuteczniejszy sposób na zarządzanie wyrównaniem, rozkładem elementów wewnątrz kontenerów oraz samymi kontenerami. Głównym założeniem flexboxa jest nadanie elementom możliwości zmiany szerokości, wysokości oraz rozmieszczenia w różnych konfiguracjach
Dzięki flex można łatwiej przygotować responsywny układ strony bez konieczności używania float i position.
Flexbox to nie układ blokowy i w odniesieniu do niego nie zadziałają:
float, clear, vertical-align, :first-line, :first-letter

Zdefiniowanie flexboxa na schemacie
Przede wszystkim należy zdefiniować:
Konieczne są: pojemnik zewnętrzny i wewnętrzne elementy, które będą układane flexem. Pojemnik musi mieć display wybrane na flex (lub inline-flex) i wtedy każdy element, który się w nim znajdzie automatycznie będzie podlegał ustawieniom flex.

Dodatkowe opcje to: flex-direction flex-wrap flex-flow justify-content align-items align-content
Aby zacząć korzystać z Flexbox, należy zedefiniować element, który stanie się kontenerem, który opakowuje wszystkie elementy potomne w następujący sposób:
<div class="container">
<div>1</div>
<div>2</div>
<div>3</div>
</div>
Kontener staje się elastyczny przez przestawienie właściwości display na flex:
.container {
display: flex;
background-color: red;
}
.container div{
background-color: #f1f1f1;
margin: 10px;
padding: 20px;
font-size: 30px;
}
Oto rezultat:

1) flex-direction określa jak dzieci ułożone są w linii main-axis, czyli w osi głównej. Ustala kierunek. Możliwe wartości:

2) flex-wrap określa czy dzieci będą przechodzić do nowej linii czy nie i w jakiej kolejności.

3) flex-flow to skrót – zawiera w sobie flex-direction i flex-wrap np. div { flex-flow: column wrap; }.
4) justify-content – wyrównanie w poziomie

5) align-items określa wyrównanie pojemników w pionie.

6) align-content: wyrównuje skrzyneczki flex-containera w osi głównej, ustawia je w pionie kiedy jest więcej niż jedna linia.

1) align-self: pionowe wyrównanie skrzyneczek (flex items) wewnętrznego kontenera ()
Pojemniki 1, 2 3 mają atrybut align-self odpowiednio ustawiony na : flex-start, center i flex-end powoduje, że ich wysokość, nie zostaje rozciągnięta do rozmiaru pojemnika tylko zachowuje automatyczną wysokość zależną od zawartości i jest wyrównana w pionie do góry, środka i dołu w stosunku do pozostałych.

Położenie konkretnej skrzynki (dziecka) w kontenerze (rodzicu) – align-self
2) order: (wart. domyślna 0) umożliwia zmianę domyślnej kolejności wyświetlania się dzieci (innej niż została zapisana w kodzie).
Jeśli np. trzeciej zakładce w poziomym menu przypiszemy order: -1; to pojawi się ona wcześniej niż wszystkie pozostałe, konkretnie przed pierwszą.

3) flex-grow: (wart. domyślna 0) – określa, o ile pojemnik wzrośnie w stosunku do pozostałych pojemników elastycznych w tym samym kontenerze. Wartością jest numer i określa proporcje w jakich jeden z elementów będzie rósł względem pozostałych przy rozszerzaniu okna.
Np. flex-grow: 2; – pojemnik otrzymuje szerokość 2 razy większą od pozostałych, jeżeli pozostałe pojemniki mają parametr style=”flex-grow:1”, wtedy zachowują wyjściową szerokość, jeżeli nie, mogą być zwężone po to aby ten, który ma ustawienie flex-grow:2 rzeczywiście miał 2 razy większą szerokość od pozostałych i żeby wszyscy zmieścili się w u kontenerze.

4) flex-shrink: (domyślnie: 1) zmniejszanie procentowe szerokości wszystkich pojemników, tak, żeby zmieściły się w kontenerze. Wartością jest numer i określa proporcje w jakich jeden z elementów będzie się kurczył względem pozostałych przy zwężaniu okna.
Np. align-items: stretch i flex-shrink:0. Atrybut align-items:stretch, powoduje dopasowanie rozmiarów pojemników wewnętrznych, odpowiednio zwężając je tak aby wszyscy zmieścili się w rzędzie, jeżeli jedne z nich ma ustawienie: style=”flex-shrink:0”, to ten pojemnik nie zostaje zwężony i zachowuje wyjściową szerokość.
5) flex-basis (domyślnie auto) dla wybranego pojemnika ustala konkretny rozmiar [auto, długość (np. px) lub %]. Np. style=”flex-basis:300px;”

6) flex: (domyślnie 0 1 auto) – jedno-liniowy zapis dla flex-grow, flex-shrink, flex-basis.
Np. polecenie style="flex: 0 0 300px;" dla drugiego pojemnika, pierwsze 0 odwołuje się do flex-grow:0, czyli ma nie być zwiększany, drugie 0 do flex-shrink, czyli ma nie być zmniejszany, a 300px do flex-basis czyli podaje jego konkretną szerokość.
Możemy również użyć zapisu flex:25% co oznacza, że flex-grow i flex-shrink mają wartości domyślne.
Przykładowy kod CSS dla kontenera i trzech elementów:
.flex-container {
display: flex;
flex-direction: row;
flex-wrap: wrap;
justify-content: flex-start;
align-content: flex-start;
align-items: flex-start;
}
.flex-item:nth-child(1) {
order: 0;
flex: 0 1 auto;
align-self: auto;
}
.flex-item:nth-child(2) {
order: 0;
flex: 0 1 auto;
align-self: auto;
}
.flex-item:nth-child(3) {
order: 0;
flex: 0 1 auto;
align-self: auto;
}