Action Sheet

操作表单是一个向上滑动的面板,用于向用户展示一组关于如何继续执行给定任务的选项。

您也可以使用操作表单来提示用户确认一个潜在的危险操作。

操作表单包含一个可选的标题和一个或多个按钮,每个按钮都对应一个要执行的操作。

注意,不建议在大屏幕(iPad)上使用操作表单。在大屏幕上,您应该使用弹出框代替。

Action Sheet 应用方法

让我们看看与操作表单相关的应用方法:

app.actions.create(参数)- 创建操作表单实例

  • 参数 - 对象. 带有操作表单参数的对象

方法返回创建的操作表单的实例

app.actions.destroy(el)- 销毁操作表单实例

  • el - HTMLElement字符串(使用 CSS 选择器) 或对象. 要销毁的操作元素实例。

app.actions.get(el)- 通过 HTML 元素获取操作表单实例(带 CSS 选择器)。操作表单元素。

  • el - HTMLElement字符串 (with CSS Selector). Action Sheet element.

方法返回操作表单的实例

app.actions.open(el, animate)- 打开操作表单

  • el - HTMLElement字符串(带 CSS 选择器)。要打开的操作表单元素。
  • animate - 布尔值. 带动画打开操作表单。

方法返回操作表单的实例

app.actions.close(el, animate)- 关闭操作表单

  • el - HTMLElement字符串(带 CSS 选择器)。要关闭的操作表单元素。
  • animate - 布尔值. 带动画关闭操作表单。

方法返回操作表单的实例

Action Sheet 参数

现在让我们看看创建操作表单所需的一系列可用参数:

参数类型默认描述
elHTMLElement
字符串
操作表单元素。如果您已经在 HTML 中有操作表单元素,并希望使用此元素创建新实例,则很有用
内容字符串完整的操作表单 HTML 内容字符串。如果您想使用自定义 HTML 创建操作表单元素,则很有用
背景遮罩布尔值true启用操作表单背景(背后的深色半透明层)
backdropElHTMLElement
字符串
自定义背景元素的HTML元素或字符串CSS选择器
backdropUnique布尔值false如果启用,它将为该模态创建唯一的背景元素
closeByBackdropClick布尔值true启用后,点击背景将关闭操作表单
closeByOutsideClick布尔值false启用后,点击操作表单外部将关闭操作表单
closeOnEscape布尔值false当启用时,操作表将在按 ESC 键盘键时关闭
animate布尔值true操作表单是否应带动画打开/关闭。可以在.open().close()方法中覆盖。
按钮数组操作表单组/按钮。在这种情况下,操作布局将根据传递的组和按钮动态生成。在组的情况下它应该是一个数组,其中每个项目代表一个带有按钮的组数组。
网格布尔值false启用网格按钮布局
convertToPopover布尔值true启用后,操作表单将转换为弹出框在大屏幕上。
forceToPopover布尔值false启用后,操作表单将始终转换为弹出框.
targetElHTMLElement
字符串
目标元素的 HTML 元素或字符串 CSS 选择器。在转换为 Popover 时需要
targetX数字虚拟目标元素从屏幕左侧的水平偏移。在使用转换为弹出窗口时无需使用实际目标元素时需要targetEl)
targetY数字虚拟目标元素从屏幕顶部的垂直偏移。在使用转换为弹出窗口时无需使用实际目标元素时需要targetEl)
targetWidth数字0虚拟目标元素宽度(以像素为单位)。在使用转换为弹出窗口时无需使用实际目标元素时需要targetEl)
targetHeight数字0虚拟目标元素高度(以像素为单位)。在使用转换为弹出窗口时无需使用实际目标元素时需要targetEl)
cssClass字符串要设置在操作表单元素上的附加 CSS 类名
onClickfunction(actions, e)点击操作表单按钮后执行的回调函数
render函数自定义函数来渲染操作表单。必须返回操作表单的 HTML
renderPopover函数自定义函数来渲染弹出窗口。当转换为弹出窗口时使用。必须返回弹出窗口的 HTML
containerElHTMLElement
字符串
模态挂载到的元素(默认为应用根元素)
on对象

带有事件处理程序的对象。例如:

var actions = app.actions.create({
  buttons: [ /* ... */ ],
  on: {
    opened: function () {
      console.log('Action Sheet opened')
    }
  }
})

注意,以下所有参数都可以在actions属性下的全局应用参数中用作默认值,以设置所有操作表单的默认值。例如:

var app = new Framework7({
  actions: {
    convertToPopover: false,
    grid: true,
  }
});

按钮参数

数组中的每个按钮必须表示为带有按钮参数的对象:buttons array must be presented as an object with button parameters:

参数类型默认描述
text字符串按钮文本的字符串(可以是 HTML 字符串)
icon字符串图标的 HTML 字符串
strong布尔值false启用粗体按钮文本
color字符串按钮颜色,默认颜色之一
bg字符串按钮背景颜色,默认颜色之一
label布尔值false启用后,则将其渲染为标签而不是按钮
禁用布尔值false定义按钮是否禁用。
close布尔值true启用后,点击按钮将关闭操作表单
onClickfunction(actions, e)点击此按钮后执行的回调函数

Action Sheet 方法与属性

因此,要创建操作表单,我们必须调用:

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

之后我们就有其初始化的实例(如actions示例中上面的变量)以及有用的方法和属性:

属性
actions.app链接到全局应用实例
actions.el操作表单 HTML 元素
actions.$el带有操作表单 HTML 元素的 Dom7 实例
actions.backdropEl背景层 HTML 元素
actions.$backdropEl包含背景层 HTML 元素的 Dom7 实例
actions.params操作表单实例参数
actions.opened指示操作表单是否打开的布尔属性
方法
actions.open(animate)打开操作表单。其中
  • animate - 布尔值(默认true) - 定义是否应使用动画打开
actions.close(animate)关闭操作表单。其中
  • animate - 布尔值(默认true) - 定义是否应使用动画关闭
actions.destroy()销毁操作表单
actions.on(事件上触发, 处理程序)添加事件处理程序
actions.once(事件上触发, 处理程序)添加在触发后将被移除的事件处理程序
actions.off(事件上触发, 处理程序)移除事件处理程序
actions.off(事件上触发)移除指定事件的所有处理程序
actions.emit(事件上触发, ...args)在实例上触发事件

可以使用特殊类和数据属性在链接上打开和关闭所需的操作表单(如果您在 DOM 中有它们):

  • 要打开操作表单,我们需要添加 "actions-open" 类

  • 要关闭操作表单,我们需要添加 "actions-close" 类

  • 如果您在 DOM 中有多个操作表单,则需要通过附加data-actions=".my-actions"属性在这个 HTML 元素上指定适当的 Sheet

根据上述说明:

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

<!-- And somewhere in DOM -->
<div class="actions-modal my-actions">
  ...
</div>

Action Sheet 事件

操作表单将在操作表单元素和应用的以及操作表单实例上触发以下 DOM 事件:

DOM 事件

事件Target描述
actions:open操作表单元素<div class="actions-modal">当 Action Sheet 开始打开动画时将触发事件
actions:opened操作表单元素<div class="actions-modal">当 Action Sheet 完成打开动画后触发事件
actions:close操作表单元素<div class="actions-modal">当 Action Sheet 开始关闭动画时触发事件
actions:closed操作表单元素<div class="actions-modal">当 Action Sheet 完成关闭动画后触发事件

应用和 Action Sheet 实例事件

操作表单实例在自身实例和应用实例上发出事件。应用实例事件具有相同名称,前缀为actions.

事件参数Target描述
open为前缀动作动作当 Action Sheet 开始其打开动画时将触发事件。作为参数事件处理程序接收 Action Sheet 实例。
actionsOpen动作app
opened动作动作当 Action Sheet 完成其打开动画后将触发事件。作为参数事件处理程序接收 Action Sheet 实例。
actionsOpened动作app
close动作动作当 Action Sheet 开始其关闭动画时将触发事件。作为参数事件处理程序接收 Action Sheet 实例。
actionsClose动作app
closed动作动作当 Action Sheet 完成其关闭动画后将触发事件。作为参数事件处理程序接收 Action Sheet 实例。
actionsClosed动作app
beforeDestroy动作动作在 Action Sheet 实例将被销毁之前将触发事件。作为参数事件处理程序接收 Action Sheet 实例。
actionsBeforeDestroy动作app

CSS 变量

以下是相关CSS 变量(CSS 自定义属性) 的列表。

注意,注释掉的变量默认未指定,其值在这种情况下是它们回退到的值。

:root {
  --f7-actions-grid-button-font-size: 12px;
  --f7-actions-grid-button-icon-size: 48px;
}
.ios {
  --f7-actions-transition-timing-function: initial;
  --f7-actions-border-radius: 13px;
  /*
  --f7-actions-button-text-color: var(--f7-theme-color);
  */
  --f7-actions-grid-button-text-color: #757575;
  --f7-actions-button-padding: 0px;
  --f7-actions-button-text-align: center;
  --f7-actions-button-height: 57px;
  --f7-actions-button-height-landscape: 44px;
  --f7-actions-button-font-size: 20px;
  --f7-actions-button-icon-size: 28px;
  --f7-actions-button-justify-content: center;
  --f7-actions-label-padding: 8px 10px;
  --f7-actions-label-font-weight: 400;
  --f7-actions-label-font-size: 13px;
  --f7-actions-label-justify-content: center;
  --f7-actions-group-border-color: transparent;
  --f7-actions-group-margin: 8px;
  --f7-actions-bg-color: rgba(255, 255, 255, 0.95);
  --f7-actions-bg-color-rgb: 255, 255, 255;
  --f7-actions-button-border-color: rgba(0, 0, 0, 0.2);
  --f7-actions-button-pressed-bg-color: rgba(230, 230, 230, 0.9);
  --f7-actions-button-pressed-bg-color-rgb: 230, 230, 230;
  --f7-actions-label-text-color: #8a8a8a;
}
.ios .dark,
.ios.dark {
  --f7-actions-bg-color: rgba(45, 45, 45, 0.95);
  --f7-actions-bg-color-rgb: 45, 45, 45;
  --f7-actions-button-border-color: rgba(255, 255, 255, 0.15);
  --f7-actions-button-pressed-bg-color: rgba(50, 50, 50, 0.9);
  --f7-actions-button-pressed-bg-color-rgb: 50, 50, 50;
  --f7-actions-label-text-color: rgba(255, 255, 255, 0.55);
}
.md {
  --f7-actions-transition-timing-function: cubic-bezier(0, 0.8, 0.34, 1);
  --f7-actions-border-radius: 16px;
  --f7-actions-button-border-color: transparent;
  --f7-actions-button-padding: 0 16px;
  --f7-actions-button-text-align: left;
  --f7-actions-button-height: 48px;
  --f7-actions-button-height-landscape: 48px;
  --f7-actions-button-font-size: 16px;
  --f7-actions-button-icon-size: 24px;
  --f7-actions-button-justify-content: space-between;
  --f7-actions-label-padding: 12px 16px;
  --f7-actions-label-font-size: 14px;
  --f7-actions-label-font-weight: 500;
  --f7-actions-label-justify-content: flex-start;
  --f7-actions-group-margin: 0px;
  --f7-actions-button-pressed-bg-color: #e5e5e5;
}
.md .dark,
.md.dark {
  --f7-actions-button-pressed-bg-color: #2e2e2e;
}
.md,
.md .dark,
.md [class*='color-'] {
  --f7-actions-button-text-color: var(--f7-md-on-surface);
  --f7-actions-bg-color: var(--f7-md-surface-3);
  --f7-actions-group-border-color: var(--f7-md-outline);
  --f7-actions-label-text-color: var(--f7-theme-color);
  --f7-actions-grid-button-text-color: var(--f7-md-on-surface);
}

示例

action-sheet.html
<template>
  <div class="page">
    <div class="navbar">
      <div class="navbar-bg"></div>
      <div class="navbar-inner sliding">
        <div class="title">Action Sheet</div>
      </div>
    </div>
    <div class="page-content">
      <div class="block block-strong inset">
        <p class="grid grid-cols-2 grid-gap">
          <a class="button button-fill" @click=${openDemo1}>One group</a>
          <a class="button button-fill" @click=${openDemo2}>Two groups</a>
        </p>
        <p>
          <a class="button button-fill" @click=${openGrid}>Action Grid</a>
        </p>
      </div>
      <div class="block-title">Action Sheet To Popover</div>
      <div class="block block-strong inset">
        <p>Action Sheet can be automatically converted to Popover (for tablets). This button will open Popover on
          tablets and Action Sheet on phones: <a style="display:inline-block"
            class="button button-to-popover button-small" @click=${openActionsPopover}>Actions</a></p>
      </div>
    </div>
  </div>
</template>
<script>
  export default (props, { $on, $f7, $el }) => {
    let actions1;
    let actions2;
    let actionsGrid;
    let actionsToPopover;

    const openDemo1 = () => {
      actions1.open();
    }
    const openDemo2 = () => {
      actions2.open();
    }
    const openGrid = () => {
      actionsGrid.open();
    }
    const openActionsPopover = () => {
      actionsToPopover.open();
    }

    $on('pageInit', () => {
      // 1 Group
      const buttons1 = [
        {
          text: 'Do something',
          label: true
        },
        {
          text: 'Button 1',
          strong: true
        },
        {
          text: 'Button 2',
        },
        {
          text: 'Cancel',
          color: 'red'
        },
      ];

      // 2 Groups
      const buttons2 = [
        // First Group
        [
          {
            text: 'Do something',
            label: true
          },
          {
            text: 'Button 1',
            strong: true
          },
          {
            text: 'Button 2',
          }
        ],
        // Second Group
        [
          {
            text: 'Cancel',
            color: 'red'
          }
        ]
      ]

      // Grid buttons with icons/images
      const gridButtons = [
        [
          {
            text: 'Button 1',
            icon: '<img src="https://cdn.framework7.io/placeholder/people-96x96-1.jpg" width="48" style="max-width: 100%; border-radius: 8px"/>'
          },
          {
            text: 'Button 2',
            icon: '<img src="https://cdn.framework7.io/placeholder/people-96x96-2.jpg" width="48" style="max-width: 100%; border-radius: 8px">'
          },
          {
            text: 'Button 3',
            icon: '<img src="https://cdn.framework7.io/placeholder/people-96x96-3.jpg" width="48" style="max-width: 100%; border-radius: 8px">'
          },
        ],
        [
          {
            text: 'Button 1',
            icon: '<img src="https://cdn.framework7.io/placeholder/fashion-96x96-4.jpg" width="48" style="max-width: 100%; border-radius: 8px"/>'
          },
          {
            text: 'Button 2',
            icon: '<img src="https://cdn.framework7.io/placeholder/fashion-96x96-5.jpg" width="48" style="max-width: 100%; border-radius: 8px">'
          },
          {
            text: 'Button 3',
            icon: '<img src="https://cdn.framework7.io/placeholder/fashion-96x96-6.jpg" width="48" style="max-width: 100%; border-radius: 8px">'
          },
        ],
      ]

      actions1 = $f7.actions.create({ buttons: buttons1 });
      actions2 = $f7.actions.create({ buttons: buttons2 });
      actionsGrid = $f7.actions.create({ buttons: gridButtons, grid: true });

      // Actions To Popover
      actionsToPopover = $f7.actions.create({
        buttons: buttons1,
        // Need to specify popover target
        targetEl: $el.value.find('.button-to-popover')
      });
    })

    $on('pageBeforeRemove', () => {
      actions1.destroy();
      actions2.destroy();
      actionsGrid.destroy();
      actionsToPopover.destroy();
    })

    return $render;
  }

</script>