Popup
Popup is a popup window with any HTML content that pops up over App's main content. Popup as all other overlays is part of so called "Temporary Views".
Popup Layout
Popup layout is pretty simple:
<body>
...
<div class="popup">
Any HTML content goes here
</div>
</body>
Popup Size
By default Popup has a bit different size on phones and tablets (iPad). On phones it is fullscreen while on tablets it is 630px width and height. If you want to make it fullscreen size on tablets, you should add additional "popup-tablet-fullscreen" class to the required popup:
<body>
...
<!-- This popup has fullscreen size on tablets -->
<div class="popup popup-tablet-fullscreen">
Any HTML content goes here
</div>
</body>
Popup App Methods
Let's look at related App methods to work with Popup:
app.popup.create(parameters)- create Popup instance
- parameters - object. Object with popup parameters
Method returns created Popup's instance
app.popup.destroy(el)- destroy Popup instance
- el - HTMLElement or string (with CSS Selector) or object. Popup element or Popup instance to destroy.
app.popup.get(el)- get Popup instance by HTML element
- el - HTMLElement or string (with CSS Selector). Popup element.
Method returns Popup's instance
app.popup.open(el, animate)- opens Popup
- el - HTMLElement or string (with CSS Selector). Popup element to open.
- animate - boolean. Open Popup with animation.
Method returns Popup's instance
app.popup.close(el, animate)- closes Popup
- el - HTMLElement or string (with CSS Selector). Popup element to close.
- animate - boolean. Close Popup with animation.
Method returns Popup's instance
Popup Parameters
Now let's look at list of available parameters we need to create Popup:
Parameter | Type | Default | Description |
---|---|---|---|
el | HTMLElement | Popup element. Can be useful if you already have Popup element in your HTML and want to create new instance using this element | |
content | string | Full Popup HTML layout string. Can be useful if you want to create Popup element dynamically | |
backdrop | boolean | true | Enables Popup backdrop (dark semi transparent layer behind) |
backdropEl | HTMLElement string | HTML element or string CSS selector of custom backdrop element | |
backdropUnique | boolean | If enabled it creates unique backdrop element exclusively for this modal | |
closeByBackdropClick | boolean | true | When enabled, popup will be closed on backdrop click |
closeOnEscape | boolean | false | When enabled, popup will be closed on ESC keyboard key press |
animate | boolean | true | Whether the Popup should be opened/closed with animation or not. Can be overwritten in .open() and .close() methods |
swipeToClose | boolean string | false | Whether the Popup can be closed with swipe gesture. Can be true to allow to close popup with swipes to top and to bottom, or can be to-top (string) to allow only swipe to top to close popup, or to-bottom (string) to allow only swipe to bottom to close. |
swipeHandler | HTMLElement string | If not passed, then whole popup can be swiped to close. You can pass here HTML element or string CSS selector of custom element that will be used as a swipe target. (swipeToClose must be also enabled) | |
push | boolean | false | When enabled it will push view behind on open. Works only when top safe area is in place. It can also be enabled by adding popup-push class to Popup element. |
containerEl | HTMLElement string | Element to mount modal to (default to app root element) | |
on | object | Object with events handlers. For example:
|
Note that all following parameters can be used in global app parameters under popup
property to set defaults for all popups. For example:
var app = new Framework7({
popup: {
closeByBackdropClick: false,
}
});
If you use auto-initialized popups (e.g. you don't create them via app.popup.create
), it is possible to pass all available popup parameters via data-
attributes. For example:
<!-- Pass parameters as kebab-case data attributes -->
<div class="popup" data-close-on-escape="true" data-swipe-to-close="to-bottom">
...
</div>
Popup Methods & Properties
So to create Popup we have to call:
var popup = app.popup.create({ /* parameters */ })
After that we have its initialized instance (like popup
variable in example above) with useful methods and properties:
Properties | |
---|---|
popup.app | Link to global app instance |
popup.el | Popup HTML element |
popup.$el | Dom7 instance with popup HTML element |
popup.backdropEl | Backdrop HTML element |
popup.$backdropEl | Dom7 instance with backdrop HTML element |
popup.params | Popup parameters |
popup.opened | Boolean prop indicating whether popup is opened or not |
Methods | |
popup.open(animate) | Open popup. Where
|
popup.close(animate) | Close popup. Where
|
popup.destroy() | Destroy popup |
popup.on(event, handler) | Add event handler |
popup.once(event, handler) | Add event handler that will be removed after it was fired |
popup.off(event, handler) | Remove event handler |
popup.off(event) | Remove all handlers for specified event |
popup.emit(event, ...args) | Fire event on instance |
Control Popup With Links
It is possible to open and close required popup (if you have them in DOM) using special classes and data attributes on links:
To open popup we need to add "popup-open" class to any HTML element (preferred to link)
To close popup we need to add "popup-close" class to any HTML element (preferred to link)
If you have more than one popup in DOM, you need to specify appropriate popup via additional data-popup=".my-popup" attribute on this HTML element
According to above note:
<!-- In data-popup attribute we specify CSS selector of popup we need to open -->
<p><a href="#" data-popup=".my-popup" class="popup-open">Open Popup</a></p>
<!-- And somewhere in DOM -->
<div class="popup my-popup">
<div class="view">
<div class="page">
<div class="navbar">
<div class="navbar-bg"></div>
<div class="navbar-inner">
<div class="title">Popup</div>
<div class="right">
<!-- Link to close popup -->
<a class="link popup-close">Close</a>
</div>
</div>
</div>
<div class="page-content">
...
</div>
</div>
</div>
...
</div>
Popup Events
Popup will fire the following DOM events on popup element and events on app and popup instance:
DOM Events
Event | Target | Description |
---|---|---|
popup:open | Popup Element<div class="popup"> | Event will be triggered when Popup starts its opening animation |
popup:opened | Popup Element<div class="popup"> | Event will be triggered after Popup completes its opening animation |
popup:close | Popup Element<div class="popup"> | Event will be triggered when Popup starts its closing animation |
popup:closed | Popup Element<div class="popup"> | Event will be triggered after Popup completes its closing animation |
popup:swipestart | Popup Element<div class="popup"> | Event will be triggered in the beginning of swipe-to-close interaction (when user just started to drag popup) |
popup:swipemove | Popup Element<div class="popup"> | Event will be triggered on swipe-to-close move interaction |
popup:swipeend | Popup Element<div class="popup"> | Event will be triggered on swipe-to-close release |
popup:swipeclose | Popup Element<div class="popup"> | Event will be triggered when popup closed with swipe |
popup:beforedestroy | Popup Element<div class="popup"> | Event will be triggered right before Popup instance will be destroyed |
App and Popup Instance Events
Popup instance emits events on both self instance and app instance. App instance events has same names prefixed with popup
.
Event | Arguments | Target | Description |
---|---|---|---|
open | popup | popup | Event will be triggered when Popup starts its opening animation. As an argument event handler receives popup instance |
popupOpen | popup | app | |
opened | popup | popup | Event will be triggered after Popup completes its opening animation. As an argument event handler receives popup instance |
popupOpened | popup | app | |
close | popup | popup | Event will be triggered when Popup starts its closing animation. As an argument event handler receives popup instance |
popupClose | popup | app | |
closed | popup | popup | Event will be triggered after Popup completes its closing animation. As an argument event handler receives popup instance |
popupClosed | popup | app | |
beforeDestroy | popup | popup | Event will be triggered right before Popup instance will be destroyed. As an argument event handler receives popup instance |
popupBeforeDestroy | popup | app | |
swipeStart | popup | popup | Event will be triggered in the beginning of swipe-to-close interaction (when user just started to drag popup) |
popupSwipeStart | popup | app | |
swipeMove | popup | popup | Event will be triggered on swipe-to-close move interaction |
popupSwipeMove | popup | app | |
swipeEnd | popup | popup | Event will be triggered on swipe-to-close release |
popupSwipeEnd | popup | app | |
swipeClose | popup | popup | Event will be triggered when popup closed with swipe |
popupSwipeClose | popup | app |
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-popup-border-radius: 0px;
--f7-popup-tablet-width: 630px;
--f7-popup-tablet-height: 630px;
--f7-popup-push-offset: var(--f7-safe-area-top);
/*
--f7-popup-tablet-border-radius: var(--f7-popup-border-radius);
*/
}
.ios {
--f7-popup-tablet-border-radius: 5px;
--f7-popup-transition-duration: 400ms;
--f7-popup-transition-timing-function: initial;
--f7-popup-push-border-radius: 10px;
}
.md {
--f7-popup-tablet-border-radius: 28px;
--f7-popup-transition-duration: 600ms;
--f7-popup-transition-timing-function: cubic-bezier(0, 1, 0.2, 1);
--f7-popup-push-border-radius: 28px;
}
Examples
<template>
<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="page-content">
<div class="block block-strong-ios block-outline-ios">
<p>弹出窗口是一个在应用程序的主要内容上方弹出的具有任何HTML内容的模态窗口。弹出窗口和其他覆盖层一样,是所谓的“临时视图”的一部分。.</p>
<p>
<a class="button button-fill popup-open" data-popup=".demo-popup">打开弹出框</a>
</p>
<p>
<a class="button button-fill" @click=${createPopup}>创建动态弹出框</a>
</p>
</div>
<div class="block-title">滑动关闭</div>
<div class="block block-strong-ios block-outline-ios">
<p>弹出窗口可以通过向上或向下滑动来关闭。</p>
<p>
<a class="button button-fill popup-open" data-popup=".demo-popup-swipe">滑动关闭</a>
</p>
<p>或者可以通过在特殊的滑动处理程序上向下滑动来关闭它。</p>
<p>
<a class="button button-fill popup-open" data-popup=".demo-popup-swipe-handler">滑动回调事件</a>
</p>
</div>
<div class="block-title">覆盖视图</div>
<div class="block block-strong-ios block-outline-ios">
<p>弹出窗口可能会将视图推到后面。默认情况下,只有当"safe-area-inset-top"大于零时(iOS全屏Web应用程序或iOS Cordova应用程序),才会产生效果。</p>
<p>
<a class="button button-fill popup-open" data-popup=".demo-popup-push">push弹出框</a>
</p>
</div>
</div>
<div class="popup demo-popup">
<div class="page">
<div class="navbar">
<div class="navbar-bg"></div>
<div class="navbar-inner">
<div class="title">Popup Title</div>
<div class="right"><a class="link popup-close">Close</a></div>
</div>
</div>
<div class="page-content">
<div class="block">
<p>这里出现了弹出窗口。您可以在这里放置任何内容,甚至可以包含具有自己导航的独立视图。另外,请注意,默认情况下,iPhone/iPod和iPad上的弹出窗口外观略有不同,在iPhone上是全屏显示的。</p>
<p>从前有一个小村庄,村庄里住着一群快乐的农民。他们过着简单而宁静的生活,每天努力工作,互相帮助。然而,村庄的水井却出了问题,水源渐渐枯竭,农民们陷入了困境。
为了解决这个问题,村庄的领导决定召开一次村民大会。在会上,一位年轻的农民提出了一个创新的想法:利用雨水收集系统来解决水井干涸的问题。他详细解释了如何设计和建造这个系统,并列出了所需的材料和步骤。</p>
<p>农民们被这个想法所激发,他们积极参与到项目中。大家分工合作,有的负责收集材料,有的负责挖掘水渠,有的负责安装雨水收集设备。大家一起努力,克服了各种困难和挑战。.</p>
<p>最终,雨水收集系统建成了。当第一场雨来临时,水渠迅速充满了清澈的雨水。农民们欢呼雀跃,他们终于解决了水井干涸的问题。村庄重新恢复了生机,农作物茁壮成长。
这个小故事告诉我们,团结合作和创新思维可以克服各种困难。只要我们齐心协力,勇于尝试新的解决方案,就能够找到问题的答案,并创造出美好的未来。</p>
</div>
</div>
</div>
</div>
<div class="popup demo-popup-push">
<div class="view view-init">
<div class="page page-with-navbar-large">
<div class="navbar navbar-large navbar-transparent">
<div class="navbar-bg"></div>
<div class="navbar-inner">
<div class="title">Push Popup</div>
<div class="right"><a class="link popup-close">Close</a></div>
<div class="title-large">
<div class="title-large-text">Push Popup</div>
</div>
</div>
</div>
<div class="page-content">
<div class="block">
<p>从前有一个小村庄,村庄里住着一群快乐的农民。他们过着简单而宁静的生活,每天努力工作,互相帮助。然而,村庄的水井却出了问题,水源渐渐枯竭,农民们陷入了困境。
为了解决这个问题,村庄的领导决定召开一次村民大会。在会上,一位年轻的农民提出了一个创新的想法:利用雨水收集系统来解决水井干涸的问题。他详细解释了如何设计和建造这个系统,并列出了所需的材料和步骤。</p>
<p>农民们被这个想法所激发,他们积极参与到项目中。大家分工合作,有的负责收集材料,有的负责挖掘水渠,有的负责安装雨水收集设备。大家一起努力,克服了各种困难和挑战。.</p>
<p>最终,雨水收集系统建成了。当第一场雨来临时,水渠迅速充满了清澈的雨水。农民们欢呼雀跃,他们终于解决了水井干涸的问题。村庄重新恢复了生机,农作物茁壮成长。
这个小故事告诉我们,团结合作和创新思维可以克服各种困难。只要我们齐心协力,勇于尝试新的解决方案,就能够找到问题的答案,并创造出美好的未来。</p>
</div>
</div>
</div>
</div>
</div>
<div class="popup demo-popup-swipe">
<div class="page">
<div class="navbar">
<div class="navbar-bg"></div>
<div class="navbar-inner">
<div class="title">滑动关闭</div>
<div class="right"><a class="link popup-close">关闭</a></div>
</div>
</div>
<div class="page-content">
<div style="height: 100%" class="display-flex justify-content-center align-items-center">
<p>Swipe me up or down</p>
</div>
</div>
</div>
</div>
<div class="popup demo-popup-swipe-handler">
<div class="page">
<div class="swipe-handler"></div>
<div class="page-content">
<div class="block-title block-title-large">Hello!</div>
<div class="block block-strong-ios block-outline-ios">
<p>从前有一个小村庄,村庄里住着一群快乐的农民。他们过着简单而宁静的生活,每天努力工作,互相帮助。然而,村庄的水井却出了问题,水源渐渐枯竭,农民们陷入了困境。
为了解决这个问题,村庄的领导决定召开一次村民大会。在会上,一位年轻的农民提出了一个创新的想法:利用雨水收集系统来解决水井干涸的问题。他详细解释了如何设计和建造这个系统,并列出了所需的材料和步骤。</p>
<p>农民们被这个想法所激发,他们积极参与到项目中。大家分工合作,有的负责收集材料,有的负责挖掘水渠,有的负责安装雨水收集设备。大家一起努力,克服了各种困难和挑战。.</p>
<p>最终,雨水收集系统建成了。当第一场雨来临时,水渠迅速充满了清澈的雨水。农民们欢呼雀跃,他们终于解决了水井干涸的问题。村庄重新恢复了生机,农作物茁壮成长。
这个小故事告诉我们,团结合作和创新思维可以克服各种困难。只要我们齐心协力,勇于尝试新的解决方案,就能够找到问题的答案,并创造出美好的未来。</p>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
export default (props, { $f7, $onMounted, $onBeforeUnmount }) => {
let popup;
let popupSwipe;
let popupSwipeHandler;
let popupPush;
const createPopup = () => {
// Create popup
if (!popup) {
popup = $f7.popup.create({
content: /*html*/`
<div class="popup">
<div class="page">
<div class="navbar">
<div class="navbar-bg"></div>
<div class="navbar-inner">
<div class="title">Dynamic Popup</div>
<div class="right"><a class="link popup-close">Close</a></div>
</div>
</div>
<div class="page-content">
<div class="block">
<p>This popup was created dynamically</p>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse faucibus mauris leo, eu bibendum neque congue non. Ut leo mauris, eleifend eu commodo a, egestas ac urna. Maecenas in lacus faucibus, viverra ipsum pulvinar, molestie arcu. Etiam lacinia venenatis dignissim. Suspendisse non nisl semper tellus malesuada suscipit eu et eros. Nulla eu enim quis quam elementum vulputate. Mauris ornare consequat nunc viverra pellentesque. Aenean semper eu massa sit amet aliquam. Integer et neque sed libero mollis elementum at vitae ligula. Vestibulum pharetra sed libero sed porttitor. Suspendisse a faucibus lectus.</p>
</div>
</div>
</div>
</div>
`
});
}
// Open it
popup.open();
}
$onMounted(() => {
popupSwipe = $f7.popup.create({
el: '.demo-popup-swipe',
swipeToClose: true,
});
popupSwipeHandler = $f7.popup.create({
el: '.demo-popup-swipe-handler',
swipeToClose: 'to-bottom',
swipeHandler: '.swipe-handler'
});
popupPush = $f7.popup.create({
el: '.demo-popup-push',
swipeToClose: true,
push: true,
});
})
$onBeforeUnmount(() => {
// Destroy popup when page removed
if (popup) popup.destroy();
if (popupSwipe) popupSwipe.destroy();
if (popupSwipeHandler) popupSwipeHandler.destroy();
if (popupPush) popupPush.destroy();
})
return $render;
}
</script>