Floating Action Button
Floating action button (FAB) is used for a promoted action. They are distinguished by a circled icon floating above the UI and have motion behaviors that include morphing, launching, and a transferring anchor point.
FAB Layout
Layout of floating action button is very simple. Just put it as the direct child of page
or view
:
<!-- Page-->
<div class="page">
<!-- Navbar-->
<div class="navbar">
<div class="navbar-bg"></div>
<div class="navbar-inner">
<div class="center">Floating Action Button</div>
</div>
</div>
<!-- Floating Action Button -->
<div class="fab fab-right-bottom">
<a href="#">
<i class="icon f7-icons">plus</i>
</a>
</div>
<!-- Another Floating Action Button -->
<div class="fab fab-left-bottom">
<a href="#">
<i class="icon f7-icons">plus</i>
</a>
</div>
<!-- Scrollable Page Content-->
<div class="page-content">
<div class="block">
Lorem ipsum dolor sit amet, ....
</div>
</div>
</div>
FAB position is configured via additional fab-[horizontal]-[vertical]
class. The following clases are avaialble:
fab-right-bottom
fab-center-bottom
fab-left-bottom
fab-right-center
fab-center-center
fab-left-center
fab-right-top
fab-center-top
fab-left-top
FAB Colors
FAB supports all default colors. To change its color just add color-[color]
class to FAB element.
<!-- Red FAB -->
<div class="fab fab-left-top color-red"></div>
<!-- Green FAB -->
<div class="fab fab-right-bottom color-green"></div>
Extended FAB
The extended FAB is wider, and it includes a text label. To make extended FAB we need to add additional fab-extended
class to FAB element and put its extra text in <div class="fab-text">
element inside:
<!-- Additional fab-extended class -->
<div class="fab fab-extended fab-center-bottom">
<a href="#">
<i class="icon f7-icons">plus</i>
<!-- Element with FAB text -->
<div class="fab-text">Create</div>
</a>
</div>
Speed Dial
The floating action button can fling out related actions upon press. The button should remain on screen after the menu is invoked. Tapping in the same spot should either activate the most commonly used action or close the open menu.
In this case we need to add additional element with buttons:
<div class="fab fab-right-bottom">
<a href="#">
<!-- First icon is visible when Speed Dial actions are closed -->
<i class="icon f7-icons">plus</i>
<!-- Second icon is visible when Speed Dial actions are opened -->
<i class="icon f7-icons">xmark</i>
</a>
<!-- Speed Dial action buttons -->
<div class="fab-buttons fab-buttons-bottom">
<a href="#">1</a>
<a href="#">2</a>
<a href="#">3</a>
</div>
</div>
Speed dial buttons container position is configured via additional class:
fab-buttons-top
- buttons will appear on top of FABfab-buttons-right
- buttons will appear on right of FABfab-buttons-bottom
- buttons will appear on bottom of FABfab-buttons-left
- buttons will appear on left of FABfab-buttons-center
- buttons will appear around of FAB
Note that Speed Dial actions buttons will appear in reversed order
You shouldn't use more than 6 Speed Dial actions
You should use at least 3 Speed Dial actions
Speed Dial With Labels
Speed dial buttons also support additional text labels. In this case layout will be a bit extended:
<div class="fab-buttons fab-buttons-bottom">
<!-- additional "fab-label-button" class on fab button -->
<a href="#" class="fab-label-button">
<!-- original button content -->
<span>1</span>
<!-- button label -->
<span class="fab-label">Action 1</span>
</a>
<a href="#" class="fab-label-button">
<span>2</span>
<span class="fab-label">Action 2</span>
</a>
...
</div>
Speed Dial With Backdrop
It is also possible to add backdrop (semi-transparent overlay) behind the FAB that will become visible on FAB open.
To make it work, we just need to add backdrop element on same level as FAB element:
<div class="page">
<!-- FAB backdrop -->
<div class="fab-backdrop"></div>
<!-- FAB -->
<div class="fab fab-right-bottom">
...
</div>
<div class="page-content">
...
</div>
</div>
FAB Morph
There is also ability for FAB to morph to any visible element on page.
<div class="page">
<div class="navbar">...</div>
<!-- Toolbar has additional required "fab-morph-target" class -->
<div class="toolbar toolbar-bottom fab-morph-target">
...
</div>
<!-- FAB will morph to toolbar -->
<div class="fab fab-morph" data-morph-to=".toolbar">
<i class="icon f7-icons">plus</i>
</div>
<div class="page-content">
...
</div>
</div>
Where
data-morph-to
- additional attribute on FAB where target element's CSS selector must be specified. In this example it points to Toolbarfab-morph-target
- additional required class on FAB morph target, in this example it is added to Toolbar
FAB App Methods
We can use following app methods to control FABs:
app.fab.open(fabEl, targetEl) | Open FAB speed dial actions/buttons, or morph it to specified target
|
app.fab.close(fabEl) | Close FAB speed dial actions/buttons, or morph it back from specified target
|
app.fab.toggle(fabEl) | Toggle FAB speed dial actions/buttons
|
FAB Events
FAB will fire the following DOM events on FAB element:
Event | Target | Description |
---|---|---|
fab:open | FAB Element<div class="fab"> | Event will be triggered on FAB open or when it morphs to target element |
fab:close | FAB Element<div class="fab"> | Event will be triggered on FAB close or when it morphs back from target element |
Control FAB With Links
It is possible to open and close required FAB (if you have it in DOM) using special classes and data attributes on links:
To open FAB speed dial actions we need to add
fab-open
class to any HTML element (preferred to link)To close FAB speed dial or to morph FAB back from target we need to add
fab-close
class to any HTML element (preferred to link)If you have more than one FAB in DOM, you need to specify appropriate FAB via additional
data-fab=".some-fab"
attribute on this HTML element
CSS Variables
Below is the list of related CSS variables (CSS custom properties).
Note that commented variables are not specified by default and their values is what they fallback to in this case.
:root {
--f7-fab-margin: 16px;
--f7-fab-extended-text-font-size: 14px;
--f7-fab-label-padding: 4px 12px;
--f7-fab-label-font-size: inherit;
--f7-fab-button-size: 40px;
}
.ios {
/* --f7-fab-pressed-bg-color: var(--f7-theme-color-shade); */
/* --f7-fab-bg-color: var(--f7-theme-color)); */
--f7-fab-text-color: #fff;
--f7-fab-border-radius: 50px;
--f7-fab-size: 50px;
--f7-fab-box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.4);
--f7-fab-extended-text-transform: uppercase;
--f7-fab-extended-size: 50px;
--f7-fab-extended-text-padding: 0 20px;
--f7-fab-extended-text-font-weight: 600;
--f7-fab-extended-text-letter-spacing: 0;
--f7-fab-label-border-radius: 4px;
--f7-fab-label-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.4);
--f7-fab-label-text-color: #333;
--f7-fab-label-bg-color: #fff;
}
.md {
/*
--f7-fab-pressed-bg-color: var(--f7-fab-bg-color, var(--f7-theme-color));
*/
--f7-fab-border-radius: 16px;
--f7-fab-size: 56px;
--f7-fab-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.25);
--f7-fab-extended-size: 56px;
--f7-fab-extended-text-padding: 0 16px;
--f7-fab-extended-text-font-weight: 500;
--f7-fab-extended-text-letter-spacing: 0;
--f7-fab-extended-text-transform: none;
--f7-fab-label-border-radius: 8px;
--f7-fab-label-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.25);
}
.md,
.md .dark,
.md [class*='color-'] {
--f7-fab-bg-color: var(--f7-md-primary-container);
--f7-fab-text-color: var(--f7-md-on-primary-container);
--f7-fab-label-text-color: var(--f7-md-on-surface);
--f7-fab-label-bg-color: var(--f7-md-surface-5);
}
Examples
<div class="page">
<div class="navbar">
<div class="navbar-bg"></div>
<div class="navbar-inner sliding">
<div class="left">
<a class="link back">
<i class="icon icon-back"></i>
<span class="if-not-md">返回</span>
</a>
</div>
<div class="title">浮动操作菜单</div>
</div>
</div>
<div class="fab fab-right-top">
<a>
<i class="icon f7-icons if-not-md">plus</i>
<i class="icon f7-icons if-not-md">xmark</i>
<i class="icon material-icons md-only">add</i>
<i class="icon material-icons md-only">close</i>
</a>
<div class="fab-buttons fab-buttons-left">
<a href="">1</a>
<a href="">2</a>
<a href="">3</a>
</div>
</div>
<div class="fab fab-right-bottom">
<a>
<i class="icon f7-icons if-not-md">plus</i>
<i class="icon f7-icons if-not-md">xmark</i>
<i class="icon material-icons md-only">add</i>
<i class="icon material-icons md-only">close</i>
</a>
<div class="fab-buttons fab-buttons-top">
<a href="" class="fab-label-button">
<span>1</span>
<span class="fab-label">Action 1</span>
</a>
<a href="" class="fab-label-button">
<span>2</span>
<span class="fab-label">Action 2</span>
</a>
<a href="" class="fab-label-button">
<span>3</span>
<span class="fab-label">Third Action</span>
</a>
</div>
</div>
<div class="fab fab-left-bottom">
<a>
<i class="icon f7-icons if-not-md">plus</i>
<i class="icon f7-icons if-not-md">xmark</i>
<i class="icon material-icons md-only">add</i>
<i class="icon material-icons md-only">close</i>
</a>
<div class="fab-buttons fab-buttons-top">
<a href="">1</a>
<a href="">2</a>
<a href="">3</a>
</div>
</div>
<div class="fab fab-left-top">
<a>
<i class="icon f7-icons if-not-md">plus</i>
<i class="icon f7-icons if-not-md">xmark</i>
<i class="icon material-icons md-only">add</i>
<i class="icon material-icons md-only">close</i>
</a>
<div class="fab-buttons fab-buttons-bottom">
<a href="">1</a>
<a href="">2</a>
<a href="">3</a>
</div>
</div>
<div class="fab fab-center-center">
<a>
<i class="icon f7-icons if-not-md">plus</i>
<i class="icon f7-icons if-not-md">xmark</i>
<i class="icon material-icons md-only">add</i>
<i class="icon material-icons md-only">close</i>
</a>
<div class="fab-buttons fab-buttons-center">
<a href="">1</a>
<a href="">2</a>
<a href="">3</a>
<a href="">4</a>
</div>
</div>
<div class="fab fab-extended fab-center-bottom">
<a>
<i class="icon f7-icons if-not-md">plus</i>
<i class="icon material-icons md-only">add</i>
<div class="fab-text">Create</div>
</a>
</div>
<div class="page-content">
<div class="block">
<p>在一个遥远的星球上,有一座神秘的宫殿,那里居住着一位美丽善良的公主。公主有着一双明亮的眼睛,仿佛能看透人心。她待人热情,让每个见过她的人都为之倾倒。宫殿的周围,是一片神奇的森林,里面住着形态各异的仙子。她们各司其职,为星球的居民带来幸福和祥和。
这一天,星球上举行了一场盛大的舞会。</p>
<p>来自四面八方的舞者齐聚一堂,为公主献上最美的舞蹈。宫殿里弥漫着花香,月光洒在舞池中,如梦似幻。公主穿着一件璀璨的礼服,优雅地起舞。在她的身边,是一位英俊潇洒的少年,他是星球上的勇士,曾为保卫家园立下赫赫战功。
舞会进行得如火如荼,忽然,一道乌云遮住了月光。众人都惊慌失措,担忧起来。</p>
<p>公主却镇定自若,她知道,这是森林里的仙子们在提醒她,有一位神秘的客人即将到来。果然,不久后,一位戴着面具的神秘人出现在舞会上。他舞艺高超,引得众人赞叹不已。面具下,他的眼神深邃而神秘,让人无法看透。</p>
<p>
舞会结束后,公主与神秘人单独交谈。在月光下,神秘人摘下了面具,露出了一个英俊的面孔。他告诉公主,自己来自遥远的星球,曾因一场灾难而流落至此。在公主的帮助下,他渐渐恢复了记忆,并想借此机会报答公主的恩情。听闻此事,公主感动不已,决定与神秘人共同守护这个星球,让幸福永远流传。从此,他们携手前行,让这个星球变得更加美好。
</p>
</div>
<div class="block">
<p>在一个遥远的星球上,有一座神秘的宫殿,那里居住着一位美丽善良的公主。公主有着一双明亮的眼睛,仿佛能看透人心。她待人热情,让每个见过她的人都为之倾倒。宫殿的周围,是一片神奇的森林,里面住着形态各异的仙子。她们各司其职,为星球的居民带来幸福和祥和。
这一天,星球上举行了一场盛大的舞会。</p>
<p>来自四面八方的舞者齐聚一堂,为公主献上最美的舞蹈。宫殿里弥漫着花香,月光洒在舞池中,如梦似幻。公主穿着一件璀璨的礼服,优雅地起舞。在她的身边,是一位英俊潇洒的少年,他是星球上的勇士,曾为保卫家园立下赫赫战功。
舞会进行得如火如荼,忽然,一道乌云遮住了月光。众人都惊慌失措,担忧起来。</p>
<p>公主却镇定自若,她知道,这是森林里的仙子们在提醒她,有一位神秘的客人即将到来。果然,不久后,一位戴着面具的神秘人出现在舞会上。他舞艺高超,引得众人赞叹不已。面具下,他的眼神深邃而神秘,让人无法看透。</p>
<p>
舞会结束后,公主与神秘人单独交谈。在月光下,神秘人摘下了面具,露出了一个英俊的面孔。他告诉公主,自己来自遥远的星球,曾因一场灾难而流落至此。在公主的帮助下,他渐渐恢复了记忆,并想借此机会报答公主的恩情。听闻此事,公主感动不已,决定与神秘人共同守护这个星球,让幸福永远流传。从此,他们携手前行,让这个星球变得更加美好。
</p>
</div>
</div>
</div>
FAB Morph
<div class="page">
<div class="navbar">
<div class="navbar-bg"></div>
<div class="navbar-inner sliding">
<div class="left">
<a class="link back">
<i class="icon icon-back"></i>
<span class="if-not-md">返回</span>
</a>
</div>
<div class="title">浮动操作按钮变形</div>
</div>
</div>
<div class="toolbar tabbar tabbar-icons toolbar-bottom fab-morph-target">
<div class="toolbar-inner">
<a class="tab-link tab-link-active">
<i class="icon f7-icons if-not-md">envelope_fill</i>
<i class="icon material-icons md-only">email</i>
<span class="tabbar-label">Inbox</span>
</a>
<a class="tab-link">
<i class="icon f7-icons if-not-md">calendar_fill</i>
<i class="icon material-icons md-only">today</i>
<span class="tabbar-label">Calendar</span>
</a>
<a class="tab-link">
<i class="icon f7-icons if-not-md">cloud_upload_fill</i>
<i class="icon material-icons md-only">file_upload</i>
<span class="tabbar-label">Upload</span>
</a>
</div>
</div>
<div class="fab fab-right-bottom fab-morph" data-morph-to=".toolbar.fab-morph-target">
<a>
<i class="icon f7-icons if-not-md">plus</i>
<i class="icon material-icons md-only">add</i>
</a>
</div>
<div class="fab fab-left-bottom fab-morph" data-morph-to=".demo-fab-sheet.fab-morph-target">
<a>
<i class="icon f7-icons if-not-md">plus</i>
<i class="icon material-icons md-only">add</i>
</a>
</div>
<div class="fab fab-center-bottom fab-morph" data-morph-to=".demo-fab-fullscreen-sheet.fab-morph-target">
<a>
<i class="icon f7-icons if-not-md">plus</i>
<i class="icon material-icons md-only">add</i>
</a>
</div>
<div class="list links-list demo-fab-sheet fab-morph-target">
<ul>
<li><a class="fab-close">Link 1</a></li>
<li><a class="fab-close">Link 2</a></li>
<li><a class="fab-close">Link 3</a></li>
<li><a class="fab-close">Link 4</a></li>
</ul>
</div>
<div class="demo-fab-fullscreen-sheet fab-morph-target">
<div class="block-title">选择操作</div>
<div class="list links-list">
<ul>
<li><a class="fab-close">操作1</a></li>
<li><a class="fab-close">操作2 2</a></li>
<li><a class="fab-close">操作 3</a></li>
<li><a class="fab-close">操作 4</a></li>
</ul>
</div>
</div>
<div class="page-content">
<div class="block">
<p>在一个遥远的星球上,有一座神秘的宫殿,那里居住着一位美丽善良的公主。公主有着一双明亮的眼睛,仿佛能看透人心。她待人热情,让每个见过她的人都为之倾倒。宫殿的周围,是一片神奇的森林,里面住着形态各异的仙子。她们各司其职,为星球的居民带来幸福和祥和。
这一天,星球上举行了一场盛大的舞会。</p>
<p>来自四面八方的舞者齐聚一堂,为公主献上最美的舞蹈。宫殿里弥漫着花香,月光洒在舞池中,如梦似幻。公主穿着一件璀璨的礼服,优雅地起舞。在她的身边,是一位英俊潇洒的少年,他是星球上的勇士,曾为保卫家园立下赫赫战功。
舞会进行得如火如荼,忽然,一道乌云遮住了月光。众人都惊慌失措,担忧起来。</p>
<p>公主却镇定自若,她知道,这是森林里的仙子们在提醒她,有一位神秘的客人即将到来。果然,不久后,一位戴着面具的神秘人出现在舞会上。他舞艺高超,引得众人赞叹不已。面具下,他的眼神深邃而神秘,让人无法看透。</p>
<p>
舞会结束后,公主与神秘人单独交谈。在月光下,神秘人摘下了面具,露出了一个英俊的面孔。他告诉公主,自己来自遥远的星球,曾因一场灾难而流落至此。在公主的帮助下,他渐渐恢复了记忆,并想借此机会报答公主的恩情。听闻此事,公主感动不已,决定与神秘人共同守护这个星球,让幸福永远流传。从此,他们携手前行,让这个星球变得更加美好。
</p>
</div>
<div class="block">
<p>在一个遥远的星球上,有一座神秘的宫殿,那里居住着一位美丽善良的公主。公主有着一双明亮的眼睛,仿佛能看透人心。她待人热情,让每个见过她的人都为之倾倒。宫殿的周围,是一片神奇的森林,里面住着形态各异的仙子。她们各司其职,为星球的居民带来幸福和祥和。
这一天,星球上举行了一场盛大的舞会。</p>
<p>来自四面八方的舞者齐聚一堂,为公主献上最美的舞蹈。宫殿里弥漫着花香,月光洒在舞池中,如梦似幻。公主穿着一件璀璨的礼服,优雅地起舞。在她的身边,是一位英俊潇洒的少年,他是星球上的勇士,曾为保卫家园立下赫赫战功。
舞会进行得如火如荼,忽然,一道乌云遮住了月光。众人都惊慌失措,担忧起来。</p>
<p>公主却镇定自若,她知道,这是森林里的仙子们在提醒她,有一位神秘的客人即将到来。果然,不久后,一位戴着面具的神秘人出现在舞会上。他舞艺高超,引得众人赞叹不已。面具下,他的眼神深邃而神秘,让人无法看透。</p>
<p>
舞会结束后,公主与神秘人单独交谈。在月光下,神秘人摘下了面具,露出了一个英俊的面孔。他告诉公主,自己来自遥远的星球,曾因一场灾难而流落至此。在公主的帮助下,他渐渐恢复了记忆,并想借此机会报答公主的恩情。听闻此事,公主感动不已,决定与神秘人共同守护这个星球,让幸福永远流传。从此,他们携手前行,让这个星球变得更加美好。
</p>
</div>
<div class="block">
<p>在一个遥远的星球上,有一座神秘的宫殿,那里居住着一位美丽善良的公主。公主有着一双明亮的眼睛,仿佛能看透人心。她待人热情,让每个见过她的人都为之倾倒。宫殿的周围,是一片神奇的森林,里面住着形态各异的仙子。她们各司其职,为星球的居民带来幸福和祥和。
这一天,星球上举行了一场盛大的舞会。</p>
<p>来自四面八方的舞者齐聚一堂,为公主献上最美的舞蹈。宫殿里弥漫着花香,月光洒在舞池中,如梦似幻。公主穿着一件璀璨的礼服,优雅地起舞。在她的身边,是一位英俊潇洒的少年,他是星球上的勇士,曾为保卫家园立下赫赫战功。
舞会进行得如火如荼,忽然,一道乌云遮住了月光。众人都惊慌失措,担忧起来。</p>
<p>公主却镇定自若,她知道,这是森林里的仙子们在提醒她,有一位神秘的客人即将到来。果然,不久后,一位戴着面具的神秘人出现在舞会上。他舞艺高超,引得众人赞叹不已。面具下,他的眼神深邃而神秘,让人无法看透。</p>
<p>
舞会结束后,公主与神秘人单独交谈。在月光下,神秘人摘下了面具,露出了一个英俊的面孔。他告诉公主,自己来自遥远的星球,曾因一场灾难而流落至此。在公主的帮助下,他渐渐恢复了记忆,并想借此机会报答公主的恩情。听闻此事,公主感动不已,决定与神秘人共同守护这个星球,让幸福永远流传。从此,他们携手前行,让这个星球变得更加美好。
</p>
</div>
<div class="block">
<p>在一个遥远的星球上,有一座神秘的宫殿,那里居住着一位美丽善良的公主。公主有着一双明亮的眼睛,仿佛能看透人心。她待人热情,让每个见过她的人都为之倾倒。宫殿的周围,是一片神奇的森林,里面住着形态各异的仙子。她们各司其职,为星球的居民带来幸福和祥和。
这一天,星球上举行了一场盛大的舞会。</p>
<p>来自四面八方的舞者齐聚一堂,为公主献上最美的舞蹈。宫殿里弥漫着花香,月光洒在舞池中,如梦似幻。公主穿着一件璀璨的礼服,优雅地起舞。在她的身边,是一位英俊潇洒的少年,他是星球上的勇士,曾为保卫家园立下赫赫战功。
舞会进行得如火如荼,忽然,一道乌云遮住了月光。众人都惊慌失措,担忧起来。</p>
<p>公主却镇定自若,她知道,这是森林里的仙子们在提醒她,有一位神秘的客人即将到来。果然,不久后,一位戴着面具的神秘人出现在舞会上。他舞艺高超,引得众人赞叹不已。面具下,他的眼神深邃而神秘,让人无法看透。</p>
<p>
舞会结束后,公主与神秘人单独交谈。在月光下,神秘人摘下了面具,露出了一个英俊的面孔。他告诉公主,自己来自遥远的星球,曾因一场灾难而流落至此。在公主的帮助下,他渐渐恢复了记忆,并想借此机会报答公主的恩情。听闻此事,公主感动不已,决定与神秘人共同守护这个星球,让幸福永远流传。从此,他们携手前行,让这个星球变得更加美好。
</p>
</div>
</div>
</div>