选择器
选择器是一个强大的组件,它允许您创建自定义覆盖选择器,看起来像iOS原生选择器。
选择器可以用作内联组件或覆盖。覆盖选择器在平板电脑(iPad)上会自动转换为弹出框。
Picker应用方法
让我们看看与选择器相关的工作方法:
app.picker.create(参数)- 创建选择器实例
- 参数 - 对象. 带有选择器参数的对象
方法返回创建的选择器的实例
app.picker.destroy(el)- 销毁选择器实例
- el - HTMLElement或字符串(使用 CSS 选择器) 或对象. 要销毁的选择器元素或选择器实例。
app.picker.get(el)- 通过HTML元素获取选择器实例
- el - HTMLElement或字符串(使用CSS选择器)。选择器元素。
方法返回选择器的实例
app.picker.close(el)- 关闭选择器
- el - HTMLElement或字符串(使用CSS选择器)。要关闭的选择器元素。
方法返回选择器的实例
例如:
var picker = app.picker.create({
inputEl: '#picker-input',
cols: [
{
values: ['apple', 'orange', 'banana'],
displayValues: ['Apple', 'Orange', 'Banana'],
}
]
});
Picker参数
让我们看看所有可用选择器参数的列表:
参数 | 类型 | 默认 | 描述 |
---|---|---|---|
rotateEffect | 布尔值 | false | 启用3D旋转效果 |
freeMode | 布尔值 | false | 禁用值上的快照 |
值 | 数组 | 初始值的数组。每个数组项表示相关列的值 | |
formatValue | function (values, displayValues) | 用于格式化输入值的函数,应返回新的/格式化的字符串值。values和displayValues是数组,其中每个项表示相关列的值/显示值 | |
cols | 数组 | 列的数组。每个数组项表示具有列参数的对象 | |
容器/打开器特定参数 | |||
containerEl | 字符串 HTMLElement | CSS选择器字符串或HTMLElement,用于放置生成的选择器HTML。仅用于内联选择器 | |
openIn | 字符串 | 自动 | 可以是auto , popover (在弹出框中打开选择器),sheet (在表单模态中打开)。如果auto 的情况下,在小屏幕上将在表单模态中打开,在大屏幕上将在弹出层中打开。 |
背景遮罩 | 布尔值 | 启用选择器容器的背景(弹出框或表单)(背后的深色半透明层)。默认情况下,它使用基于它是如何打开的默认值(在表单或弹出框中)。 | |
sheetPush | 布尔值 | false | 启用选择器表单在打开时推后视图/后面 |
sheetSwipeToClose | 布尔值 | false | 启用通过滑动手势关闭选择器表单的能力 |
inputEl | 字符串或 HTMLElement | 包含相关输入元素的 CSS 选择器或 HTMLElement。 | |
scrollToInput | 布尔值 | true | 滚动视口(page-content)到输入时选择器打开 |
inputReadOnly | 布尔值 | true | 在指定输入上设置“readonly”属性 |
cssClass | 字符串 | 要设置在选择器元素上的附加CSS类名 | |
closeByOutsideClick | 布尔值 | true | 启用后,点击颜色选择器或相关输入元素外部将关闭选择器 |
toolbar | 布尔值 | true | 启用选择器工具栏 |
toolbarCloseText | 字符串 | 完成 | 完成/关闭工具栏按钮的文本 |
routableModals | 布尔值 | false | 将打开的选择器添加到路由历史记录,这提供了通过在路由历史记录中后退来关闭选择器并设置当前路由到选择器模态的能力 |
url | 字符串 | select/ | 选择器模态URL,它将设置为当前路由 |
view | 对象 | 当routableModals 启用时,要设置路由的位置。默认情况下为inputEl 的父视图,如果找不到父视图,则为主视图 | |
渲染函数 | |||
renderToolbar | 函数 | 用于渲染工具栏的函数。必须返回工具栏的HTML字符串 | |
render | 函数 | 渲染整个选择器的函数。必须返回选择器完整的HTML字符串 | |
事件 | |||
on | 对象 | 带有事件处理程序的对象。例如:
|
注意,所有以下参数都可以在picker
用于为所有选择器设置默认值的属性。例如:
var app = new Framework7({
picker: {
rotateEffect: true,
openIn: 'popover',
}
});
列参数
当我们配置选择器时,我们需要传递cols
参数。它是一个数组,其中每个项都是一个具有列参数的对象:
参数 | 类型 | 默认 | 描述 |
---|---|---|---|
values | 数组 | 字符串列值的数组 | |
displayValues | 数组 | 将在选择器中显示的字符串列值的数组。如果未指定,它将显示来自valuesparameter | |
cssClass | 字符串 | 附加要设置在列HTML容器上的CSS类名 | |
textAlign | 字符串 | 列值的文本对齐方式,可以是"left"、"center"或"right" | |
宽度 | 数字 | 列宽度(以像素为单位)。如果您需要在具有依赖列的选择器中固定列宽度,则很有用。默认情况下,自动计算 | |
divider | 布尔值 | false | 定义应用作视觉分隔符的列,该列没有任何值 |
内容 | 字符串 | 应为分隔列(divider:true )指定列内容 | |
onChange | function(picker, value, displayValue) | 当选择器值更改时将执行的回调函数。 |
Picker方法和属性
初始化选择器后,我们在变量中(例如picker
示例中使用的变量)中拥有颜色选择器的初始化实例,其中包含有用的方法和属性:
属性 | |
---|---|
picker.app | 链接到全局应用实例 |
picker.containerEl | 选择器包装容器HTML元素(当内联选择器使用时) |
picker.$containerEl | 包含选择器包装容器HTML元素的Dom7实例(当内联选择器使用时) |
picker.el | 选择器HTML元素 |
picker.$el | 包含选择器HTML元素的Dom7实例 |
picker.inputEl | 选择器输入HTML元素(传递在inputEl 参数中) |
picker.$inputEl | 包含选择器输入HTML元素的Dom7实例(传递在inputEl 参数中) |
picker.value | 每个项表示每列当前选定值的数组 |
picker.cols | 指定选择器列的数组。每列也有自己的方法和属性(如下所述) |
picker.opened | true 如果选择器当前打开 |
picker.inline | true 当使用内联选择器时 |
picker.url | 选择器URL(传递在url 参数中) |
picker.view | 选择器视图(传递在view 参数中)或找到的父视图 |
picker.params | 包含初始化参数的对象 |
方法 | |
picker.setValue(values) | 设置新的选择器值。values 是一个数组,其中每个项表示每列的值。 |
picker.getValue() | 返回当前选择器值 |
picker.open() | 打开选择器 |
picker.close() | 关闭选择器 |
picker.destroy() | 销毁选择器实例并删除所有事件 |
picker.on(事件上触发, 处理程序) | 添加事件处理程序 |
picker.once(事件上触发, 处理程序) | 添加在触发后将被移除的事件处理程序 |
picker.off(事件上触发, 处理程序) | 移除事件处理程序 |
picker.off(事件上触发) | 移除指定事件的所有处理程序 |
picker.emit(事件上触发, ...args) | 在实例上触发事件 |
列方法和属性
选择器picker.cols
数组中的每个列也有自己的有用方法和属性。
//Get first column
var col = picker.cols[0];
属性 | |
---|---|
col.el | 列HTML元素 |
col.$el | 包含列容器的Dom7实例 |
col.items | 包含列项HTML元素的Dom7实例 |
col.value | 当前选定的列值 |
col.displayValue | 当前选定的列显示值 |
col.activeIndex | 当前选定/活动项的索引号 |
方法 | |
col.setValue(值) | 为当前列设置新值。value 是新值。 |
col.replaceValues(values, displayValues) | 用新值替换列值和displayValues |
Picker事件
选择器将在选择器元素上触发以下DOM事件,并在应用和选择器实例上触发事件:
DOM 事件
事件 | Target | 描述 |
---|---|---|
picker:open | Picker元素<div class="picker"> | 当选择器开始其打开动画时将触发事件 |
picker:opened | Picker元素<div class="picker"> | 选择器完成其打开动画后将触发事件 |
picker:close | Picker元素<div class="picker"> | 当Picker开始它的关闭动画时,事件将被触发。 |
picker:closed | Picker元素<div class="picker"> | 当Picker完成它的关闭动画后,事件将被触发。 |
App和Picker实例事件
Picker实例在自身实例和应用实例上发出事件。应用实例事件名称前缀为picker
.
事件 | Target | 参数 | 描述 |
---|---|---|---|
change | picker | (picker, value, displayValue) | 当picker值变化时,事件将被触发。 |
pickerChange | app | ||
init | picker | (picker) | 当picker初始化时,事件将被触发。 |
pickerInit | app | ||
open为前缀 | picker | (picker) | 当Picker开始它的打开动画时。作为参数事件处理程序接收picker实例 |
pickerOpen | app | ||
opened | picker | (picker) | 当Picker完成它的打开动画后。作为参数事件处理程序接收picker实例 |
pickerOpened | app | ||
close | picker | (picker) | 当Picker开始它的关闭动画时。作为参数事件处理程序接收picker实例 |
pickerClose | app | ||
closed | picker | (picker) | 当Picker完成它的关闭动画后。作为参数事件处理程序接收picker实例 |
pickerClosed | app | ||
beforeDestroy | picker | (picker) | 在Picker实例将被销毁之前,事件将被触发。作为参数事件处理程序接收picker实例 |
pickerBeforeDestroy | app |
CSS 变量
以下是相关CSS 变量(CSS 自定义属性) 的列表。
注意,注释掉的变量默认未指定,其值在这种情况下是它们回退到的值。
:root {
--f7-picker-height: 260px;
--f7-picker-inline-height: 200px;
--f7-picker-popover-height: 260px;
--f7-picker-popover-width: 280px;
--f7-picker-landscape-height: 200px;
--f7-picker-item-height: 36px;
/*
--f7-picker-sheet-bg-color: var(--f7-sheet-bg-color);
*/
}
.ios {
--f7-picker-column-font-size: 20px;
--f7-picker-item-selected-text-color: #000;
--f7-picker-item-selected-bg-color: rgba(0, 0, 0, 0.12);
--f7-picker-divider-text-color: #000;
--f7-picker-item-text-color: rgba(0, 0, 0, 0.45);
}
.ios .dark,
.ios.dark {
--f7-picker-item-selected-text-color: #fff;
--f7-picker-item-selected-bg-color: rgba(255, 255, 255, 0.1);
--f7-picker-divider-text-color: #fff;
--f7-picker-item-text-color: rgba(255, 255, 255, 0.55);
}
.md {
--f7-picker-column-font-size: 20px;
}
.md,
.md .dark,
.md [class*='color-'] {
--f7-picker-item-selected-text-color: var(--f7-md-on-surface);
--f7-picker-item-text-color: var(--f7-md-on-surface-variant);
--f7-picker-divider-text-color: var(--f7-md-on-surface);
--f7-picker-item-selected-border-color: var(--f7-md-outline);
}
示例
picker.html
<template>
<div class="page">
<div class="navbar">
<div class="navbar-bg"></div>
<div class="navbar-inner sliding">
<div class="title">Picker</div>
</div>
</div>
<div class="page-content">
<div class="block">
<p>Picker is a powerful component that allows you to create custom overlay pickers which looks like native
picker.</p>
<p>Picker could be used as inline component or as overlay. Overlay Picker will be automatically converted to
Popover on tablets (iPad).</p>
</div>
<div class="block-title">Picker with single value</div>
<div class="list list-strong-ios list-outline-ios">
<ul>
<li>
<div class="item-content item-input">
<div class="item-inner">
<div class="item-input-wrap">
<input type="text" placeholder="Your iOS device" readonly="readonly" id="demo-picker-device" />
</div>
</div>
</div>
</li>
</ul>
</div>
<div class="block-title">2 values and 3d-rotate effect</div>
<div class="list list-strong-ios list-outline-ios">
<ul>
<li>
<div class="item-content item-input">
<div class="item-inner">
<div class="item-input-wrap">
<input type="text" placeholder="Describe yourself" readonly="readonly" id="demo-picker-describe" />
</div>
</div>
</div>
</li>
</ul>
</div>
<div class="block-title">Dependent values</div>
<div class="list list-strong-ios list-outline-ios">
<ul>
<li>
<div class="item-content item-input">
<div class="item-inner">
<div class="item-input-wrap">
<input type="text" placeholder="Your car" readonly="readonly" id="demo-picker-dependent" />
</div>
</div>
</div>
</li>
</ul>
</div>
<div class="block-title">Custom toolbar</div>
<div class="list list-strong-ios list-outline-ios">
<ul>
<li>
<div class="item-content item-input">
<div class="item-inner">
<div class="item-input-wrap">
<input type="text" placeholder="Describe yourself" readonly="readonly"
id="demo-picker-custom-toolbar" />
</div>
</div>
</div>
</li>
</ul>
</div>
<div class="block-title">Inline Picker / Date-time</div>
<div class="list no-margin">
<ul>
<li>
<div class="item-content item-input">
<div class="item-inner">
<div class="item-input-wrap">
<input type="text" placeholder="Date Time" readonly="readonly" id="demo-picker-date" />
</div>
</div>
</div>
</li>
</ul>
</div>
<div class="block block-strong block-outline-ios inset-md no-padding no-margin-top">
<div id="demo-picker-date-container"></div>
</div>
</div>
</div>
</template>
<script>
export default (props, { $f7, $on }) => {
let pickerDevice;
let pickerDescribe;
let pickerDependent;
let pickerCustomToolbar;
$on('pageInit', () => {
// iOS Device picker
pickerDevice = $f7.picker.create({
inputEl: '#demo-picker-device',
cols: [
{
textAlign: 'center',
values: ['iPhone 4', 'iPhone 4S', 'iPhone 5', 'iPhone 5S', 'iPhone 6', 'iPhone 6 Plus', 'iPad 2', 'iPad Retina', 'iPad Air', 'iPad mini', 'iPad mini 2', 'iPad mini 3']
}
]
});
// Describe yourself picker
pickerDescribe = $f7.picker.create({
inputEl: '#demo-picker-describe',
rotateEffect: true,
cols: [
{
textAlign: 'left',
values: ('Super Amazing Bat Iron Rocket Lex Beautiful Wonderful Raining Happy Funny Cool Hot').split(' ')
},
{
values: ('Man Luthor Woman Boy Girl Person Cutie Babe Raccoon').split(' ')
},
]
});
// Dependent values
var carVendors = {
Japanese: ['Honda', 'Lexus', 'Mazda', 'Nissan', 'Toyota'],
German: ['Audi', 'BMW', 'Mercedes', 'Volkswagen', 'Volvo'],
American: ['Cadillac', 'Chrysler', 'Dodge', 'Ford']
};
pickerDependent = $f7.picker.create({
inputEl: '#demo-picker-dependent',
rotateEffect: true,
formatValue: function (values) {
return values[1];
},
cols: [
{
textAlign: 'left',
values: ['Japanese', 'German', 'American'],
onChange: function (picker, country) {
if (picker.cols[1].replaceValues) {
picker.cols[1].replaceValues(carVendors[country]);
}
}
},
{
values: carVendors.Japanese,
width: 160,
},
]
});
// Custom Toolbar
pickerCustomToolbar = $f7.picker.create({
inputEl: '#demo-picker-custom-toolbar',
rotateEffect: true,
renderToolbar: function () {
return '<div class="toolbar">' +
'<div class="toolbar-inner">' +
'<div class="left">' +
'<a class="link toolbar-randomize-link">Randomize</a>' +
'</div>' +
'<div class="right">' +
'<a class="link sheet-close popover-close">That\'s me</a>' +
'</div>' +
'</div>' +
'</div>';
},
cols: [
{
values: ['Mr', 'Ms'],
},
{
textAlign: 'left',
values: ('Super Amazing Bat Iron Rocket Lex Beautiful Wonderful Raining Happy Funny Cool Hot').split(' ')
},
{
values: ('Man Luthor Woman Boy Girl Person Cutie Babe Raccoon').split(' ')
},
],
on: {
open: function (picker) {
picker.$el.find('.toolbar-randomize-link').on('click', function () {
var col0Values = picker.cols[0].values;
var col0Random = col0Values[Math.floor(Math.random() * col0Values.length)];
var col1Values = picker.cols[1].values;
var col1Random = col1Values[Math.floor(Math.random() * col1Values.length)];
var col2Values = picker.cols[2].values;
var col2Random = col2Values[Math.floor(Math.random() * col2Values.length)];
picker.setValue([col0Random, col1Random, col2Random]);
});
},
}
});
// Inline date-time
const today = new Date();
pickerInline = $f7.picker.create({
containerEl: '#demo-picker-date-container',
inputEl: '#demo-picker-date',
toolbar: false,
rotateEffect: true,
value: [
today.getMonth(),
today.getDate(),
today.getFullYear(),
today.getHours(),
today.getMinutes() < 10 ? '0' + today.getMinutes() : today.getMinutes()
],
formatValue: function (values, displayValues) {
return displayValues[0] + ' ' + values[1] + ', ' + values[2] + ' ' + values[3] + ':' + values[4];
},
cols: [
// Months
{
values: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
displayValues: ('January February March April May June July August September October November December').split(' '),
textAlign: 'left'
},
// Days
{
values: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31],
},
// Years
{
values: (function () {
var arr = [];
for (var i = 1950; i <= 2030; i++) { arr.push(i); }
return arr;
})(),
},
// Space divider
{
divider: true,
content: ' '
},
// Hours
{
values: (function () {
var arr = [];
for (var i = 0; i <= 23; i++) { arr.push(i); }
return arr;
})(),
},
// Divider
{
divider: true,
content: ':'
},
// Minutes
{
values: (function () {
var arr = [];
for (var i = 0; i <= 59; i++) { arr.push(i < 10 ? '0' + i : i); }
return arr;
})(),
}
],
on: {
change: function (picker, values, displayValues) {
var daysInMonth = new Date(picker.value[2], picker.value[0] * 1 + 1, 0).getDate();
if (values[1] > daysInMonth) {
picker.cols[1].setValue(daysInMonth);
}
},
}
});
});
$on('pageBeforeRemove', () => {
pickerDevice.destroy();
pickerDescribe.destroy();
pickerDependent.destroy();
pickerCustomToolbar.destroy();
});
return $render;
};
</script>