Popup Vue 组件

Popup 是一个弹出窗口,其中包含任何 HTML 内容,它会弹出显示在应用的主要内容之上。与其他所有覆盖层一样,Popup 也是所谓“临时视图”的一部分。

Popup Vue 组件表示 Popup 组件。

包括以下组件

属性类型说明
<f7-popup> 属性
tablet-fullscreen布尔值定义 Popup 在平板电脑上是否全屏显示
opened布尔值允许打开/关闭 Popup 并设置其初始状态
backdrop布尔值启用 Popup 遮罩层(后面的深色半透明层)。默认情况继承相同的应用程序参数值 (true)
backdrop-elstring
object
自定义遮罩元素的 HTML 元素或字符串 CSS 选择器
backdropUnique布尔值启用后,它将专门为该模态创建唯一的遮罩元素
close-by-backdrop-click布尔值启用后,点击遮罩层将关闭弹出层。默认情况继承相同的应用程序参数值 (true)
close-on-escape布尔值启用后,按 ESC 键盘键将关闭弹出窗口
animate布尔值Popup 是否应使用动画打开/关闭。可以在 .open().close() 方法中覆盖。默认情况继承相同的应用程序参数值 (true)
swipe-to-close布尔值
string
Popup 是否可以通过滑动操作关闭。可以是 true,允许通过向上和向下的滑动关闭弹出,也可以是 to-top(字符串),仅允许向上滑动关闭弹出,或 to-bottom(字符串),仅允许向下滑动关闭。
swipe-handlerHTMLElement
string
如果没有传递,则可以通过滑动关闭整个弹出窗口。您可以在此处传递 HTML 元素或用作滑动目标的自定义元素的字符串 CSS 选择器。(swipeToClose 也必须启用)
push布尔值启用后,它会在打开时将视图推送到后面。仅在顶部安全区域到位时才起作用。还可以通过将popup-push类添加到 Popup 元素来启用它。
container-elHTMLElement
string
要挂载模态的元素(默认为应用程序根元素)
事件说明
<f7-popup> 事件
popup:openPopup 开始打开动画时将触发该事件
popup:openedPopup 完成打开动画后将触发该事件
popup:closePopup 开始关闭动画时将触发该事件
popup:closedPopup 完成关闭动画后将触发该事件
popup:swipestart在滑动关闭交互开始时(当用户刚开始拖动弹出窗口时)触发该事件
popup:swipemove在滑动关闭移动交互时触发该事件
popup:swipeend在滑动关闭松开时触发该事件
popup:swipeclose通过滑动关闭弹出窗口时将触发该事件

Popup 组件支持 opened prop 上的 v-model

<template>
  <f7-page>
    <f7-popup v-model:opened="isOpened">
      ...
    </f7-popup>
    <p>Modal is opened: {{ isOpened }}</p>
  </f7-page>
</template>
<script>
  export default {
    data() {
      return {
        isOpened: false,
      };
    }
  };
</script>

打开和关闭 Popup

您可以控制 Popup 状态,打开并关闭它

示例

popup.vue
<template>
  <f7-page @page:beforeremove="onPageBeforeRemove">
    <f7-navbar title="Popup"></f7-navbar>
    <f7-block strong-ios outline-ios>
      <p>
        Popup is a modal 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".
      </p>
      <p>
        <f7-button fill popup-open=".demo-popup">Open Popup</f7-button>
      </p>
      <p>
        <f7-button fill @click="popupOpened = true">Open Via Prop Change</f7-button>
      </p>
      <p>
        <f7-button fill @click="createPopup">Create Dynamic Popup</f7-button>
      </p>
    </f7-block>

    <f7-block-title>Swipe To Close</f7-block-title>
    <f7-block strong-ios outline-ios>
      <p>Popup can be closed with swipe to top or bottom:</p>
      <p>
        <f7-button fill popup-open=".demo-popup-swipe">Swipe To Close</f7-button>
      </p>
      <p>
        Or it can be closed with swipe on special swipe handler and, for example, only to bottom:
      </p>
      <p>
        <f7-button fill popup-open=".demo-popup-swipe-handler">With Swipe Handler</f7-button>
      </p>
    </f7-block>

    <f7-block-title>Push View</f7-block-title>
    <f7-block strong-ios outline-ios>
      <p>
        Popup can push view behind. By default has effect only when `safe-area-inset-top` is more
        than zero (iOS fullscreen webapp or iOS cordova app)
      </p>
      <p>
        <f7-button fill popup-open=".demo-popup-push">Popup Push</f7-button>
      </p>
    </f7-block>

    <f7-popup v-model:opened="popupOpened" class="demo-popup">
      <f7-page>
        <f7-navbar title="Popup Title">
          <f7-nav-right>
            <f7-link popup-close>Close</f7-link>
          </f7-nav-right>
        </f7-navbar>
        <f7-block>
          <p>
            Here comes popup. You can put here anything, even independent view with its own
            navigation. Also not, that by default popup looks a bit different on iPhone/iPod and
            iPad, on iPhone it is fullscreen.
          </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>
          <p>
            Duis ut mauris sollicitudin, venenatis nisi sed, luctus ligula. Phasellus blandit nisl
            ut lorem semper pharetra. Nullam tortor nibh, suscipit in consequat vel, feugiat sed
            quam. Nam risus libero, auctor vel tristique ac, malesuada ut ante. Sed molestie, est in
            eleifend sagittis, leo tortor ullamcorper erat, at vulputate eros sapien nec libero.
            Mauris dapibus laoreet nibh quis bibendum. Fusce dolor sem, suscipit in iaculis id,
            pharetra at urna. Pellentesque tempor congue massa quis faucibus. Vestibulum nunc eros,
            convallis blandit dui sit amet, gravida adipiscing libero.
          </p>
        </f7-block>
      </f7-page>
    </f7-popup>

    <f7-popup push class="demo-popup-push">
      <f7-view>
        <f7-page>
          <f7-navbar title="Push Popup" large transparent>
            <f7-nav-right>
              <f7-link popup-close>Close</f7-link>
            </f7-nav-right>
          </f7-navbar>
          <f7-block>
            <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>
            <p>
              Duis ut mauris sollicitudin, venenatis nisi sed, luctus ligula. Phasellus blandit nisl
              ut lorem semper pharetra. Nullam tortor nibh, suscipit in consequat vel, feugiat sed
              quam. Nam risus libero, auctor vel tristique ac, malesuada ut ante. Sed molestie, est
              in eleifend sagittis, leo tortor ullamcorper erat, at vulputate eros sapien nec
              libero. Mauris dapibus laoreet nibh quis bibendum. Fusce dolor sem, suscipit in
              iaculis id, pharetra at urna. Pellentesque tempor congue massa quis faucibus.
              Vestibulum nunc eros, convallis blandit dui sit amet, gravida adipiscing libero.
            </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>
          </f7-block>
        </f7-page>
      </f7-view>
    </f7-popup>

    <f7-popup class="demo-popup-swipe" swipe-to-close>
      <f7-page>
        <f7-navbar title="Swipe To Close">
          <f7-nav-right>
            <f7-link popup-close>Close</f7-link>
          </f7-nav-right>
        </f7-navbar>

        <div style="height: 100%" class="display-flex justify-content-center align-items-center">
          <p>Swipe me up or down</p>
        </div>
      </f7-page>
    </f7-popup>

    <f7-popup
      class="demo-popup-swipe-handler"
      swipe-to-close="to-bottom"
      swipe-handler=".swipe-handler"
    >
      <f7-page>
        <template #fixed>
          <div class="swipe-handler"></div>
        </template>
        <f7-block-title large>Hello!</f7-block-title>
        <f7-block strong-ios outline-ios>
          <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>
          <p>
            Duis ut mauris sollicitudin, venenatis nisi sed, luctus ligula. Phasellus blandit nisl
            ut lorem semper pharetra. Nullam tortor nibh, suscipit in consequat vel, feugiat sed
            quam. Nam risus libero, auctor vel tristique ac, malesuada ut ante. Sed molestie, est in
            eleifend sagittis, leo tortor ullamcorper erat, at vulputate eros sapien nec libero.
            Mauris dapibus laoreet nibh quis bibendum. Fusce dolor sem, suscipit in iaculis id,
            pharetra at urna. Pellentesque tempor congue massa quis faucibus. Vestibulum nunc eros,
            convallis blandit dui sit amet, gravida adipiscing libero.
          </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>
          <p>
            Duis ut mauris sollicitudin, venenatis nisi sed, luctus ligula. Phasellus blandit nisl
            ut lorem semper pharetra. Nullam tortor nibh, suscipit in consequat vel, feugiat sed
            quam. Nam risus libero, auctor vel tristique ac, malesuada ut ante. Sed molestie, est in
            eleifend sagittis, leo tortor ullamcorper erat, at vulputate eros sapien nec libero.
            Mauris dapibus laoreet nibh quis bibendum. Fusce dolor sem, suscipit in iaculis id,
            pharetra at urna. Pellentesque tempor congue massa quis faucibus. Vestibulum nunc eros,
            convallis blandit dui sit amet, gravida adipiscing libero.
          </p>
        </f7-block>
      </f7-page>
    </f7-popup>
  </f7-page>
</template>
<script>
import {
  f7Navbar,
  f7Page,
  f7Popup,
  f7BlockTitle,
  f7Block,
  f7NavRight,
  f7Link,
  f7Button,
  f7View,
  f7,
} from 'framework7-vue';

export default {
  components: {
    f7Navbar,
    f7Page,
    f7Popup,
    f7BlockTitle,
    f7Block,
    f7NavRight,
    f7Link,
    f7Button,
    f7View,
  },
  data() {
    return {
      popupOpened: false,
    };
  },
  methods: {
    createPopup() {
      const self = this;
      // Create popup
      if (!self.popup) {
        self.popup = f7.popup.create({
          content: `
              <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>
            `.trim(),
        });
      }
      // Open it
      self.popup.open();
    },
    onPageBeforeRemove() {
      const self = this;
      // Destroy popup when page removed
      if (self.popup) self.popup.destroy();
    },
  },
};
</script>