Header
Headers are fixed regions at the top of a screen that can contain a title label, and left/right buttons for navigation or to carry out various actions.
Headers come in a variety of default color options:
Sub Header
A secondary header bar can be placed below the original header bar. There are quite a few more ways to customize Headers. Have a look at Button Bars to get other ideas on how it could be used.
Also, remember to include the has-subheader
CSS class to your ion-content
directive.
Content
The content area in Ionic is the scrollable viewport of your app. While your headers and footers will be fixed to the top and bottom, respectively, the content area will fill the remaining available space.
* For more content options, see the Content docs.
Buttons
Ah, the Button, an essential part of any mobile experience. Like the Header, they come in the full spectrum of Ionic's default colors.
By default a button has display: inline-block
applied. Other options include block
buttons for a full width.
Block Buttons
Adding button-block
to a button applies display: block
display.
A block button will however go 100% of its parent's width.
In the example, the button's containing content element also has padding
applied,
so there is some breathing room between the edge of the device and the buttons.
Full Width Block Buttons
Adding button-full
to a button not only applies display: block
,
but also removes borders on the left and right, and any border-radius which may be applied.
This style is useful when the button should stretch across the entire width of the display.
Additionally, the button's parent element does not have padding
applied.
Different Sizes
Adding button-large
to a button makes it larger, adding button-small
makes it smaller.
Outlined Buttons
Use button-outline
to apply an outline button style, which also
has a transparent background.
Note: The text and border will take the color of the applied button style, meaning
button-positive
will result in blue text and border, with a transparent background.
Clear Buttons
Add button-clear
to remove the border and make the text stand out.
Note: The text will take the color of the applied button style, meaning
button-positive
will result in blue text and no border instead of a blue background.
Icon Buttons
Icons can easily be added to any button by using either the built in Ionicons, or any custom font-pack you choose. Learn more about icons.
Icons can also be set with a child element inside the button, however, assigning the icon directly to the button reduces the number of elements in the DOM.
Clear Buttons in Headers
For a more minimal approach to header buttons, simply add the button-clear
classname to remove the background button color and border.
Button Bar
Buttons can also be easily grouped together using the button-bar
classname.
In this example, a button bar was added to the default header bar, as well as in the main content area of the screen.
List
The List is a common and simple way of displaying... that's right, a list. This is a widely used interface across most current mobile OS's, and can include content ranging from basic text all the way to buttons, toggles, icons, and thumbnails.
The list view is a very versatile and powerful component. List views support various interaction modes such as editing, swipe to edit, drag to reorder, and pull to refresh.
For more power you can use Ionic's AngularJS directives. Check out the AngularJS list docs to get more detailed information.
* For a more extensive overview on Lists, read AngularJS List Docs
- Battletoads
- Contra
- Duck Tales
- Mega Man
- Metroid
- Mike Tyson's Punch-Out
- R.C. Pro-Am
- Spy Hunter
- Super Mario Bros.
- The Legend of Zelda
List Dividers
List items can also be dividers to organize and group the list items. Use the item-divider
class to create a divider for any child element of the list.
By default list item dividers will have a different background color and font-weight,
but this is easily customizable.
List Icons
Lists can have icons assigned either to the left and/or right side of each list item,
and the alignment classes should be assigned to each item
element. Icons can easily
be added to any item by using either the built in Ionicons, or
any custom font-pack you choose. Learn more about icons.
Use item-icon-left
to line up the icon to the left, and item-icon-right
to set the icon to the right. When a list item has an icon on both sides then both classes
will need to be applied.
This example uses an <a>
element for each item, which allows the entire
list item to be tappable. If the item is an <a>
or <button>
element, and no icon has been added to the right, then a small right arrow will automatically be added.
In the example, the first item only has a left aligned icon. The second item has both
left and right side icons. The third item has a left aligned icon and an item-note
. The fourth
icon has added a badge
element.
List Buttons
Use item-button-right
or item-button-left
to place a
button within an item.
Item Avatars
Item avatars are essentially a showcase of an image larger than an icon, but smaller than a thumbnail.
To create a avatar item, use the item-avatar
classname.
Item Thumbnails
Item Thumbnails are essentially a showcase of an image larger than an icon, and will often span/define the entire height of the list item. To create a thumbnail styled item, use the item-thumbnail-left
to have it align on the left, and item-thumbnail-right
for the right side.
Inset Lists
Lists can also be inset inside their container, instead of going full width. The main difference
is that a list list-inset
element has margin. An inset list is similar to a card,
except an inset list does not have a box-shadow. Since list list-inset
does not have a box-shadow,
it'll be more performant when scrolling.
Inset forms shows other examples of its usage.
Cards
Cards have become widely used in recent years. They are a great way to contain and organize information, while also setting up predictable expectations for the user. With so much content to display at once, and often so little screen realestate, cards have fast become the design pattern of choice for many companies, including the likes of Google, Twitter, and Spotify..
For mobile experiences, Cards make it easy to display the same information visually across many different screen sizes. They allow for more control, are flexible, and can even be animated. Cards are usually placed on top of one another, but they can also be used like a "page" and swiped between, left and right.
Cards add a box-shadow by default, whereas it's cousin list list-inset
does not. For performance reasons,
when scrolling a large card with many items its recommended to use inset lists instead.
Card Lists
Use the list card
classname to create a card with lists.
Card Images
Images look great in cards, and can be combined with lists and other elements.
Card Showcase
Here is a showcase of a card using several different items. It begins with the list card
element, utilizing the item-avatar
list item, an item-body
element for images and text, and a footer with the item-divider
classname.
Marty McFly
November 05, 1955
This is a "Facebook" styled Card. The header is created from a Thumbnail List item, the content is from a card-body consisting of an image and paragraph text. The footer consists of a tabs, icons aligned left, within the card-footer.
Forms & Inputs
A list
is also used to group related input elements. Both item-input
and item
is then used to designate each individual input field and it's
associated label.
Ionic prefers to create the item-input
out of the <label>
element
so that when any part of the row is tapped then the underlying input receives focus.
Additionally, developers should be aware of the various HTML5 Input types so users will be presented with the appropriate virtual keyboard.
Text Input: Placeholder Labels
In the example, it'll default to 100% width (no borders on the left and right), and uses the
placeholder
attribute to simulate the input's label. Then the user begins to enter
text into the input the placeholder label will be hidden. Notice how <textarea>
can also be used as a multi-line text input.
Text Input: Inline Labels
Use input-label
to place a label to the left of the input element. When the user
enters text the label does not hide. Note that there's nothing stopping you from also
using a placeholder
label too.
Text Input: Stacked Labels
Stacked labels always places the label on top of the input. Each item should
have item-stacked-label
assigned, and the input's label
should have input-label
assigned.
This example also uses the placeholder
attribute so
users have a hint of what type of text the input is looking for.
Text Input: Floating Labels
Floating labels are just like Stacked Labels,
except that their labels animate, or "float" up when text is entered in the input.
Each item should have item-floating-label
assigned, and the input's
label should have input-label
assigned.
Enter text in the example to the right to see the floating labels in action.
This example also uses the placeholder
attribute so
user's have a hint of what type of text the input is looking for.
Inset Forms
By default each input item will fill 100% of the width of its parent element (the list).
However, you can inset the list using either the list list-inset
or card
classnames.
The card classname applies a lower box shadow while list-inset does not.
Additionally, if the list's parent element has padding
assigned then this will also
give the form an inset appearance.
Inset Inputs
Using list-inset
will inset the entire list, whereas placing item-input-inset
will inset an input into an individual list item. Placing a button inside the item
Input Icons
Icons can be easily added to the left of an item-input
input. Simply add an
icon before the <input>
. By default the icon
will take the color of label text. However, you can also use add placeholder-icon
to give it a placeholder color.
Header Inputs
Inputs can also be placed in headers, along with buttons to submit or cancel the form.
Toggle
A toggle technically is the same thing as an HTML checkbox input,
except it looks different and is easier to use on a touch device. Ionic prefers
to wrap the checkbox input with the <label>
in order
to make the entire toggle easy to tap or drag.
Toggles can also have colors assigned to them,
such as toggle-assertive
to assign the assertive color.
This is an example of multiple toggles within a list. Note the item-toggle
class was added along side item
for each item.
- HTML5
- CSS3
- Flashplayer
- Java Applets
- JavaScript
- Silverlight
- Web Components
Checkbox
Checkboxes allow the user to select a number of items in a set of choices. A good use for a checkbox list would be a filter list to apply multiple filters to a search.
Checkboxes can also have colors assigned to them,
such as checkbox-assertive
to assign the assertive color.
- Flux Capacitor
- 1.21 Gigawatts
- Delorean
- 88 MPH
- Plutonium Resupply
Radio Button List
Radio buttons let the user select one option in a set of options, unlike a checkbox which allows for multiple selections.
Range
This is a Range. Ranges can be themed to any default Ionic color, and used in various other elements such as a list item or card.
Select
Ionic's select is styled so its appearance is prettied up relative to the browser's default style. However, when the select elements is opened, the default behavior on how to select one of the options is still managed by the browser.
Each platform's user-interface will be different as the user is selecting an option. For example, on a desktop browser you'll see the traditional drop down interface, whereas Android often has a radio-button list popup, and iOS has a custom scroller covering the bottom half of the window.
Tabs
Tabs are a horizontal region of buttons or links that allow for a consistent navigation experience between screens. It can contain any combination of text and icons, and is a popular method for enabling mobile navigation.
* For building tabbed interfaces, see the Tabs documentation.
The containing element should have the tabs
classname, and each tab should have the tab-item
classname. By default, tabs will be without an icon and text-only.
Tabs can be styled to match the standard Ionic colors (the example is using the default
color. Use these classes to change the
color of the tab bar:
tabs-default
tabs-light
tabs-stable
tabs-positive
tabs-calm
tabs-balanced
tabs-energized
tabs-assertive
tabs-royal
tabs-dark
To hide the tabbar but still show the content, add the tabs-item-hide
class. Also, whenever you are using tabs, remember to add the has-tabs
CSS class to your ion-content
directive.
Icon-only Tabs
Add tabs-icon-only
along with the tabs
classname.
Top Icon Tabs
Classic tabs. Add tabs-icon-top
along with the tabs
classname.
Left Icon Tabs
Add tabs-icon-left
along with the tabs
classname.
Striped Style Tabs
Add tabs-striped
to an element above the tabs
classname for Android style tabs.
Optionally, also add tabs-top
to position the tab at the top
Get granular color control for striped tabs with the tabs-background-{color}
and
tabs-color-{color}
classes, where {color}
is any of the ionic color swatches:
default
,
light
,
stable
,
positive
,
calm
,
balanced
,
energized
,
assertive
,
royal
, or
dark
Note, that to have the header blend with the top tabs, add the has-tabs-top
class to the header.
Grid
Ionic's grid system is different than most because of its use of the CSS Flexible Box Layout Module standard. The advantage here is that the devices that Ionic supports, all support flexbox.
Simply add columns you want in a row, and they'll evenly take up the available space. If you want three columns, add three columns, if you want five columns, add five columns. There's no restriction to a 12 column grid, or having to explicitly state how large each column should be. And to add to the crazy, you can vertically align content within each column.
The row
classname is used to designate, surprise, a row, and col
is used for a column. In the demo to the right we chose to have four, then two, columns, but we could have just as easily used 3, 6, 7, 23, etc., it doesn't matter. Point is, add the number of columns your layout requires and don't worry about figuring out the percentages because it figures it out automagically.
Note: The borders and gray background in the demo were added so it's easier to see the structure.
Line 2
Line 3
Line 2
Line 3
Line 2
Line 3
Line 2
Line 3
Grid: Evenly Spaced Columns
By default every col
added inside a row
will automatically receive an equal amount of the available area. Notice in the code below that no sizes are specified anywhere in the classnames, yet each of the five columns in this example will each evenly take up 20% of the available width (thank you flexbox).
Note: The borders and gray background in the demo were added so it's easier to see the structure.
Grid: Explicit Column Sizes
You can explicitly state the size of a column if for example you'd want specific columns to be larger than the others in the same row. By default each column will evenly take up the available area, but in the case where a column should be a certain size, Ionic's grid uses a percent system (in contrast to a locked in 12 column grid).
An advantage with this grid system is that you only have to state the percentage for the column that needs it, and the others will still evenly divide up the available areas.
Note: The borders and gray background in the demo were added so it's easier to see the structure.
Explicit Column Percentage Classnames | |
---|---|
.col-10 | 10% |
.col-20 | 20% |
.col-25 | 25% |
.col-33 | 33.3333% |
.col-50 | 50% |
.col-67 | 66.6666% |
.col-75 | 75% |
.col-80 | 80% |
.col-90 | 90% |
Grid: Offset Columns
Columns can also be offset from the left. We'll let the code and demo speak for itself.
Note: The borders and gray background in the demo were added so it's easier to see the structure.
Offset Column Percentage Classnames | |
---|---|
.col-offset-10 | 10% |
.col-offset-20 | 20% |
.col-offset-25 | 25% |
.col-offset-33 | 33.3333% |
.col-offset-50 | 50% |
.col-offset-67 | 66.6666% |
.col-offset-75 | 75% |
.col-offset-80 | 80% |
.col-offset-90 | 90% |
Grid: Vertically Align Columns
Another trick up flexbox's sleeve is the ability to easily vertically align columns. Vertical alignment includes top, center and bottom, and can be applied to every column in a row, or to specific columns.
In the demo, we've made the last column in each row to have the tallest content in order to demonstrate how the content of the others vertically align. The first row shows the default which is to take the same height as the tallest column in the same row.
Note: The borders and gray background in the demo were added so it's easier to see the structure.
2
3
4
2
3
4
2
3
4
2
3
4
2
3
4
Responsive Grid
There may be cases where a row of columns will not fit nicely in the available area. The responsive classes can be used to turn each column in a row into its own row at certain breakpoints.
For example, if you want a row of columns to turn in to stacked rows when the
viewport is pretty small, you would use the .responsive-sm
class. The
example to the right is a simulation of what it'd look like.
Note: The borders and gray background in the demo were added so it's easier to see the structure.
Responsive Class | Break when roughly |
---|---|
.responsive-sm | Smaller than landscape phone |
.responsive-md | Smaller than portrait tablet |
.responsive-lg | Smaller than landscape tablet |
For further configuration, each class uses a Sass
variable that can be changed to your liking. There's also a responsive-grid-break
mixin you can use to create your own classes.
Utility
Ionic comes with a handful of utility classes to help quickly style your design. Each are optional.
Colors
Ionic comes with a set of colors to start with, but as a general rule colors are meant to be overridden. We prefer saying that Ionic provides a recommended naming convention for your colors, swatches, themes, etc.
Utility colors are added to help set a naming convention. You'll notice Ionic purposely does not use words like "red" or "blue", but instead have colors which represent an emotion or generic theme.
Let's be realistic, assigning colors is one of the easier tasks in CSS, and each app will have different requirements for colors. Ionic's goal is to provide a clean system to build on top of and maintain, and stays away from dictating how each app chooses to color its custom design.
To customize the colors you can simply override those coming from the ionic.css
CSS file. Additionally, since Ionic is built using Sass, for more power and flexibility you could also modify and extend the color variables within the _variables.scss
file.
* For more flexibility, you can Customize Ionic With Sass
- light
- stable
- positive
- calm
- balanced
- energized
- assertive
- royal
- dark
Icons
Ionic also comes with its own free and open-sourced icon font, Ionicons, with over 500 icons to choose from.
Simply add icon
and the Ionicon classname for the icon to show, which can be easily looked up on the Ionicons homepage.
While it's possible for buttons to use a child <i>
to set the icon, they can also set their icon just by setting the buttons own class. Please take a look at button icon docs for more info.
Note: Ionic is certainly not restricted to using only the Ionicons icon pack, so please feel free to use any icons you wish.
Padding
Many components in Ionic purposely have both padding and margin reset set to zero. In many instances apps will have components bleed to the edge of the screen, and by starting each component at zero developers can easily control padding and margins throughout the app.
The padding
utility classes can be reused to give any element's content some breathing room,
meaning it adds a default 10px
between the outer box of the element and its inner content.
The following classes are not required for any element, but may be helpful with your layout.
-
padding
Adds padding around every side. -
padding-vertical
Adds padding to the top and bottom. -
padding-horizontal
Adds padding to the left and right. -
padding-top
Adds padding to the top. -
padding-right
Adds padding to the right. -
padding-bottom
Adds padding to the bottom. -
padding-left
Adds padding to the left.
The gray square represents an element, and the blue square represents
the element's content when padding
has been applied.