Flexbox - introduction

Short layout history

  • Long time ago - no layout - top to bottom
  • Some time ago - tables
  • Today - CSS, divs, floats, positioning, lots of hacks

What is flexbox

  • "New" component layout system
  • One solution to solve all problems problems with block, inline, positioned, table layout systems
  • Separation of content and view
<div class="row"> <div class="col-md-8"> .col-md-8 <div class="row"> <div class="col-md-6"> .col-md-6 </div> <div class="col-md-6"> .col-md-6 </div> </div> </div> <div class="col-md-4"> .col-md-4 </div> </div>

Short history

Browser support

Basic usage

<div style="display: flex"> <div>Flex item</div> <span>Flex item</span> <div>Flex item</div> </div>
Flex item
Flex item
Flex item
Flex container

Direction

Direction of main axis
flex-direction: row | row-reverse | column | column-reverse;
<div style="display: flex; flex-direction: column;"> <div>Flex item</div> <div>Flex item</div> <div>Flex item</div> </div>
Flex item
Flex item
Flex item

Wrapping

Without wrapping rule, all flex items are in one row.
<div style="display: flex; width: 300px;"> <div>Flex item</div><div>Flex item</div> <div>Flex item</div><div>Flex item</div> <div>Flex item</div><div>Flex item</div> <div>Flex item</div><div>Flex item</div> </div>
Flex item
Flex item
Flex item
Flex item
Flex item
Flex item
Flex item
Flex item

Wrapping 2

Wrapping in main axis
flex-wrap: nowrap | wrap | wrap-reverse;
<div style="display: flex; width: 300px; flex-wrap: wrap;"> <div>Flex item</div><div>Flex item</div> <div>Flex item</div><div>Flex item</div> <div>Flex item</div><div>Flex item</div> <div>Flex item</div><div>Flex item</div> </div>
Flex item
Flex item
Flex item
Flex item
Flex item
Flex item
Flex item
Flex item

Direction + wrapping = flex-flow

Wrapping in main axis
flex-flow: <'flex-direction'> || <'flex-wrap'>;
<div style="display: flex; width: 600px; height: 300px; flex-flow: column wrap;"> <div style="width: 100px;">Flex item 1</div><div style="width: 100px;">Flex item 2</div> <div style="width: 100px;">Flex item 3</div><div style="width: 100px;">Flex item 4</div> <div style="width: 100px;">Flex item 5</div><div style="width: 100px;">Flex item 6</div> <div style="width: 100px;">Flex item 7</div><div style="width: 100px;">Flex item 8</div> </div>
Flex item 1
Flex item 2
Flex item 3
Flex item 4
Flex item 5
Flex item 6
Flex item 7
Flex item 8

Justify

Alignment in main axis
justify-content: flex-start | flex-end | center | space-between | space-around;
<div style="display: flex; justify-content: space-between;"> <div>Flex item</div> <div>Flex item</div> <div>Flex item</div> </div>
flex-start
Flex item
Flex item
Flex item
flex-end
Flex item
Flex item
Flex item
center
Flex item
Flex item
Flex item
space-between
Flex item
Flex item
Flex item
space-around
Flex item
Flex item
Flex item

Justify with column direction

Alignment in main axis
justify-content: flex-start | flex-end | center | space-between | space-around;
<div style="display: flex; justify-content: space-around; flex-direction: column; height: 300px;"> <div>Flex item</div> <div>Flex item</div> <div>Flex item</div> </div>
Flex item
Flex item
Flex item

Vertical alignment

Vertical alignment in main axis
align-items: flex-start | flex-end | center | baseline | stretch;
<div style="display: flex; height: 100px; align-items: flex-end"> <div>Flex item</div> <div style="font-size: 15px;">Flex item</div> </div>
Flex item
Flex item
Flex item
Flex item
Flex item
Flex item
Flex item
Flex item
Flex item
Flex item

Vertical alignment of items

Every item can be aligned separately
align-self: flex-start | flex-end | center | baseline | stretch;
<div style="display: flex; height: 100px;"> <div style="align-self: flex-start">Flex item</div> <div style="align-self: flex-end">Flex item</div> <div style="align-self: center">Flex item</div> <div style="align-self: baseline; font-size: 15px;">Flex item</div> <div style="align-self: stretch">Flex item</div> </div>
Flex item
Flex item
Flex item
Flex item
Flex item

Order

Items can be ordered to show them differently on various devices
<div style="display: flex;"> <div style="order: 2;">Flex item 1</div> <div style="order: 3;">Flex item 2</div> <div style="order: 1;">Flex item 3</div> </div>
Flex item 1
Flex item 2
Flex item 3

Automatic resizing - flex-grow

Used to fill available space
flex-grow: <number>; /* default 0 */
<div style="display: flex;"> <div style="flex-grow: 2;">Flex item</div> <div style="width: 100px;">Flex item</div> <div style="flex-grow: 1;">Flex item</div> </div>

Without flex-grow

Flex item
Flex item
Flex item

With flex-grow

Flex item
Flex item
Flex item

Automatic resizing - flex-shrink

Used to shrink items if there is not enough space
flex-shrink: <number>; /* default 0 */
<div style="display: flex;"> <div style="flex-shrink: 2;">Flex item A B C D E F G H I J</div> <div style="width: 800px;">Flex item</div> <div style="flex-shrink: 1;">Flex item A B C D E F G H I J</div> </div>

Without flex-shrink

Flex item A B C D E F G H I J
Flex item
Flex item A B C D E F G H I J

Without flex-shrink

Flex item A B C D E F G H I J
Flex item
Flex item A B C D E F G H I J

Automatic resizing - flex-basis

Base size of item before calculating shrink or grow
flex-basis: <length> | auto; /* default auto */
<div style="display: flex;"> <div style="flex-grow: 4; flex-basis: 0px;">Flex item</div> <div style="width: 100px;">Flex item</div> <div style="flex-grow: 1; flex-basis: 0px;">Flex item</div> </div>

With flex-basis: 0px;

Flex item
Flex item
Flex item

Without flex-basis: 0px;

Flex item
Flex item
Flex item

Automatic resizing - flex

Short version to define resizing
flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
<div style="display: flex;"> <div style="flex: 1;">Flex item</div> <div style="flex: 4;">Flex item</div> <div style="flex: 2;">Flex item</div> </div> <div style="display: flex;"> <div style="flex: 1;">Flex item</div> <div style="flex: 4 1 0px;">Flex item</div> <div style="flex: 2 0px;">Flex item</div> </div>
Flex item
Flex item
Flex item

Recipe - centering

<div style="display: flex; height: 300px; width: 400px; align-items: center;"> <div>Vertically centered div</div> </div> <div style="display: flex; height: 300px; width: 400px; justify-content: center; align-items: flex-start;"> <div>Horizontally centered div</div> </div>
Vertically centered div
Horizontally centered div

Recipe - centering

Vertical centering finally possible, no distinction between inline and block items
<div style="display: flex; height: 100px; width: 400px; justify-content: center; align-items: center;"> <div>Perfectly centered div</div> </div> <div style="display: flex; height: 100px; width: 400px; justify-content: center; align-items: center;"> <span>Perfectly centered span</span> <span>Other span</span> </div>
Perfectly centered div
Perfectly centered span Other span

Recipe - float:left, float:right

no magic with floats, clearfixes and paddings
<div style="display: flex; justify-content: space-between;"> <div style="display: flex; align-items: center;"> <button>Button A</button> <button style="font-size: 20px;">Button B</button> </div> <div style="display: flex; align-items: center;"> <button>Button C</button> </div> </div>

Recipe - input + button

<div style="display: flex; width: 700px;"> <input type="text" style="flex: 1"></input> <button>Search</button> </div>

Recipe - Holy Grail layout

<body> <header>HEADER</header> <div id="main"> <article id="main-content"></article> <nav id="menu">MENU</nav> <aside id="ads">ADS</aside> </div> <footer>FOOTER</footer> </body> body { margin: 0px; padding: 0px; display: flex; height: 100vh; flex-flow: column; } #main { display: flex; flex: 1 0 auto; } #main-content { flex: 1; overflow-y: scroll; } #menu { width: 200px; } #ads { width: 100px; } header, footer { flex: none; }

Flexbox defense

Is flexbox solution to all problems?

No! Grid system is next. display: grid .container{ grid-template-columns: [first] 40px [line2] 50px [line3] auto [col4-start] 50px [five] 40px [end]; grid-template-rows: [row1-start] 25% [row1-end] 100% [third-line] auto [last-line]; }

Materials:

/