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 参数
现在让我们看看创建操作表单所需的一系列可用参数:
参数 | 类型 | 默认 | 描述 |
---|---|---|---|
el | HTMLElement 字符串 | 操作表单元素。如果您已经在 HTML 中有操作表单元素,并希望使用此元素创建新实例,则很有用 | |
内容 | 字符串 | 完整的操作表单 HTML 内容字符串。如果您想使用自定义 HTML 创建操作表单元素,则很有用 | |
背景遮罩 | 布尔值 | true | 启用操作表单背景(背后的深色半透明层) |
backdropEl | HTMLElement 字符串 | 自定义背景元素的HTML元素或字符串CSS选择器 | |
backdropUnique | 布尔值 | false | 如果启用,它将为该模态创建唯一的背景元素 |
closeByBackdropClick | 布尔值 | true | 启用后,点击背景将关闭操作表单 |
closeByOutsideClick | 布尔值 | false | 启用后,点击操作表单外部将关闭操作表单 |
closeOnEscape | 布尔值 | false | 当启用时,操作表将在按 ESC 键盘键时关闭 |
animate | 布尔值 | true | 操作表单是否应带动画打开/关闭。可以在.open() 和.close() 方法中覆盖。 |
按钮 | 数组 | 操作表单组/按钮。在这种情况下,操作布局将根据传递的组和按钮动态生成。在组的情况下它应该是一个数组,其中每个项目代表一个带有按钮的组数组。 | |
网格 | 布尔值 | false | 启用网格按钮布局 |
convertToPopover | 布尔值 | true | 启用后,操作表单将转换为弹出框在大屏幕上。 |
forceToPopover | 布尔值 | false | 启用后,操作表单将始终转换为弹出框. |
targetEl | HTMLElement 字符串 | 目标元素的 HTML 元素或字符串 CSS 选择器。在转换为 Popover 时需要 | |
targetX | 数字 | 虚拟目标元素从屏幕左侧的水平偏移。在使用转换为弹出窗口时无需使用实际目标元素时需要targetEl ) | |
targetY | 数字 | 虚拟目标元素从屏幕顶部的垂直偏移。在使用转换为弹出窗口时无需使用实际目标元素时需要targetEl ) | |
targetWidth | 数字 | 0 | 虚拟目标元素宽度(以像素为单位)。在使用转换为弹出窗口时无需使用实际目标元素时需要targetEl ) |
targetHeight | 数字 | 0 | 虚拟目标元素高度(以像素为单位)。在使用转换为弹出窗口时无需使用实际目标元素时需要targetEl ) |
cssClass | 字符串 | 要设置在操作表单元素上的附加 CSS 类名 | |
onClick | function(actions, e) | 点击操作表单按钮后执行的回调函数 | |
render | 函数 | 自定义函数来渲染操作表单。必须返回操作表单的 HTML | |
renderPopover | 函数 | 自定义函数来渲染弹出窗口。当转换为弹出窗口时使用。必须返回弹出窗口的 HTML | |
containerEl | HTMLElement 字符串 | 模态挂载到的元素(默认为应用根元素) | |
on | 对象 | 带有事件处理程序的对象。例如:
|
注意,以下所有参数都可以在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 | 启用后,点击按钮将关闭操作表单 |
onClick | function(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) | 打开操作表单。其中
|
actions.close(animate) | 关闭操作表单。其中
|
actions.destroy() | 销毁操作表单 |
actions.on(事件上触发, 处理程序) | 添加事件处理程序 |
actions.once(事件上触发, 处理程序) | 添加在触发后将被移除的事件处理程序 |
actions.off(事件上触发, 处理程序) | 移除事件处理程序 |
actions.off(事件上触发) | 移除指定事件的所有处理程序 |
actions.emit(事件上触发, ...args) | 在实例上触发事件 |
通过链接控制 Action Sheet
可以使用特殊类和数据属性在链接上打开和关闭所需的操作表单(如果您在 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);
}
示例
<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>