Stacks consist in a set of utilites leveraging the power of CSS flexbox in order to give you the ability to build complex layouts. A stack can be nested inside another stack, making it possible to create a wide range of layouts.
Notice: Don't use stacks when the layout you're aiming for depends on the grid, use the grid itself.
To start using the stack utilities, make sure the container has display: flex or display: inline-flex. You can use the .ecl-u-d-flex or .ecl-u-d-inline-flex classes for this.
<div class="demo-container ecl-u-d-flex">Flex container</div>
Inline flex container
<div class="demo-container ecl-u-d-inline-flex"> <p class="iRCJJeCgSXzX9ymLg1TH">Inline flex container</p> </div>
Then you can start adding items to the container:
<div class="demo-container ecl-u-d-flex"> <div class="demo-box">Item 1</div> <div class="demo-box">Item 2</div> <div class="demo-box">Item 3</div> </div>
Direction
The first propery you can set on the flex container is the direction. There are 4 possibilites:
- row:
.ecl-u-flex-row(default) - row reverse:
.ecl-u-flex-row-reverse - column:
.ecl-u-flex-column - column reverse:
.ecl-u-flex-column-reverse
<div class="demo-container ecl-u-d-flex ecl-u-flex-row"> <div class="demo-box">Item 1</div> <div class="demo-box">Item 2</div> <div class="demo-box">Item 3</div> </div>
<div class="demo-container ecl-u-d-flex ecl-u-flex-row-reverse"> <div class="demo-box">Item 1</div> <div class="demo-box">Item 2</div> <div class="demo-box">Item 3</div> </div>
<div class="demo-container ecl-u-d-flex ecl-u-flex-column"> <div class="demo-box">Item 1</div> <div class="demo-box">Item 2</div> <div class="demo-box">Item 3</div> </div>
<div class="demo-container ecl-u-d-flex ecl-u-flex-column-reverse"> <div class="demo-box">Item 1</div> <div class="demo-box">Item 2</div> <div class="demo-box">Item 3</div> </div>
Wrap
You can decide to not wrap the items (the flex container is single-line) or to wrap them (the flex container is multi-line)
- no wrap:
.ecl-u-flex-nowrap(default) - wrap:
.ecl-u-flex-wrap - wrap reverse:
.ecl-u-flex-wrap-reverse
<div class="demo-container demo-container--small ecl-u-d-flex ecl-u-flex-nowrap"> <div class="demo-box">Item 1</div> <div class="demo-box">Item 2</div> <div class="demo-box">Item 3</div> <div class="demo-box">Item 4</div> <div class="demo-box">Item 5</div> <div class="demo-box">Item 6</div> <div class="demo-box">Item 7</div> </div>
<div class="demo-container demo-container--small ecl-u-d-flex ecl-u-flex-wrap"> <div class="demo-box">Item 1</div> <div class="demo-box">Item 2</div> <div class="demo-box">Item 3</div> <div class="demo-box">Item 4</div> <div class="demo-box">Item 5</div> <div class="demo-box">Item 6</div> <div class="demo-box">Item 7</div> </div>
<div class="demo-container demo-container--small ecl-u-d-flex ecl-u-flex-wrap-reverse"> <div class="demo-box">Item 1</div> <div class="demo-box">Item 2</div> <div class="demo-box">Item 3</div> <div class="demo-box">Item 4</div> <div class="demo-box">Item 5</div> <div class="demo-box">Item 6</div> <div class="demo-box">Item 7</div> </div>
Alignment
Main-axis: justify-content
You can use justify-content utilities to change the alignment of the items on the main-axis.
Available utilities include:
.ecl-u-justify-content-start(default behaviour).ecl-u-justify-content-end.ecl-u-justify-content-center.ecl-u-justify-content-between.ecl-u-justify-content-around
<div class="demo-container ecl-u-d-flex ecl-u-justify-content-start"> <div class="demo-box">Item 1</div> <div class="demo-box">Item 2</div> <div class="demo-box">Item 3</div> </div>
<div class="demo-container ecl-u-d-flex ecl-u-justify-content-end"> <div class="demo-box">Item 1</div> <div class="demo-box">Item 2</div> <div class="demo-box">Item 3</div> </div>
<div class="demo-container ecl-u-d-flex ecl-u-justify-content-center"> <div class="demo-box">Item 1</div> <div class="demo-box">Item 2</div> <div class="demo-box">Item 3</div> </div>
<div class="demo-container ecl-u-d-flex ecl-u-justify-content-between"> <div class="demo-box">Item 1</div> <div class="demo-box">Item 2</div> <div class="demo-box">Item 3</div> </div>
<div class="demo-container ecl-u-d-flex ecl-u-justify-content-around"> <div class="demo-box">Item 1</div> <div class="demo-box">Item 2</div> <div class="demo-box">Item 3</div> </div>
Cross-axis: align-items
You can use align-items utilities to change the alignment of the items on the cross-axis.
Available utilities include:
.ecl-u-align-items-start.ecl-u-align-items-end.ecl-u-align-items-center.ecl-u-align-items-baseline.ecl-u-align-items-stretch(default behaviour)
<div class="demo-container demo-container--default-height-small ecl-u-d-flex ecl-u-align-items-start"> <div class="demo-box">Item 1</div> <div class="demo-box">Item 2</div> <div class="demo-box">Item 3</div> </div>
<div class="demo-container demo-container--default-height-small ecl-u-d-flex ecl-u-align-items-end"> <div class="demo-box">Item 1</div> <div class="demo-box">Item 2</div> <div class="demo-box">Item 3</div> </div>
<div class="demo-container demo-container--default-height-small ecl-u-d-flex ecl-u-align-items-center"> <div class="demo-box">Item 1</div> <div class="demo-box">Item 2</div> <div class="demo-box">Item 3</div> </div>
<div class="demo-container demo-container--default-height-small ecl-u-d-flex ecl-u-align-items-baseline"> <div class="demo-box">Item 1</div> <div class="demo-box">Item 2</div> <div class="demo-box">Item 3</div> </div>
<div class="demo-container demo-container--default-height-small ecl-u-d-flex ecl-u-align-items-stretch"> <div class="demo-box">Item 1</div> <div class="demo-box">Item 2</div> <div class="demo-box">Item 3</div> </div>
Packing flex lines: align-content
You can use align-content utilities to align a flex container's lines within the flex container when there is extra space on the cross-axis. This is similar to how justify-content aligns individual items on the main-axis.
These utilities have no effect on single rows of flex items.
Available utilities include:
.ecl-u-align-content-start.ecl-u-align-content-end.ecl-u-align-content-center.ecl-u-align-content-between.ecl-u-align-content-around.ecl-u-align-content-stretch(default behaviour)
<div class="ecl-u-d-flex ecl-u-flex-wrap ecl-u-align-content-start demo-container demo-container--small demo-container--default-height-long demo-container--resizable"> <div class="demo-box">Item 1</div> <div class="demo-box">Item 2</div> <div class="demo-box">Item 3</div> <div class="demo-box">Item 4</div> <div class="demo-box">Item 5</div> <div class="demo-box">Item 6</div> <div class="demo-box">Item 7</div> <div class="demo-box">Item 8</div> <div class="demo-box">Item 9</div> </div>
<div class="ecl-u-d-flex ecl-u-flex-wrap ecl-u-align-content-end demo-container demo-container--small demo-container--default-height-long demo-container--resizable"> <div class="demo-box">Item 1</div> <div class="demo-box">Item 2</div> <div class="demo-box">Item 3</div> <div class="demo-box">Item 4</div> <div class="demo-box">Item 5</div> <div class="demo-box">Item 6</div> <div class="demo-box">Item 7</div> <div class="demo-box">Item 8</div> <div class="demo-box">Item 9</div> </div>
<div class="ecl-u-d-flex ecl-u-flex-wrap ecl-u-align-content-center demo-container demo-container--small demo-container--default-height-long demo-container--resizable"> <div class="demo-box">Item 1</div> <div class="demo-box">Item 2</div> <div class="demo-box">Item 3</div> <div class="demo-box">Item 4</div> <div class="demo-box">Item 5</div> <div class="demo-box">Item 6</div> <div class="demo-box">Item 7</div> <div class="demo-box">Item 8</div> <div class="demo-box">Item 9</div> </div>
<div class="ecl-u-d-flex ecl-u-flex-wrap ecl-u-align-content-between demo-container demo-container--small demo-container--default-height-long demo-container--resizable"> <div class="demo-box">Item 1</div> <div class="demo-box">Item 2</div> <div class="demo-box">Item 3</div> <div class="demo-box">Item 4</div> <div class="demo-box">Item 5</div> <div class="demo-box">Item 6</div> <div class="demo-box">Item 7</div> <div class="demo-box">Item 8</div> <div class="demo-box">Item 9</div> </div>
<div class="ecl-u-d-flex ecl-u-flex-wrap ecl-u-align-content-around demo-container demo-container--small demo-container--default-height-long demo-container--resizable"> <div class="demo-box">Item 1</div> <div class="demo-box">Item 2</div> <div class="demo-box">Item 3</div> <div class="demo-box">Item 4</div> <div class="demo-box">Item 5</div> <div class="demo-box">Item 6</div> <div class="demo-box">Item 7</div> <div class="demo-box">Item 8</div> <div class="demo-box">Item 9</div> </div>
<div class="ecl-u-d-flex ecl-u-flex-wrap ecl-u-align-content-stretch demo-container demo-container--small demo-container--default-height-long demo-container--resizable"> <div class="demo-box">Item 1</div> <div class="demo-box">Item 2</div> <div class="demo-box">Item 3</div> <div class="demo-box">Item 4</div> <div class="demo-box">Item 5</div> <div class="demo-box">Item 6</div> <div class="demo-box">Item 7</div> <div class="demo-box">Item 8</div> <div class="demo-box">Item 9</div> </div>
Align items independently: align-self
You can use the align-self utilities on the items to control their alignment on the cross-axis the same way that you can use align-items on the container.
Available utilities include:
.ecl-u-align-self-auto(default behaviour, defers alignment control to the value ofalign-itemson the parent container).ecl-u-align-self-start.ecl-u-align-self-end.ecl-u-align-self-center.ecl-u-align-self-baseline.ecl-u-align-self-stretch
<div class="ecl-u-d-flex ecl-u-flex-wrap ecl-u-align-content-stretch demo-container demo-container--small demo-container--default-height-long demo-container--resizable"> <div class="demo-box">Item 1</div> <div class="demo-box ecl-u-align-self-start">Item 2</div> <div class="demo-box">Item 3</div> </div>
<div class="ecl-u-d-flex ecl-u-flex-wrap ecl-u-align-content-stretch demo-container demo-container--small demo-container--default-height-long demo-container--resizable"> <div class="demo-box">Item 1</div> <div class="demo-box ecl-u-align-self-end">Item 2</div> <div class="demo-box">Item 3</div> </div>
<div class="ecl-u-d-flex ecl-u-flex-wrap ecl-u-align-content-stretch demo-container demo-container--small demo-container--default-height-long demo-container--resizable"> <div class="demo-box">Item 1</div> <div class="demo-box ecl-u-align-self-center">Item 2</div> <div class="demo-box">Item 3</div> </div>
<div class="ecl-u-d-flex ecl-u-flex-wrap ecl-u-align-content-stretch demo-container demo-container--small demo-container--default-height-long demo-container--resizable"> <div class="demo-box">Item 1</div> <div class="demo-box ecl-u-align-self-baseline">Item 2</div> <div class="demo-box">Item 3</div> </div>
<div class="ecl-u-d-flex ecl-u-flex-wrap ecl-u-align-content-stretch demo-container demo-container--small demo-container--default-height-long demo-container--resizable"> <div class="demo-box">Item 1</div> <div class="demo-box ecl-u-align-self-stretch">Item 2</div> <div class="demo-box">Item 3</div> </div>
Growing and shrinking items
You can use the .ecl-u-flex-grow-0 (default behaviour) and .ecl-u-flex-grow-1 on flex items to decide whether or not these items should grow to fill available space.
In the example below, we use .ecl-u-flex-grow-1 on the second item:
<div class="demo-container ecl-u-d-flex"> <div class="demo-box">Item 1</div> <div class="demo-box ecl-u-flex-grow-1">Item 2</div> <div class="demo-box">Item 3</div> </div>
In the same spirit, you can use .ecl-u-flex-shrink-0 and .ecl-u-flex-shrink-1 (default behaviour) to toggle an item's ability to shrink if necessary.
In the example below, we use .ecl-u-flex-shrink-0 on the second item:
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam.
Item 2: it doesn't shrink
<div class="demo-container ecl-u-d-flex"> <div class="demo-box"> <p class="iRCJJeCgSXzX9ymLg1TH">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam.</p> </div> <div class="demo-box ecl-u-flex-shrink-0"> <p class="iRCJJeCgSXzX9ymLg1TH">Item 2: it doesn't shrink</p> </div> <div class="demo-box">Item 3: this one shrinks too</div> </div>
Order
Change the order of the items with the order utilities:
.ecl-u-order-first.ecl-u-order-last.ecl-u-order-0(defaut behaviour)
Item 3 (and I appear first!)
<div class="demo-container ecl-u-d-flex"> <div class="demo-box ecl-u-order-last">Item 1 (but I appear last!)</div> <div class="demo-box">Item 2</div> <div class="demo-box ecl-u-order-first"> <p class="iRCJJeCgSXzX9ymLg1TH">Item 3 (and I appear first!)</p> </div> <div class="demo-box">Item 4</div> </div>