操作表

操作表是一个滑动面板,用于向用户呈现如何继续执行给定任务的一组备选方案。

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

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

请注意,不建议在大屏幕(iPad)上使用操作表。在大屏幕上,您应该改用弹出窗口

操作表应用程序方法

让我们看看与操作表一起使用的相关应用程序方法

app.actions.create(parameters)- 创建操作表实例

  • parameters - object。包含操作表参数的对象

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

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

  • el - HTMLElementstring(使用 CSS 选择器)或 object。要销毁的操作元素实例。

app.actions.get(el)- 通过 HTML 元素获取操作表实例

  • el - HTMLElementstring(使用 CSS 选择器)。操作表元素。

方法返回操作表实例

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

  • el - HTMLElementstring(使用 CSS 选择器)。要打开的操作表元素。
  • animate - boolean。使用动画打开操作表。

方法返回操作表实例

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

  • el - HTMLElementstring(使用 CSS 选择器)。要关闭的操作表元素。
  • animate - boolean。使用动画关闭操作表。

方法返回操作表实例

操作表参数

现在让我们看一下创建操作表所需的参数列表

参数类型默认值描述
elHTMLElement
string
操作表元素。如果您已经在 HTML 中拥有操作表元素并希望使用此元素创建新实例,则此参数很有用
contentstring完整的操作表 HTML 内容字符串。如果您想使用自定义 HTML 创建操作表元素,则此参数很有用
backdropbooleantrue启用操作表背景(后面的深色半透明层)
backdropElHTMLElement
string
自定义背景元素的 HTML 元素或字符串 CSS 选择器
backdropUniquebooleanfalse如果启用,它将专门为此模态创建唯一的背景元素
closeByBackdropClickbooleantrue启用后,单击背景将关闭操作表
closeByOutsideClickbooleanfalse启用后,点击操作表外部将关闭操作表
closeOnEscapebooleanfalse启用后,按下 ESC 键将关闭操作表
animatebooleantrue操作表是否应使用动画打开/关闭。可以在 .open().close() 方法中覆盖
buttons数组操作表组/按钮。在这种情况下,操作布局将根据传递的组和按钮动态生成。对于,它应该是一个数组,其中每个项目代表该组按钮的数组。
gridbooleanfalse启用网格按钮布局
convertToPopoverbooleantrue启用后,操作表将在大型屏幕上转换为弹出框
forceToPopoverbooleanfalse启用后,操作表将始终转换为弹出框
targetElHTMLElement
string
目标元素的 HTML 元素或字符串 CSS 选择器。在使用转换为弹出框时需要
targetX数字虚拟目标元素距离屏幕左侧的水平偏移量。在不使用真实目标元素 (targetEl) 的情况下使用转换为弹出框时需要
targetY数字虚拟目标元素距离屏幕顶部的垂直偏移量。在不使用真实目标元素 (targetEl) 的情况下使用转换为弹出框时需要
targetWidth数字0虚拟目标元素宽度(以像素为单位)。在不使用真实目标元素 (targetEl) 的情况下使用转换为弹出框时需要
targetHeight数字0虚拟目标元素高度(以像素为单位)。在不使用真实目标元素 (targetEl) 的情况下使用转换为弹出框时需要
cssClassstring要设置在操作表元素上的附加 CSS 类名
onClickfunction(actions, e)单击操作表按钮后将执行的回调函数
render函数用于呈现操作表的自定义函数。必须返回操作表 html
renderPopover函数在使用转换为弹出框时,用于呈现弹出框的自定义函数。必须返回弹出框 html
containerElHTMLElement
string
要将模态框挂载到的元素(默认为应用程序根元素)
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 数组中的每个按钮都必须表示为一个包含按钮参数的对象

参数类型默认值描述
textstring包含按钮文本的字符串(可以是 HTML 字符串)
iconstring图标的 HTML 字符串
strongbooleanfalse启用粗体按钮文本
colorstring按钮颜色,默认颜色之一
bgstring按钮背景颜色,默认颜色之一
labelbooleanfalse如果启用,它将呈现为标签而不是按钮
禁用booleanfalse定义按钮是否被禁用。
关闭booleantrue如果启用,则单击按钮将关闭操作表
onClickfunction(actions, e)单击此按钮后将执行的回调函数

操作表方法和属性

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

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(event, handler)添加事件处理程序
actions.once(event, handler)添加在触发后将被删除的事件处理程序
actions.off(event, handler)删除事件处理程序
actions.off(event)删除指定事件的所有处理程序
actions.emit(event, ...args)在实例上触发事件

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

  • 要打开操作表,我们需要向任何 HTML 元素(最好是链接)添加 “actions-open” 类

  • 要关闭操作表,我们需要向任何 HTML 元素(最好是链接)添加 “actions-close” 类

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

根据以上说明

<!-- 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>

操作表事件

操作表将在操作表元素上触发以下 DOM 事件,并在应用程序和操作表实例上触发事件

DOM 事件

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

应用程序和动作菜单实例事件

动作菜单实例在自身实例和应用程序实例上都会触发事件。应用程序实例事件的名称相同,但会加上 `actions` 前缀。

事件参数目标描述
openactionsactions动作菜单开始打开动画时将触发此事件。作为参数,事件处理程序会收到动作菜单实例
actionsOpenactionsapp
openedactionsactions动作菜单完成打开动画后将触发此事件。作为参数,事件处理程序会收到动作菜单实例
actionsOpenedactionsapp
关闭actionsactions动作菜单开始关闭动画时将触发此事件。作为参数,事件处理程序会收到动作菜单实例
actionsCloseactionsapp
closedactionsactions动作菜单完成关闭动画后将触发此事件。作为参数,事件处理程序会收到动作菜单实例
actionsClosedactionsapp
beforeDestroyactionsactions动作菜单实例即将销毁之前将触发此事件。作为参数,事件处理程序会收到动作菜单实例
actionsBeforeDestroyactionsapp

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>