SlideShare a Scribd company logo
1 of 55
Download to read offline
F l e x b o x
rewolucja w świecie pudełek
Marcin Gajda
The Software House
Prehistoria
Model tabelaryczny
Model tabelaryczny
<table>
<tbody>
<tr>
<td colspan="3">Header</td>
</tr>
<tr>
<td style="width: 20%;">Sidebar</td>
<td style="width: 60%;">Content</td>
<td style="width: 20%;">Ad</td>
</tr>
</tbody>
</table>
Model tabelaryczny
Zalety:
● nie ma problemów z ustawianiem wysokości
● łatwe wyśrodkowywanie elementów
● zachowują się w przewidywalny sposób
Wady:
● wolne renderowanie dla dużych tabel
● łatwo doprowadzić do bałaganu w kodzie
● szablon na tabelach jest nie semantyczny
Era pływających pudełek
Model blokowy
Era pływających pudełek
<div>Header</div>
<div style="width: 20%; float: left;">
Menu
</div>
<div style="width: 60%; float: left;">
Content
</div>
<div style="width: 20%; float: left;">
Ad
</div>
Model blokowy
Zalety:
● przejrzysty i łatwy w utrzymaniu
● elementy szybko się wyświetlają
● pozwala nadać elementom semantyczne znaczenie
Wady:
● utrudnione wyśrodkowywanie
● gorsza elastyczność elementów
● wymaga znajomości sztuczek
Flexbox
● Stworzony z myślą o aplikacjach z zaawansowanym interfejsem (RIA)
● Usprawnia układanie elementów w szablonach aplikacji
● Ułatwia wyrównywanie elementów względem siebie
● Pozwala lepiej wykorzystywać pustą przestrzeń
Wstawiamy flexboxa
.container{
display: flex;
/* display: inline-flex */
}
.item{
/* automatycznie: */
/* display: flex-item; */
}
Domyślny wygląd:
● układ horyzontalny
● szerokość dopasowana do treści
● wysokość wyrównana
● elementy dosunięte do lewej
Kierunek układania
Kierunek układania
.container{
/* flex-direction: row; */
flex-direction: column;
}
Kierunek układania
.container{
/* flex-direction: row; */
flex-direction: column;
}
Kierunek układania (flex-direction)
column column-reverse
row
row-reverse
Zmiana kolejności
Zmiana kolejności
Zmiana kolejności
Zmiana kolejności
Zmiana kolejności
.menu { order: 1 }
.content { order: 2 }
.ad { order: 3 }
@media (max-width: 768px){
.menu { order: 1 }
.content { order: 3 }
.ad { order: 2 }
}
Zmiana kolejności
.menu { order: 1 }
.content { order: 2 }
.ad { order: 3 }
@media (max-width: 768px){
.menu { order: 1 }
.content { order: 3 }
.ad { order: 2 }
}
Kontrolowanie rozmiaru
flex-basis podstawowy rozmiar elementu
(auto | 0 | px | em | percent | … )
flex-grow o jaką część element może się rozszerzyć względem
innych elementów korzystając z wolnego miejsca
(liczba całkowita bez jednostki)
flex-shrink o jaką część element może się zmniejszyć względem
innych elementów korzystając z dostępnego miejsca
(liczba całkowita bez jednostki)
Kontrolowanie rozmiaru
.left { flex-grow: 0 }
.middle { flex-grow: 0 }
.right { flex-grow: 0 }
Kontrolowanie rozmiaru
.left { flex-grow: 0 }
.middle { flex-grow: 0 }
.right { flex-grow: 0 }
.left { flex-grow: 1 }
.middle { flex-grow: 1 }
.right { flex-grow: 1 }
Kontrolowanie rozmiaru
.left { flex-grow: 0 }
.middle { flex-grow: 0 }
.right { flex-grow: 0 }
.left { flex-grow: 1 }
.middle { flex-grow: 1 }
.right { flex-grow: 1 }
Kontrolowanie rozmiaru
.left { flex-grow: 1 }
.middle { flex-grow: 1 }
.right { flex-grow: 1 }
Kontrolowanie rozmiaru
.left { flex-grow: 1 }
.middle { flex-grow: 1 }
.right { flex-grow: 1 }
.left { flex-grow: 1 }
.middle { flex-grow: 2 }
.right { flex-grow: 1 }
Kontrolowanie rozmiaru
.left { flex-basis: 300px; flex-shrink: 2; }
.middle { flex-basis: 300px; flex-shrink: 1; }
.right { flex-basis: 300px; flex-shrink: 1; }
Kontrolowanie rozmiaru
/* flex: [flex-grow] [flex-shrink] [flex-basis]; */
.avatar { flex: 0 0 100px; }
.comment { flex: 1 0 400px; }
Kontrolowanie rozmiaru
/* flex: [flex-grow] [flex-shrink] [flex-basis]; */
.avatar { flex: 0 0 100px; }
.comment { flex: 1 0 400px; }
Zawijanie elementów
.container{
/* flex-wrap: nowrap; */
flex-wrap: wrap;
/* flex-flow: [flex-direction] [flex-wrap] */
flex-flow: row nowrap;
}
Zawijanie elementów (flex-wrap)
column column-reverse
row
row-reverse
Przykład
Przykład
.container{
display: flex;
flex-flow: row wrap;
max-width: 1024px;
}
.header{
flex-basis: 100%;
}
Przykład
.menu { flex: 0 1 100px; }
.content { flex: 1 1 auto; min-height: 200px; }
.ad { flex: 0 1 100px; }
@media screen and (max-width: 400px) {
.container{
flex-direction: column;
}
}
Wyrównywanie
justify-content wypełnienie elementami w osi głównej
align-content wypełnienie rzędami w osi poprzecznej
align-items wyrównanie wszystkich elementów w osi poprzecznej
(przypisywane kontenerowi)
align-self wyrównanie elementu w osi poprzecznej
(przypisywane danemu elementowi)
Wyrównywanie (justify-content)
flex-start
flex-end
center
space-around
space-between
Wyrównywanie (justify-content)
justify-content: space-between
Wyrównywanie (align-content)
.container{
display: flex;
flex-flow: column wrap;
align-content: space-around;
}
Wyrównywanie (justify-items)
flex-start
flex-end
center
stretch
baseline
Wyrównywanie (justify-items)
flex-start
flex-end
center
stretch
baseline
Wyrównywanie (align-self)
.container{
display: flex;
align-items: flex-start;
}
.middle-item{
align-self: flex-end;
}
.container{
display: flex;
align-items: center;
justify-content: center;
}
.container{
display: flex;
align-items: center;
justify-content: center;
}
Wsparcie?
Kłody pod nogi...
● część przeglądarek wymaga prefiksów (-ms-, -webkit-)
● brak wsparcia na IE8 i IE9
● istnieją różne wersje specyfikacji flexboxa
● pojedyncze błędy w obsłudze
Rozwiązania
● gotowy framework dla flexboxa:
http://flexboxgrid.com/
● obejścia dla różnych problemów z flexboxem:
https://github.com/philipwalton/flexbugs
Pytania?
@elektryk91

More Related Content

Viewers also liked

Deploy appki na iOS, czyli magia publikacji
Deploy appki na iOS, czyli magia publikacjiDeploy appki na iOS, czyli magia publikacji
Deploy appki na iOS, czyli magia publikacjiThe Software House
 
Dependency Injection w Androidzie
Dependency Injection w AndroidzieDependency Injection w Androidzie
Dependency Injection w AndroidzieThe Software House
 
Praktyczne porady na temat optymalizacji wydajności aplikacji tworzonych z u...
Praktyczne porady na temat optymalizacji wydajności aplikacji tworzonych z u...Praktyczne porady na temat optymalizacji wydajności aplikacji tworzonych z u...
Praktyczne porady na temat optymalizacji wydajności aplikacji tworzonych z u...The Software House
 
Wprowadzenie do języka Swift, czyli nowe podejście do programowania aplikacji...
Wprowadzenie do języka Swift, czyli nowe podejście do programowania aplikacji...Wprowadzenie do języka Swift, czyli nowe podejście do programowania aplikacji...
Wprowadzenie do języka Swift, czyli nowe podejście do programowania aplikacji...The Software House
 
Pierwsza aplikacja na iOS, czyli z czym można się spotkać, co jest trudne i c...
Pierwsza aplikacja na iOS, czyli z czym można się spotkać, co jest trudne i c...Pierwsza aplikacja na iOS, czyli z czym można się spotkać, co jest trudne i c...
Pierwsza aplikacja na iOS, czyli z czym można się spotkać, co jest trudne i c...The Software House
 
Gulp.js - alternatywa do Grunta
Gulp.js - alternatywa do GruntaGulp.js - alternatywa do Grunta
Gulp.js - alternatywa do GruntaThe Software House
 
Pi razy drzwi - o szacowaniu projektów
Pi razy drzwi - o szacowaniu projektówPi razy drzwi - o szacowaniu projektów
Pi razy drzwi - o szacowaniu projektówThe Software House
 
Tester - przyjaciel czy wróg programisty?
Tester - przyjaciel czy wróg programisty?Tester - przyjaciel czy wróg programisty?
Tester - przyjaciel czy wróg programisty?The Software House
 
Angular 2.0 – Kochaj albo rzuć!
Angular 2.0 – Kochaj albo rzuć!Angular 2.0 – Kochaj albo rzuć!
Angular 2.0 – Kochaj albo rzuć!The Software House
 
Bitcoin - (nie)udany eksperyment?
Bitcoin - (nie)udany eksperyment?Bitcoin - (nie)udany eksperyment?
Bitcoin - (nie)udany eksperyment?The Software House
 
PSR-7 - HTTP message interfaces
PSR-7 - HTTP message interfacesPSR-7 - HTTP message interfaces
PSR-7 - HTTP message interfacesThe Software House
 
Inżynieria społeczna jako element testów bezpieczeństwa - tylko teoria, czy j...
Inżynieria społeczna jako element testów bezpieczeństwa - tylko teoria, czy j...Inżynieria społeczna jako element testów bezpieczeństwa - tylko teoria, czy j...
Inżynieria społeczna jako element testów bezpieczeństwa - tylko teoria, czy j...The Software House
 
Angular restmod – wygodny sposób na komunikację z API
Angular restmod – wygodny sposób na komunikację z APIAngular restmod – wygodny sposób na komunikację z API
Angular restmod – wygodny sposób na komunikację z APIThe Software House
 
You Shall Not Pass - Security in Symfony
You Shall Not Pass - Security in SymfonyYou Shall Not Pass - Security in Symfony
You Shall Not Pass - Security in SymfonyThe Software House
 

Viewers also liked (20)

Deploy appki na iOS, czyli magia publikacji
Deploy appki na iOS, czyli magia publikacjiDeploy appki na iOS, czyli magia publikacji
Deploy appki na iOS, czyli magia publikacji
 
Deployment z Ansible
Deployment z AnsibleDeployment z Ansible
Deployment z Ansible
 
Dependency Injection w Androidzie
Dependency Injection w AndroidzieDependency Injection w Androidzie
Dependency Injection w Androidzie
 
Docker
DockerDocker
Docker
 
Praktyczne porady na temat optymalizacji wydajności aplikacji tworzonych z u...
Praktyczne porady na temat optymalizacji wydajności aplikacji tworzonych z u...Praktyczne porady na temat optymalizacji wydajności aplikacji tworzonych z u...
Praktyczne porady na temat optymalizacji wydajności aplikacji tworzonych z u...
 
Wprowadzenie do języka Swift, czyli nowe podejście do programowania aplikacji...
Wprowadzenie do języka Swift, czyli nowe podejście do programowania aplikacji...Wprowadzenie do języka Swift, czyli nowe podejście do programowania aplikacji...
Wprowadzenie do języka Swift, czyli nowe podejście do programowania aplikacji...
 
PHP 7
PHP 7PHP 7
PHP 7
 
Pierwsza aplikacja na iOS, czyli z czym można się spotkać, co jest trudne i c...
Pierwsza aplikacja na iOS, czyli z czym można się spotkać, co jest trudne i c...Pierwsza aplikacja na iOS, czyli z czym można się spotkać, co jest trudne i c...
Pierwsza aplikacja na iOS, czyli z czym można się spotkać, co jest trudne i c...
 
Gulp.js - alternatywa do Grunta
Gulp.js - alternatywa do GruntaGulp.js - alternatywa do Grunta
Gulp.js - alternatywa do Grunta
 
O Electronie słów kilka
O Electronie słów kilkaO Electronie słów kilka
O Electronie słów kilka
 
Pi razy drzwi - o szacowaniu projektów
Pi razy drzwi - o szacowaniu projektówPi razy drzwi - o szacowaniu projektów
Pi razy drzwi - o szacowaniu projektów
 
Tester - przyjaciel czy wróg programisty?
Tester - przyjaciel czy wróg programisty?Tester - przyjaciel czy wróg programisty?
Tester - przyjaciel czy wróg programisty?
 
Angular 2.0 – Kochaj albo rzuć!
Angular 2.0 – Kochaj albo rzuć!Angular 2.0 – Kochaj albo rzuć!
Angular 2.0 – Kochaj albo rzuć!
 
Bitcoin - (nie)udany eksperyment?
Bitcoin - (nie)udany eksperyment?Bitcoin - (nie)udany eksperyment?
Bitcoin - (nie)udany eksperyment?
 
PSR-7 - HTTP message interfaces
PSR-7 - HTTP message interfacesPSR-7 - HTTP message interfaces
PSR-7 - HTTP message interfaces
 
Persisting Value Objects
Persisting Value ObjectsPersisting Value Objects
Persisting Value Objects
 
Inżynieria społeczna jako element testów bezpieczeństwa - tylko teoria, czy j...
Inżynieria społeczna jako element testów bezpieczeństwa - tylko teoria, czy j...Inżynieria społeczna jako element testów bezpieczeństwa - tylko teoria, czy j...
Inżynieria społeczna jako element testów bezpieczeństwa - tylko teoria, czy j...
 
Angular restmod – wygodny sposób na komunikację z API
Angular restmod – wygodny sposób na komunikację z APIAngular restmod – wygodny sposób na komunikację z API
Angular restmod – wygodny sposób na komunikację z API
 
Testing and symfony2
Testing and symfony2Testing and symfony2
Testing and symfony2
 
You Shall Not Pass - Security in Symfony
You Shall Not Pass - Security in SymfonyYou Shall Not Pass - Security in Symfony
You Shall Not Pass - Security in Symfony
 

More from The Software House

Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...
Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...
Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...The Software House
 
Jak efektywnie podejść do certyfikacji w AWS?
Jak efektywnie podejść do certyfikacji w AWS?Jak efektywnie podejść do certyfikacji w AWS?
Jak efektywnie podejść do certyfikacji w AWS?The Software House
 
O co chodzi z tą dostępnością cyfrową?
O co chodzi z tą dostępnością cyfrową?O co chodzi z tą dostępnością cyfrową?
O co chodzi z tą dostępnością cyfrową?The Software House
 
Chat tekstowy z użyciem Amazon Chime
Chat tekstowy z użyciem Amazon ChimeChat tekstowy z użyciem Amazon Chime
Chat tekstowy z użyciem Amazon ChimeThe Software House
 
Jak nie zwariować z architekturą Serverless?
Jak nie zwariować z architekturą Serverless?Jak nie zwariować z architekturą Serverless?
Jak nie zwariować z architekturą Serverless?The Software House
 
Analiza semantyczna artykułów prasowych w 5 sprintów z użyciem AWS
Analiza semantyczna artykułów prasowych w 5 sprintów z użyciem AWSAnaliza semantyczna artykułów prasowych w 5 sprintów z użyciem AWS
Analiza semantyczna artykułów prasowych w 5 sprintów z użyciem AWSThe Software House
 
Feature flags na ratunek projektu w JavaScript
Feature flags na ratunek projektu w JavaScriptFeature flags na ratunek projektu w JavaScript
Feature flags na ratunek projektu w JavaScriptThe Software House
 
Typowanie nominalne w TypeScript
Typowanie nominalne w TypeScriptTypowanie nominalne w TypeScript
Typowanie nominalne w TypeScriptThe Software House
 
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQL
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQLAutomatyzacja tworzenia frontendu z wykorzystaniem GraphQL
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQLThe Software House
 
Serverless Compose vs hurtownia danych
Serverless Compose vs hurtownia danychServerless Compose vs hurtownia danych
Serverless Compose vs hurtownia danychThe Software House
 
Testy API: połączenie z bazą danych czy implementacja w pamięci
Testy API: połączenie z bazą danych czy implementacja w pamięciTesty API: połączenie z bazą danych czy implementacja w pamięci
Testy API: połączenie z bazą danych czy implementacja w pamięciThe Software House
 
Jak skutecznie read model. Case study
Jak skutecznie read model. Case studyJak skutecznie read model. Case study
Jak skutecznie read model. Case studyThe Software House
 
Firestore czyli ognista baza od giganta z Doliny Krzemowej
Firestore czyli ognista baza od giganta z Doliny KrzemowejFirestore czyli ognista baza od giganta z Doliny Krzemowej
Firestore czyli ognista baza od giganta z Doliny KrzemowejThe Software House
 
Jak utrzymać stado Lambd w ryzach
Jak utrzymać stado Lambd w ryzachJak utrzymać stado Lambd w ryzach
Jak utrzymać stado Lambd w ryzachThe Software House
 
O łączeniu Storyblok i Next.js
O łączeniu Storyblok i Next.jsO łączeniu Storyblok i Next.js
O łączeniu Storyblok i Next.jsThe Software House
 
Amazon Step Functions. Sposób na implementację procesów w chmurze
Amazon Step Functions. Sposób na implementację procesów w chmurzeAmazon Step Functions. Sposób na implementację procesów w chmurze
Amazon Step Functions. Sposób na implementację procesów w chmurzeThe Software House
 
Od Figmy do gotowej aplikacji bez linijki kodu
Od Figmy do gotowej aplikacji bez linijki koduOd Figmy do gotowej aplikacji bez linijki kodu
Od Figmy do gotowej aplikacji bez linijki koduThe Software House
 

More from The Software House (20)

Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...
Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...
Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...
 
Uszanowanko Podsumowanko
Uszanowanko PodsumowankoUszanowanko Podsumowanko
Uszanowanko Podsumowanko
 
Jak efektywnie podejść do certyfikacji w AWS?
Jak efektywnie podejść do certyfikacji w AWS?Jak efektywnie podejść do certyfikacji w AWS?
Jak efektywnie podejść do certyfikacji w AWS?
 
O co chodzi z tą dostępnością cyfrową?
O co chodzi z tą dostępnością cyfrową?O co chodzi z tą dostępnością cyfrową?
O co chodzi z tą dostępnością cyfrową?
 
Chat tekstowy z użyciem Amazon Chime
Chat tekstowy z użyciem Amazon ChimeChat tekstowy z użyciem Amazon Chime
Chat tekstowy z użyciem Amazon Chime
 
Migracje danych serverless
Migracje danych serverlessMigracje danych serverless
Migracje danych serverless
 
Jak nie zwariować z architekturą Serverless?
Jak nie zwariować z architekturą Serverless?Jak nie zwariować z architekturą Serverless?
Jak nie zwariować z architekturą Serverless?
 
Analiza semantyczna artykułów prasowych w 5 sprintów z użyciem AWS
Analiza semantyczna artykułów prasowych w 5 sprintów z użyciem AWSAnaliza semantyczna artykułów prasowych w 5 sprintów z użyciem AWS
Analiza semantyczna artykułów prasowych w 5 sprintów z użyciem AWS
 
Feature flags na ratunek projektu w JavaScript
Feature flags na ratunek projektu w JavaScriptFeature flags na ratunek projektu w JavaScript
Feature flags na ratunek projektu w JavaScript
 
Typowanie nominalne w TypeScript
Typowanie nominalne w TypeScriptTypowanie nominalne w TypeScript
Typowanie nominalne w TypeScript
 
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQL
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQLAutomatyzacja tworzenia frontendu z wykorzystaniem GraphQL
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQL
 
Serverless Compose vs hurtownia danych
Serverless Compose vs hurtownia danychServerless Compose vs hurtownia danych
Serverless Compose vs hurtownia danych
 
Testy API: połączenie z bazą danych czy implementacja w pamięci
Testy API: połączenie z bazą danych czy implementacja w pamięciTesty API: połączenie z bazą danych czy implementacja w pamięci
Testy API: połączenie z bazą danych czy implementacja w pamięci
 
Jak skutecznie read model. Case study
Jak skutecznie read model. Case studyJak skutecznie read model. Case study
Jak skutecznie read model. Case study
 
Firestore czyli ognista baza od giganta z Doliny Krzemowej
Firestore czyli ognista baza od giganta z Doliny KrzemowejFirestore czyli ognista baza od giganta z Doliny Krzemowej
Firestore czyli ognista baza od giganta z Doliny Krzemowej
 
Jak utrzymać stado Lambd w ryzach
Jak utrzymać stado Lambd w ryzachJak utrzymać stado Lambd w ryzach
Jak utrzymać stado Lambd w ryzach
 
Jak poskromić AWS?
Jak poskromić AWS?Jak poskromić AWS?
Jak poskromić AWS?
 
O łączeniu Storyblok i Next.js
O łączeniu Storyblok i Next.jsO łączeniu Storyblok i Next.js
O łączeniu Storyblok i Next.js
 
Amazon Step Functions. Sposób na implementację procesów w chmurze
Amazon Step Functions. Sposób na implementację procesów w chmurzeAmazon Step Functions. Sposób na implementację procesów w chmurze
Amazon Step Functions. Sposób na implementację procesów w chmurze
 
Od Figmy do gotowej aplikacji bez linijki kodu
Od Figmy do gotowej aplikacji bez linijki koduOd Figmy do gotowej aplikacji bez linijki kodu
Od Figmy do gotowej aplikacji bez linijki kodu
 

Flexbox - rewolucja w świecie pudełek