表單彈出視窗

工作表模態框是一種特殊覆蓋類型,類似於選擇器/日曆的覆蓋。此類模態框允許使用自訂內容建立自訂覆蓋

工作表版面

工作表版面相當簡單

<body>
  ...
  <!-- Sheet Modal Container -->
  <div class="sheet-modal">
    <!-- Sheet Modal Toolbar, optional -->
    <div class="toolbar">
      <div class="toolbar-inner">
        <div class="left"></div>
        <div class="right">
          <a href="#" class="link sheet-close">Done</a>
        </div>
      </div>
    </div>
    <!-- Sheet Modal Inner -->
    <div class="sheet-modal-inner">
      <!-- Sheet Modal content -->
      <div class="block">
        <p>Integer mollis nulla id nibh elementum finibus...</p>
      </div>
    </div>
  </div>

</body>

工作表頂部版面

預設情況下,工作表模態框會從螢幕底部開啟。也可以從螢幕頂部開啟。在此情況下,我們需要將 sheet-modal-top 類別新增至工作表元素。建議在此情況下使用底部工具列

<!-- Additional "sheet-modal-top" class to open it from top -->
<div class="sheet-modal sheet-modal-top">
  <!-- Bottom toolbar for top sheet -->
  <div class="toolbar toolbar-bottom">
    <div class="toolbar-inner">
      <div class="left"></div>
      <div class="right">
        <a href="#" class="link sheet-close">Done</a>
      </div>
    </div>
  </div>
  <!-- Sheet Modal Inner -->
  <div class="sheet-modal-inner">
    <!-- Sheet Modal content -->
    <div class="block">
      <p>Integer mollis nulla id nibh elementum finibus...</p>
    </div>
  </div>
</div>

工作表應用程式方法

讓我們看看相關應用程式方法,以使用工作表

app.sheet.create(參數)- 建立工作表實例

  • 參數 - 物件。包含工作表參數的物件

方法傳回建立的工作表實例

app.sheet.destroy(el)- 銷毀工作表實例

  • el - HTMLElement字串 (包含 CSS 選擇器) 或 物件。要銷毀的工作表元素或工作表實例。

app.sheet.get(el)- 透過 HTML 元素取得工作表實例

  • el - HTMLElement字串 (包含 CSS 選擇器)。工作表元素。

方法傳回工作表的實例

app.sheet.open(el, 動畫)- 開啟工作表

  • el - HTMLElement字串 (包含 CSS 選擇器)。要開啟的工作表元素。
  • 動畫 - 布林值。使用動畫開啟工作表。

方法傳回工作表的實例

app.sheet.close(el, 動畫)- 關閉工作表

  • el - HTMLElement字串 (包含 CSS 選擇器)。要關閉的工作表元素。
  • 動畫 - 布林值。使用動畫關閉工作表。

方法傳回工作表的實例

app.sheet.stepOpen(el)- 開啟/展開工作表滑動步驟

  • el - HTMLElement字串 (包含 CSS 選擇器)。要開啟滑動步驟的工作表元素。

方法傳回工作表的實例

app.sheet.stepClose(el)- 關閉/收合工作表滑動步驟

  • el - HTMLElementstring(使用 CSS 選擇器)。用於關閉滑動步驟的 Sheet 元素。

方法傳回工作表的實例

app.sheet.stepToggle(el)- 切換(開啟或關閉)Sheet 滑動步驟

  • el - HTMLElementstring(使用 CSS 選擇器)。用於切換滑動步驟的 Sheet 元素。

方法傳回工作表的實例

app.sheet.setBreakpoint(el, value)- 在特定中斷點上設定/開啟 Sheet 模態(來自 breakpoints 陣列參數)。傳遞 0 也會關閉 Sheet 模態,傳遞 1 會完全開啟它

方法傳回工作表的實例

Sheet 參數

現在讓我們來看一下建立 Sheet 所需的可用參數清單

參數類型預設值說明
elHTMLElementSheet 元素。如果您在 HTML 中已有 Sheet 元素,並想使用此元素建立新實例,這會很有用
contentstring完整的 Sheet HTML 版面配置字串。如果您想動態建立 Sheet 元素,這會很有用
backdropboolean啟用 Sheet 背景(深色半透明層)。預設值為 MD 主題的 true 和 iOS 主題的 false
backdropElHTMLElement
string
自訂背景元素的 HTML 元素或 CSS 選擇器字串
backdropUniquebooleanfalse如果啟用,它會為此模態建立獨特的背景元素
scrollToElHTMLElement
string
元素的 HTML 元素或字串(使用 CSS 選擇器)。如果指定,則 Sheet 會在開啟時嘗試將頁面內容捲動到此元素
closeByBackdropClickbooleantrue啟用時,會在背景點擊時關閉
closeByOutsideClickbooleanfalse啟用時,會在點擊其外部時關閉
closeOnEscapebooleanfalse啟用時,會在按下 ESC 鍵盤按鍵時關閉
animatebooleantrueSheet 是否應使用動畫開啟/關閉。可以在 .open().close() 方法中覆寫
swipeToClosebooleanfalseSheet 是否可以使用滑動手勢關閉
swipeToStepbooleanfalse啟用時,可以將開啟的 Sheet 分成兩種狀態:部分開啟和完全開啟,這可以用滑動來控制
swipeHandlerHTMLElement
string
如果未傳遞,則可以滑動整個 Sheet 來關閉。您可以在這裡傳遞自訂元素的 HTML 元素或 CSS 選擇器字串,該元素將用作滑動目標。(swipeToCloseswipeToStep 也必須啟用)
pushbooleanfalse啟用後,開啟時會將後面的視圖推到後面。僅在頂部安全區域就位時才有效。也可以透過將 sheet-modal-push 類別新增到 Sheet 元素來啟用。
中斷點數字陣列[]使用此參數取代 swipeToStep 以啟用滑動中斷點。必須是數字陣列,且大於 0 小於 1,其中 0 表示完全關閉,1 表示完全開啟,例如 [0.33, 0.66][0.5] 等。
背景中斷點數字0定義背景變為可見時的斷點。數字範圍從 0 (理想情況下從 breakpoints 陣列的最低 (第一個) 值) 到 1 (預設為 0)
推動中斷點數字0定義將後面的視圖推回時的斷點 (必須啟用 push)。數字範圍從 0 (理想情況下從 breakpoints 陣列的最低 (第一個) 值) 到 1 (預設為 0)
容器元素HTMLElement
string
用於安裝模態視窗的元素 (預設為應用程式根元素)
開啟物件

包含事件處理常式的物件。例如

var sheet = app.sheet.create({
  content: '<div class="sheet-modal">...</div>',
  on: {
    opened: function () {
      console.log('Sheet opened')
    }
  }
})

請注意,以下所有參數都可以在 sheet 屬性下的全域應用程式參數中使用,以設定所有工作表的預設值。例如

var app = new Framework7({
  sheet: {
    closeByBackdropClick: false,
  }
});

如果您使用自動初始化的工作表模態視窗 (例如,您不會透過 app.sheet.create 建立它們),則可以透過 data- 屬性傳遞所有可用的工作表參數。例如

<!-- Pass parameters as kebab-case data attributes -->
<div class="sheet-modal" data-close-on-escape="true" data-swipe-to-close="true">
  ...
</div>

工作表方法和屬性

因此,要建立工作表,我們必須呼叫

var sheet = app.sheet.create({ /* parameters */ })

之後,我們會取得其已初始化的執行個體 (例如上面範例中的 sheet 變數),其中包含有用的方法和屬性

屬性
sheet.app連結到全域應用程式執行個體
sheet.el工作表 HTML 元素
sheet.$el包含工作表 HTML 元素的 Dom7 執行個體
sheet.backdropEl背景 HTML 元素
sheet.$backdropEl包含背景 HTML 元素的 Dom7 執行個體
sheet.params工作表參數
sheet.opened布林值屬性,表示工作表是否已開啟
方法
sheet.open(animate)開啟工作表。其中
  • animate - 布林值 (預設為 true) - 定義是否應使用動畫開啟
sheet.close(animate)關閉工作表。其中
  • animate - 布林值(預設為 true) - 定義是否應使用動畫關閉
sheet.stepOpen()開啟/展開工作表滑動步驟
sheet.stepClose()關閉/收合工作表滑動步驟
sheet.stepToggle()切換(開啟或關閉)工作表滑動步驟
sheet.setSwipeStep()更新步驟位置。當工作表模式的內容在開啟時手動修改後,需要呼叫
sheet.setBreakpoint(value)在特定中斷點上設定/開啟工作表模式(來自 breakpoints 陣列參數)。傳遞 0 也會關閉工作表模式,傳遞 1 會完全開啟
sheet.destroy()銷毀工作表
sheet.on(event, handler)新增事件處理常式
sheet.once(event, handler)新增事件處理常式,在觸發後會移除
sheet.off(event, handler)移除事件處理常式
sheet.off(event)移除指定事件的所有處理常式
sheet.emit(event, ...args)在實例上觸發事件

可以使用連結上的特殊類別和資料屬性,開啟和關閉必要的表單(如果在 DOM 中有這些表單)

  • 若要開啟工作表,我們需要將「sheet-open」類別新增到任何 HTML 元素(建議使用連結)

  • 若要關閉工作表,我們需要將「sheet-close」類別新增到任何 HTML 元素(建議使用連結)

  • 如果在 DOM 中有多個工作表,您需要透過此 HTML 元素上的其他 data-sheet=".my-sheet" 屬性,指定適當的工作表

根據上述注意事項

<!-- In data-sheet attribute we specify CSS selector of sheet we need to open -->
<p><a href="#" data-sheet=".my-sheet" class="sheet-open">Open Sheet</a></p>

<!-- And somewhere in DOM -->
<div class="sheet-modal my-sheet">
  <div class="sheet-modal-inner">
    <!-- Link to close sheet -->
    <a class="link sheet-close">Close</a>
  </div>
</div>

滑動步驟

如果您傳遞 swipeToStep 參數,工作表將會部分開啟,並可透過滑動進一步展開。為了讓它運作,我們還需要在工作表 HTML 中定義第一個/初始步驟,以便 Framework7 能知道工作表應開啟多少。

若要讓它運作,我們需要使用 <div class="sheet-modal-swipe-step"> 元素包裝初始工作表內容,並在該工作表模式上設定 height:auto

<div class="sheet-modal" style="height: auto">
  <div class="sheet-modal-inner">
    <!-- initial sheet modal content -->
    <div class="sheet-modal-swipe-step">
      ...
    </div>
    <!-- rest of the content that will be opened with extra swipe -->
    ...
  </div>
</div>

對於頂部定位的工作表模式,此滑動步驟應位於底部

<div class="sheet-modal sheet-modal-top" style="height: auto">
  <div class="sheet-modal-inner">
    <!-- rest of the content that will be opened with extra swipe -->
    ...
    <!-- initial sheet modal content -->
    <div class="sheet-modal-swipe-step">
      ...
    </div>
  </div>
</div>

工作表事件

工作表會在工作表元素上觸發下列 DOM 事件,以及在應用程式和工作表實例上觸發事件

DOM 事件

事件目標說明
sheet:openSheet 元素<div class="sheet">當 Sheet 開始其開啟動畫時,將觸發事件
sheet:openedSheet 元素<div class="sheet">當 Sheet 完成其開啟動畫後,將觸發事件
sheet:closeSheet 元素<div class="sheet">當 Sheet 開始其關閉動畫時,將觸發事件
sheet:closedSheet 元素<div class="sheet">當 Sheet 完成其關閉動畫後,將觸發事件
sheet:stepopenSheet 元素<div class="sheet">當 Sheet 滑動步驟開啟/展開時,將觸發事件
sheet:stepcloseSheet 元素<div class="sheet">當 Sheet 滑動步驟關閉/收合時,將觸發事件
sheet:stepprogressSheet 元素<div class="sheet">當 Sheet 滑動步驟在步驟開啟和關閉狀態之間時,將觸發事件。作為 event.detail,它接收步驟開啟進度數字(從 01
sheet:breakpointSheet 元素<div class="sheet">當 Sheet 滑動步驟在步驟開啟和關閉狀態之間時,將觸發事件。作為 event.detail,它接收步驟開啟進度數字(從 01
sheet:beforedestroySheet 元素<div class="sheet">當 Sheet 斷點變更時,將觸發事件。作為 event.detail,它接收目前的斷點(從 01

應用程式和 Sheet 實例事件

Sheet 實例在自身實例和應用程式實例上發出事件。應用程式實例事件具有相同的名稱,並以 popup 為前綴。

事件引數目標說明
opensheetsheet當 Sheet 開始其開啟動畫時,將觸發事件。作為引數,事件處理常式接收 Sheet 實例
sheetOpensheetapp
openedsheetsheet當 Sheet 完成其開啟動畫後,將觸發事件。作為引數,事件處理常式接收 Sheet 實例
sheetOpenedsheetapp
closesheetsheet當 Sheet 開始其關閉動畫時,將觸發事件。作為引數,事件處理常式接收 Sheet 實例
sheetClosesheetapp
closedsheetsheet當 Sheet 完成其關閉動畫後,將觸發事件。作為引數,事件處理常式接收 Sheet 實例
sheetClosedsheetapp
beforeDestroysheetsheet當 Sheet 實例即將被銷毀之前,將觸發事件。作為引數,事件處理常式接收 Sheet 實例
sheetBeforeDestroysheetapp
stepOpensheetsheet當 Sheet 滑動步驟開啟/展開時,將觸發事件
sheetStepOpensheetapp
stepClosesheetsheet當 Sheet 滑動步驟關閉/收合時,將觸發事件
sheetStepClosesheetapp
stepProgresssheet,progresssheet當 Sheet 滑動步驟在步驟開啟和關閉狀態之間時,將觸發事件。作為 progress,它接收步驟開啟進度數字(從 01
sheetStepProgresssheet,progressapp
中斷點工作表、中斷點sheet事件將在工作表中斷點變更時觸發。作為第二個參數,它接收當前中斷點(從 01
sheetBreakpoint工作表、中斷點app

CSS 變數

以下是相關 CSS 變數(CSS 自訂屬性)清單。

:root {
  --f7-sheet-height: 260px;
  --f7-sheet-push-offset: var(--f7-safe-area-top);
}
.ios {
  --f7-sheet-border-radius: 0px;
  --f7-sheet-border-color: var(--f7-bars-border-color);
  --f7-sheet-transition-timing-function: initial;
  --f7-sheet-push-border-radius: 10px;
  --f7-sheet-transition-duration: 300ms;
  --f7-sheet-bg-color: #fff;
}
.ios .dark,
.ios.dark {
  --f7-sheet-bg-color: #202020;
}
.md {
  --f7-sheet-border-radius: 16px;
  --f7-sheet-push-border-radius: 16px;
  --f7-sheet-border-color: transparent;
  --f7-sheet-transition-timing-function: cubic-bezier(0, 0.8, 0.34, 1);
  --f7-sheet-transition-duration: 400ms;
}
.md,
.md .dark,
.md [class*='color-'] {
  --f7-sheet-bg-color: var(--f7-md-surface);
}

範例

sheet-modal.html
<template>
  <div class="page">
    <div class="navbar">
      <div class="navbar-bg"></div>
      <div class="navbar-inner sliding">
        <div class="title">Sheet Modal</div>
      </div>
    </div>
    <div class="page-content">
      <div class="block block-strong-ios block-outline-ios">
        <p>Sheet Modals slide up from the bottom (or down from the top) of the screen to reveal more content. Such
          modals allow to create custom overlays with custom content.</p>
        <p class="grid grid-cols-2 grid-gap">
          <a class="button button-fill sheet-open" data-sheet=".demo-sheet">Open Sheet</a>
          <a class="button button-fill" @click=${createSheet}>Dynamic Sheet</a>
        </p>
        <p>
          <a class="button button-fill sheet-open" data-sheet=".demo-sheet-top">Top Sheet</a>
        </p>
      </div>

      <div class="block-title">Push View</div>
      <div class="block block-strong-ios block-outline-ios">
        <p>Sheet can push view behind on open. By default it has effect only when <code>safe-area-inset-top</code> is
          more than
          zero (iOS fullscreen webapp or iOS cordova app)</p>
        <p>
          <a class="button button-fill sheet-open" data-sheet=".demo-sheet-push">Sheet Push</a>
        </p>
      </div>

      <div class="block-title">Swipeable Sheet</div>
      <div class="block block-strong-ios block-outline-ios">
        <p>Sheet modal can be closed with swipe to top (for top Sheet) or bottom (for default Bottom sheet):</p>
        <p>
          <a class="button button-fill sheet-open" data-sheet=".demo-sheet-swipe-to-close">Swipe To Close</a>
        </p>
        <p>Also there is swipe-step that can be set on Sheet modal to expand it with swipe:</p>
        <p>
          <a class="button button-fill sheet-open" data-sheet=".demo-sheet-swipe-to-step">Swipe To Step</a>
        </p>

        <p>In addition to "swipe step" there is a support for position breakpoints (multiple steps):</p>
        <p>
          <a class="button button-fill sheet-open" data-sheet=".demo-sheet-breakpoints">Breakpoints</a>
        </p>
      </div>

    </div>


    <div class="sheet-modal demo-sheet">
      <div class="toolbar">
        <div class="toolbar-inner">
          <div class="left"></div>
          <div class="right">
            <a class="link sheet-close">Close</a>
          </div>
        </div>
      </div>
      <div class="sheet-modal-inner">
        <div class="page-content">
          <div class="block">
            <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quae ducimus dolorum ipsa aliquid accusamus
              perferendis laboriosam delectus numquam minima animi, libero illo in tempora harum sequi corporis alias ex
              adipisci.</p>
            <p>Sunt magni enim saepe quasi aspernatur delectus consectetur fugiat necessitatibus qui sed, similique quis
              facere tempora, laudantium quae expedita ea, aperiam dolores. Aut deserunt soluta alias magnam.
              Consequatur, nisi, enim.</p>
            <p>Eaque maiores ducimus, impedit unde culpa qui, explicabo accusamus, non vero corporis voluptatibus
              similique odit ab. Quaerat quasi consectetur quidem libero? Repudiandae adipisci vel voluptatum, autem
              libero minus dignissimos repellat.</p>
            <p>Iusto, est corrupti! Totam minus voluptas natus esse possimus nobis, delectus veniam expedita sapiente ut
              cum reprehenderit aliquid odio amet praesentium vero temporibus obcaecati beatae aspernatur incidunt,
              perferendis voluptates doloribus?</p>
            <p>Illum id laborum tempore, doloribus culpa labore ex iusto odit. Quibusdam consequuntur totam nam
              obcaecati, enim cumque nobis, accusamus, quos voluptates, voluptatibus sapiente repellendus nesciunt
              praesentium velit ipsa illo iusto.</p>
          </div>
        </div>
      </div>
    </div>
    <div class="sheet-modal sheet-modal-top demo-sheet-top">
      <div class="toolbar toolbar-bottom">
        <div class="toolbar-inner">
          <div class="left"></div>
          <div class="right">
            <a class="link sheet-close">Close</a>
          </div>
        </div>
      </div>
      <div class="sheet-modal-inner">
        <div class="page-content">
          <div class="block">
            <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quae ducimus dolorum ipsa aliquid accusamus
              perferendis laboriosam delectus numquam minima animi, libero illo in tempora harum sequi corporis alias ex
              adipisci.</p>
            <p>Sunt magni enim saepe quasi aspernatur delectus consectetur fugiat necessitatibus qui sed, similique quis
              facere tempora, laudantium quae expedita ea, aperiam dolores. Aut deserunt soluta alias magnam.
              Consequatur, nisi, enim.</p>
            <p>Eaque maiores ducimus, impedit unde culpa qui, explicabo accusamus, non vero corporis voluptatibus
              similique odit ab. Quaerat quasi consectetur quidem libero? Repudiandae adipisci vel voluptatum, autem
              libero minus dignissimos repellat.</p>
            <p>Iusto, est corrupti! Totam minus voluptas natus esse possimus nobis, delectus veniam expedita sapiente ut
              cum reprehenderit aliquid odio amet praesentium vero temporibus obcaecati beatae aspernatur incidunt,
              perferendis voluptates doloribus?</p>
            <p>Illum id laborum tempore, doloribus culpa labore ex iusto odit. Quibusdam consequuntur totam nam
              obcaecati, enim cumque nobis, accusamus, quos voluptates, voluptatibus sapiente repellendus nesciunt
              praesentium velit ipsa illo iusto.</p>
          </div>
        </div>
      </div>
    </div>

    <div class="sheet-modal demo-sheet-push">
      <div class="toolbar">
        <div class="toolbar-inner">
          <div class="left"></div>
          <div class="right">
            <a class="link sheet-close">Close</a>
          </div>
        </div>
      </div>
      <div class="sheet-modal-inner">
        <div class="page-content">
          <div class="block">
            <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Quae ducimus dolorum ipsa aliquid accusamus
              perferendis laboriosam delectus numquam minima animi, libero illo in tempora harum sequi corporis alias ex
              adipisci.</p>
            <p>Sunt magni enim saepe quasi aspernatur delectus consectetur fugiat necessitatibus qui sed, similique quis
              facere tempora, laudantium quae expedita ea, aperiam dolores. Aut deserunt soluta alias magnam.
              Consequatur, nisi, enim.</p>
            <p>Eaque maiores ducimus, impedit unde culpa qui, explicabo accusamus, non vero corporis voluptatibus
              similique odit ab. Quaerat quasi consectetur quidem libero? Repudiandae adipisci vel voluptatum, autem
              libero minus dignissimos repellat.</p>
            <p>Iusto, est corrupti! Totam minus voluptas natus esse possimus nobis, delectus veniam expedita sapiente ut
              cum reprehenderit aliquid odio amet praesentium vero temporibus obcaecati beatae aspernatur incidunt,
              perferendis voluptates doloribus?</p>
            <p>Illum id laborum tempore, doloribus culpa labore ex iusto odit. Quibusdam consequuntur totam nam
              obcaecati, enim cumque nobis, accusamus, quos voluptates, voluptatibus sapiente repellendus nesciunt
              praesentium velit ipsa illo iusto.</p>
          </div>
        </div>
      </div>
    </div>

    <div class="sheet-modal demo-sheet-swipe-to-close" style="height:auto">
      <div class="sheet-modal-inner">
        <div class="swipe-handler"></div>
        <div class="page-content">
          <div class="block-title block-title-large">Hello!</div>
          <div class="block">
            <p>Eaque maiores ducimus, impedit unde culpa qui, explicabo accusamus, non vero corporis voluptatibus
              similique odit ab. Quaerat quasi consectetur quidem libero? Repudiandae adipisci vel voluptatum, autem
              libero minus dignissimos repellat.</p>
            <p>Iusto, est corrupti! Totam minus voluptas natus esse possimus nobis, delectus veniam expedita sapiente ut
              cum reprehenderit aliquid odio amet praesentium vero temporibus obcaecati beatae aspernatur incidunt,
              perferendis voluptates doloribus?</p>
          </div>
        </div>
      </div>
    </div>

    <div class="sheet-modal demo-sheet-swipe-to-step" style="height:auto">
      <div class="sheet-modal-inner">
        <div class="swipe-handler"></div>
        <div class="sheet-modal-swipe-step">
          <div class="display-flex padding justify-content-space-between align-items-center">
            <div style="font-size: 18px"><b>Total:</b></div>
            <div style="font-size: 22px"><b>$500</b></div>
          </div>
          <div class="padding-horizontal padding-bottom">
            <a class="button button-large button-fill">Make Payment</a>
            <div class="margin-top text-align-center">Swipe up for more details</div>
          </div>
        </div>
        <div class="block-title block-title-medium margin-top">Your order:</div>
        <div class="list no-hairlines">
          <ul>
            <li class="item-content">
              <div class="item-inner">
                <div class="item-title">Item 1</div>
                <div class="item-after"><b>$200</b></div>
              </div>
            </li>
            <li class="item-content">
              <div class="item-inner">
                <div class="item-title">Item 2</div>
                <div class="item-after"><b>$180</b></div>
              </div>
            </li>
            <li class="item-content">
              <div class="item-inner">
                <div class="item-title">Delivery</div>
                <div class="item-after"><b>$120</b></div>
              </div>
            </li>
          </ul>
        </div>

      </div>
    </div>

    <div class="sheet-modal demo-sheet-breakpoints" style="height:auto">
      <div class="sheet-modal-inner">
        <div class="swipe-handler" style="background-color: transparent;"></div>
        <div style="display: flex; align-items: center; justify-content: center; height: 20vh;">
          Section 1</div>
        <div style="display: flex; align-items: center; justify-content: center; height: 20vh;">
          Section 2</div>
        <div style="display: flex; align-items: center; justify-content: center; height: 20vh;">
          Section 3</div>

      </div>
    </div>
  </div>
</template>
<script>
  export default (props, { $f7, $on }) => {
    let sheet;
    let sheetPush;
    let sheetSwipeToClose;
    let sheetSwipeToStep;
    let sheetBreakpoints;

    const toggleSwipeStep = () => {
      sheetSwipeToStep.stepToggle();
    }
    const createSheet = () => {
      // Create sheet modal
      if (!sheet) {
        sheet = $f7.sheet.create({
          content: '\
            <div class="sheet-modal">\
              <div class="toolbar">\
                <div class="toolbar-inner justify-content-flex-end">\
                  <a  class="link sheet-close">Close</a>\
                </div>\
              </div>\
              <div class="sheet-modal-inner">\
                <div class="page-content">\
                  <div class="block">\
                    <p>This sheet modal 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>\
          '
        });
      }
      // Close inline sheet
      if ($('.demo-sheet.modal-in').length > 0) $f7.sheet.close('.demo-sheet');
      // Open it
      sheet.open();
    }

    $on('pageInit', () => {
      sheetPush = $f7.sheet.create({
        el: '.demo-sheet-push',
        push: true,
        backdrop: true,
      });
      sheetSwipeToClose = $f7.sheet.create({
        el: '.demo-sheet-swipe-to-close',
        swipeToClose: true,
        push: true,
        backdrop: true,
      });
      sheetSwipeToStep = $f7.sheet.create({
        el: '.demo-sheet-swipe-to-step',
        swipeToClose: true,
        swipeToStep: true,
        push: true,
        backdrop: true,
      });
      sheetBreakpoints = $f7.sheet.create({
        el: '.demo-sheet-breakpoints',
        swipeToClose: true,
        breakpoints: [0.33, 0.66],
        backdrop: true,
        backdropBreakpoint: 0.66,
        push: true,
        pushBreakpoint: 0.66,
      });
    });
    $on('pageBeforeOut', () => {
      // Close opened sheets on page out
      $f7.sheet.close();
    });
    $on('pageBeforeRemove', () => {


      // Destroy sheet modal when page removed
      if (sheet) sheet.destroy();
      if (sheetPush) sheetPush.destroy();
      if (sheetSwipeToClose) sheetSwipeToClose.destroy();
      if (sheetSwipeToStep) sheetSwipeToStep.destroy();
      if (sheetBreakpoints) sheetBreakpoints.destroy();
    });

    return $render;
  };

</script>