The iron-flex-layout component provides simple ways to use CSS flexible box layout, also known as flexbox. This component provides two different ways to use flexbox:
Layout classes. The layout class stylesheet provides a simple set of class-based flexbox rules. Layout classes let you specify layout properties directly in markup.
Custom CSS mixins. The mixin stylesheet includes custom CSS mixins that can be applied inside a CSS rule using the @apply function.
Using the classes or CSS mixins is largely a matter of preference. The following sections discuss how to use the each of the stylesheets.
Note: Before using either of these stylesheets, it‘s helpful to be familiar with the basics of flexbox layout. Chris Coyier’s A Complete Guide to Flexbox is a good primer.
To use layout classes import the iron-flex-layout-classes file. You must do this in any element that uses any of the iron-flex-layout styles.
<link rel="import" href="bower_components/iron-flex-layout/iron-flex-layout-classes.html">
Then include the module(s) that you need:
<!-- include classes in the main document --> <style is="custom-style" include="iron-flex iron-flex-alignment">
or:
<!-- import classes in an element --> <style include="iron-flex iron-flex-alignment">
Then simply apply the classes to any element.
<div class="layout horizontal wrap">
Many of the layout rules involve combinations of multiple classes (such as layout horizontal wrap above), and will need a combination of modules. The order in which the classes are specified doesn't matter, so layout horizontal and horizontal layout are equivalent.
There are 5 modules available:
iron-flex. Basic flex layouts.iron-flex-reverse. Reverse flexbox layouts.iron-flex-alignment. Main axis, cross axis and self alignment.iron-flex-factors. All the available flex factors.iron-positioning. Generic, non-flexbox positioning helpers.Example: using classes in the main document
<head> ... <link rel="import" href="bower_components/iron-flex-layout/iron-flex-layout-classes.html"> ... <!-- main document -- include the module you need in a custom-style element --> <style is="custom-style" include="iron-flex"></style> </head> <body> <div class="layout horizontal"> <div>One</div> <div>Two</div> <div>Three</div> </div> </body>
Example: using classes in a Polymer element
<link rel="import" href="bower_components/iron-flex-layout/iron-flex-layout-classes.html"> ... <dom-module id="mixin-demo"> <!-- inside an element -- include the module you need in a standard style element --> <style include="iron-flex"></style> <template> <div class="layout horizontal"> <div>One</div> <div>Two</div> <div>Three</div> </div> </template> <script> Polymer({ is: 'mixin-demo' }); </script> </dom-module>
It‘s important to note that unlike the previous layout class stylesheets (found in /classes/iron-flex-layout.html), the new version does not use the /deep/ combinator: it does not work across local DOM boundaries, and the modules must be imported into each scope where they’re used.
Custom mixins can be applied inside a Polymer custom element's stylesheet, or inside a custom-style stylesheet to apply styles to the main document. (They cannot be applied in the main document without a custom-style stylesheet.)
Example: using mixins in the main document
<head> ... <link rel="import" href="bower_components/iron-flex-layout/iron-flex-layout.html"> ... <!-- main document -- apply mixins in a custom-style element --> <style is="custom-style"> .container { @apply --layout-horizontal; @apply --layout-wrap; } </style> </head> <body> <div class="container"> <div>One</div> <div>Two</div> <div>Three</div> </div> </body>
Example: using mixins in a Polymer element
<link rel="import" href="bower_components/iron-flex-layout/iron-flex-layout.html"> ... <dom-module id="mixin-demo"> <!-- inside an element -- apply mixins in a standard style element --> <style> .container { @apply --layout-horizontal; @apply --layout-wrap; } </style> <template> <div class="container"> <div>One</div> <div>Two</div> <div>Three</div> </div> </template> <script> Polymer({ is: 'mixin-demo' }); </script> </dom-module>
In general the mixins require a little more code to use, but they can be preferable if you don't want to use the classes, or if you want to switch layouts based on a media query.
Custom CSS properties and mixins are features provided by the Polymer library. See Cross-scope styling in the Polymer developer guide.
Create a flex container that lays out its children vertically or horizontally.
| Class | Mixin | Result |
|---|---|---|
| layout horizontal | --layout-horizontal | Horizontal layout container. |
| layout vertical | --layout-vertical | Vertical layout container. |
The classes listed here are included in the iron-flex module of the iron-flex-layout-classes file.
Example: classes
<div class="layout horizontal"> <div>One</div> <div>Two</div> <div>Three</div> </div>
Example: mixins
<style is="custom-style"> .container { @apply --layout-horizontal; } </style> <div class="container"> <div>One</div> <div>Two</div> <div>Three</div> </div>
Children of a flex container can use flex to control their own sizing.
| Class | Mixin | Result |
|---|---|---|
| flex | --layout-flex | Expand the child to fill available space in the main axis. |
| flex-ratio | --layout-flex-ratio | Assign a flex ratio of 1 to 12. |
| flex-none | --layout-flex-none | Don't flex the child. |
| flex-auto | --layout-flex-auto | Sets flex flex-basis to auto and flex-grow and flex-shrink to 1. |
The classes listed here are included in the iron-flex module of the iron-flex-layout-classes file.
Example: classes
<div class="horizontal layout"> <div>Alpha</div> <div class="flex">Beta (flex)</div> <div>Gamma</div> </div>
Example: mixins
<style is="custom-style"> .container { @apply --layout-horizontal; } .flexchild { @apply --layout-flex; } </style> <div class="container"> <div>Alpha</div> <div class="flexchild">Beta (flex)</div> <div>Gamma</div> </div>
The same rules can be used for children in vertical layouts.
Example: classes
<div class="vertical layout" style="height:250px"> <div>Alpha</div> <div class="flex">Beta (flex)</div> <div>Gamma</div> </div>
Example: mixins
<style is="custom-style"> .container { @apply --layout-vertical; } .flexchild { @apply --layout-flex; } </style> <div class="container" style="height: 250px"> <div>One</div> <div class="flexchild">Two</div> <div>Three</div> </div>
Note: for vertical layouts, the container needs to have a height for the children to flex correctly.
Children elements can be told to take up more space by including a “flex ratio” from 1 to 12. This is equivalent to specifying the CSS flex-grow property.
For example, the following examples make “Gamma” 2x larger than “Beta” and “Alpha” 3x larger, use flex-2 and flex-3, respectively.
The classes listed here are included in the iron-flex-factors module of the iron-flex-layout-classes file.
Example: classes
<div class="horizontal layout demo"> <div class="flex-3">Alpha</div> <div class="flex">Beta</div> <div class="flex-2">Gamma</div> </div>
Example: mixins
<style is="custom-style"> .container { @apply --layout-horizontal; } .flexchild { @apply --layout-flex; } .flex2child { @apply --layout-flex-2; } .flex3child { @apply --layout-flex-3; } </style> <div class="container"> <div class="flex3child">One</div> <div class="flexchild">Two</div> <div class="flex2child">Three</div> </div>
By default, children stretch to fit the cross-axis (e.g. vertical stretching in a horizontal layout).
<div class="horizontal layout" style="height: 154px"> <div>Stretch Fill</div> </div>
Center across the main axis (e.g. vertical centering elements in a horizontal layout) by adding the center class or applying the --layout-center mixin.
Example: classes, cross-axis center
<div class="horizontal layout center" style="height: 154px"> <div>Center</div> </div>
Example: mixins, cross-axis center
<style is="custom-style"> .container { @apply --layout-horizontal; @apply --layout-center; } </style> <div class="container" style="height: 154px"> <div>Center</div> </div>
You can also position at the top/bottom (or left/right in vertical layouts) using the start or end classes, or by applying the --layout-start or --layout-end mixins.
Example: classes, cross-axis start
<div class="horizontal layout start" style="height: 154px"> <div>start</div> </div>
Example: mixins, cross-axis start
<style is="custom-style"> .container { @apply --layout-horizontal; @apply --layout-start; } </style> <div class="container" style="height: 154px"> <div>start</div> </div>
Example: classes, cross-axis end
<div class="horizontal layout end" style="height: 154px"> <div>end</div> </div>
Example: mixins, cross-axis end
<style is="custom-style"> .container { @apply --layout-horizontal; @apply --layout-end; } </style> <div class="container" style="height: 154px"> <div>end</div> </div>
Justifying aligns contents along the main axis. Justify the layout by specifying one of the following.
| Class | Mixin | Result |
|---|---|---|
start-justified | --layout-start-justified | Aligns contents at the start of the main axis. |
center-justified | --layout-center-justified | Centers contents along the main axis. |
end-justified | --layout-end-justified | Aligns contents to the end of the main axis. |
justified | --layout-justified | Aligns contents with equal spaces between children. |
around-justified | --layout-around-justified | Aligns contents with equal spaces arround children. |
The classes listed here are included in the iron-flex-alignment module of the iron-flex-layout-classes file.
Example: classes, start justified
<div class="horizontal start-justified layout"> <div>start-justified</div> </div>
Example: mixins, center justified
<style is="custom-style"> .container { @apply --layout-horizontal; @apply --layout-center-justified; } </style> <div class="container"> <div>center-justified</div> </div>
Example: classes, end justified
<div class="horizontal end-justified layout"> <div>end-justified</div> </div>
Example: mixins, equal space between elements
<style is="custom-style"> .container { @apply --layout-horizontal; @apply --layout-justified; } </style> <div class="container"> <div>justified</div> <div>justified</div> <div>justified</div> </div>
Example: classes, equal space around each element
<div class="horizontal around-justified layout"> <div>around-justified</div> <div>around-justified</div> </div>
Alignment can also be set per-child (instead of using the layout container's rules).
| Class | Mixin | Result |
|---|---|---|
self-start | --layout-self-start | Aligns the child at the start of the cross-axis. |
self-center | --layout-self-center | Centers the child along the cross-axis. |
self-end | --layout-self-end | Aligns the child at the end of the cross-axis. |
self-stretch | --layout-self-stretch | Stretches the child to fit the cross-axis. |
Example: classes
<div class="horizontal layout" style="height: 120px;"> <div class="flex self-start">Alpha</div> <div class="flex self-center">Beta</div> <div class="flex self-end">Gamma</div> <div class="flex self-stretch">Delta</div> </div>
Example: mixins
<style is="custom-style"> .container { @apply --layout-horizontal; @apply --layout-justified; height: 120px; } .container div { @apply --layout-flex; } .child1 { @apply --layout-self-start; } .child2 { @apply --layout-self-center; } .child3 { @apply --layout-self-end; } .child4 { @apply --layout-self-stretch; } </style> <div class="container"> <div class="child1">Alpha</div> <div class="child2">Beta</div> <div class="child3">Gamma</div> <div class="child4">Delta</div> </div>
Note: The flex class (and --layout-flex mixin) shown in these examples is added for the demo and not required for self-alignment.
Wrapped layouts can be enabled with the wrap class or --layout-wrap mixin.
Example: classes
<div class="horizontal layout wrap" style="width: 220px"> <div>Alpha</div> <div>Beta</div> <div>Gamma</div> <div>Delta</div> </div>
Layout direction can be mirrored using the following rules:
| Class | Mixin | Result |
|---|---|---|
| layout horizontal-reverse | --layout-horizontal-reverse | Horizontal layout with children laid out in reverse order (last-to-first). |
| layout vertical-reverse | --layout-vertical-reverse | Vertical layout with children laid out in reverse order. |
| layout wrap-reverse | --layout-wrap-reverse | Wrap layout with wrapped rows placed in the reverse order (for example, in a vertical layout, the second row is placed above the first row, instead of below). |
The classes listed here are included in the iron-flex-reverse module of the iron-flex-layout-classes file.
Example: mixins
<style is="custom-style"> .container { @apply --layout-horizontal-reverse; } </style> <div class="container"> <div>Alpha</div> <div>Beta</div> <div>Gamma</div> <div>Delta</div> </div>
It‘s common to want the entire <body> to fit to the viewport. By themselves, Polymer’s layout features on <body> don't achieve the result. You can make <body> take up the entire viewport by adding the fullbleed class:
<body class="fullbleed vertical layout"> <div class="flex">Fitting a fullbleed body.</div> </body>
This removes its margins and maximizes its height to the viewport. There is no equivalent mixin, but the same result can be achieved in CSS very simply:
body { margin: 0; height: 100vh; }
This class is included in the iron-positioning module of the iron-flex-layout-classes file.
Note that the fullbleed class only works on the <body> tag. This is the only rule in the stylesheet that is scoped to a particular tag.
Polymer also includes other general purpose rules for basic positioning:
| Class | Mixin | Result |
|---|---|---|
block | --layout-block | Assigns display: block |
invisible | --layout-invisible | Assigns visibility: hidden |
relative | --layout-relative | Assigns position: relative |
fit | --layout-fit | Sets position: absolute and sets top:0;right:0;bottom:0;left:0; (aka “trbl fitting”). |
The classes listed here are included in the iron-positioning module of the iron-flex-layout-classes file.
Note:When using
fitlayout, the element must have an ancestor with fixed size andposition: relativelayout to fit inside of.
Example: classes
<div class="demo">Before <span>[A Span]</span> After</div> <div class="demo">Before <span class="block">[A Block Span]</span> After</div> <div class="demo">Before invisible span <span class="invisible">Not displayed</span> After invisible span</div> <div class="relative" style="height: 100px;"> <div class="fit" style="background-color: #000;color: white">Fit</div> </div>