操作表
操作表是一个滑动面板,用于向用户呈现如何继续执行给定任务的一组备选方案。
您还可以使用操作表来提示用户确认潜在的危险操作。
操作表包含一个可选标题和一个或多个按钮,每个按钮对应一个要执行的操作。
请注意,不建议在大屏幕(iPad)上使用操作表。在大屏幕上,您应该改用弹出窗口。
操作表应用程序方法
让我们看看与操作表一起使用的相关应用程序方法
app.actions.create(parameters)- 创建操作表实例
- parameters - object。包含操作表参数的对象
方法返回创建的操作表实例
app.actions.destroy(el)- 销毁操作表实例
- el - HTMLElement 或 string(使用 CSS 选择器)或 object。要销毁的操作元素实例。
app.actions.get(el)- 通过 HTML 元素获取操作表实例
- el - HTMLElement 或 string(使用 CSS 选择器)。操作表元素。
方法返回操作表实例
app.actions.open(el, animate)- 打开操作表
- el - HTMLElement 或 string(使用 CSS 选择器)。要打开的操作表元素。
- animate - boolean。使用动画打开操作表。
方法返回操作表实例
app.actions.close(el, animate)- 关闭操作表
- el - HTMLElement 或 string(使用 CSS 选择器)。要关闭的操作表元素。
- animate - boolean。使用动画关闭操作表。
方法返回操作表实例
操作表参数
现在让我们看一下创建操作表所需的参数列表
参数 | 类型 | 默认值 | 描述 |
---|---|---|---|
el | HTMLElement string | 操作表元素。如果您已经在 HTML 中拥有操作表元素并希望使用此元素创建新实例,则此参数很有用 | |
content | string | 完整的操作表 HTML 内容字符串。如果您想使用自定义 HTML 创建操作表元素,则此参数很有用 | |
backdrop | boolean | true | 启用操作表背景(后面的深色半透明层) |
backdropEl | HTMLElement string | 自定义背景元素的 HTML 元素或字符串 CSS 选择器 | |
backdropUnique | boolean | false | 如果启用,它将专门为此模态创建唯一的背景元素 |
closeByBackdropClick | boolean | true | 启用后,单击背景将关闭操作表 |
closeByOutsideClick | boolean | false | 启用后,点击操作表外部将关闭操作表 |
closeOnEscape | boolean | false | 启用后,按下 ESC 键将关闭操作表 |
animate | boolean | true | 操作表是否应使用动画打开/关闭。可以在 .open() 和 .close() 方法中覆盖 |
buttons | 数组 | 操作表组/按钮。在这种情况下,操作布局将根据传递的组和按钮动态生成。对于组,它应该是一个数组,其中每个项目代表该组按钮的数组。 | |
grid | boolean | false | 启用网格按钮布局 |
convertToPopover | boolean | true | 启用后,操作表将在大型屏幕上转换为弹出框。 |
forceToPopover | boolean | false | 启用后,操作表将始终转换为弹出框。 |
targetEl | HTMLElement string | 目标元素的 HTML 元素或字符串 CSS 选择器。在使用转换为弹出框时需要 | |
targetX | 数字 | 虚拟目标元素距离屏幕左侧的水平偏移量。在不使用真实目标元素 (targetEl ) 的情况下使用转换为弹出框时需要 | |
targetY | 数字 | 虚拟目标元素距离屏幕顶部的垂直偏移量。在不使用真实目标元素 (targetEl ) 的情况下使用转换为弹出框时需要 | |
targetWidth | 数字 | 0 | 虚拟目标元素宽度(以像素为单位)。在不使用真实目标元素 (targetEl ) 的情况下使用转换为弹出框时需要 |
targetHeight | 数字 | 0 | 虚拟目标元素高度(以像素为单位)。在不使用真实目标元素 (targetEl ) 的情况下使用转换为弹出框时需要 |
cssClass | string | 要设置在操作表元素上的附加 CSS 类名 | |
onClick | function(actions, e) | 单击操作表按钮后将执行的回调函数 | |
render | 函数 | 用于呈现操作表的自定义函数。必须返回操作表 html | |
renderPopover | 函数 | 在使用转换为弹出框时,用于呈现弹出框的自定义函数。必须返回弹出框 html | |
containerEl | HTMLElement string | 要将模态框挂载到的元素(默认为应用程序根元素) | |
on | 对象 | 包含事件处理程序的对象。例如
|
请注意,以下所有参数都可以在 actions
属性下的全局应用程序参数中使用,以便为所有操作表设置默认值。例如
var app = new Framework7({
actions: {
convertToPopover: false,
grid: true,
}
});
按钮参数
buttons
数组中的每个按钮都必须表示为一个包含按钮参数的对象
参数 | 类型 | 默认值 | 描述 |
---|---|---|---|
text | string | 包含按钮文本的字符串(可以是 HTML 字符串) | |
icon | string | 图标的 HTML 字符串 | |
strong | boolean | false | 启用粗体按钮文本 |
color | string | 按钮颜色,默认颜色之一 | |
bg | string | 按钮背景颜色,默认颜色之一 | |
label | boolean | false | 如果启用,它将呈现为标签而不是按钮 |
禁用 | boolean | false | 定义按钮是否被禁用。 |
关闭 | boolean | true | 如果启用,则单击按钮将关闭操作表 |
onClick | function(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) | 打开操作表。 其中
|
actions.close(animate) | 关闭操作表。 其中
|
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` 前缀。
事件 | 参数 | 目标 | 描述 |
---|---|---|---|
open | actions | actions | 动作菜单开始打开动画时将触发此事件。作为参数,事件处理程序会收到动作菜单实例 |
actionsOpen | actions | app | |
opened | actions | actions | 动作菜单完成打开动画后将触发此事件。作为参数,事件处理程序会收到动作菜单实例 |
actionsOpened | actions | app | |
关闭 | actions | actions | 动作菜单开始关闭动画时将触发此事件。作为参数,事件处理程序会收到动作菜单实例 |
actionsClose | actions | app | |
closed | actions | actions | 动作菜单完成关闭动画后将触发此事件。作为参数,事件处理程序会收到动作菜单实例 |
actionsClosed | actions | app | |
beforeDestroy | actions | actions | 动作菜单实例即将销毁之前将触发此事件。作为参数,事件处理程序会收到动作菜单实例 |
actionsBeforeDestroy | actions | 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);
}
示例
<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>