智能选择器
智能选择器允许你轻松将通常的表单选择器转换为具有分组的单选按钮或复选框输入的动态页面。在许多本机 iOS 应用程序中,你可以看到此类功能
智能选择器布局
智能选择布局相当简洁。它是一个众所周知的 列表视图 链接,内部具有 <select>
和 item-link
上的附加 smart-select
类
<div class="list">
<ul>
<!-- Smart select item -->
<li>
<!-- Additional "smart-select" class -->
<a href="#" class="item-link smart-select">
<!-- select -->
<select name="fruits">
<option value="apple" selected>Apple</option>
<option value="pineapple">Pineapple</option>
...
</select>
<div class="item-content">
<div class="item-inner">
<!-- Select label -->
<div class="item-title">Fruit</div>
<!-- Selected value, not required -->
<div class="item-after">Apple</div>
</div>
</div>
</a>
</li>
<!-- Another smart selects or list view elements -->
...
</ul>
</div>
注意,智能选择仅在已初始化的视图中运行,因为它使用路由器来加载智能选择页面或打开模态框!
自定义选项图标
我们可通过在 <option>
元素上使用 data-option-icon
属性来指定智能选择页面列表视图(选项)图标
data-option-icon
- 如果它只是一个字符串,则将使用此类创建一个图标。如果其格式为f7:icon_name
,则它会创建一个 F7 图标。如果其格式为md:icon_name
,则它会创建一个 Material 图标data-option-icon-ios
- 与data-option-icon
相同,但仅当 iOS 主题处于激活状态时才会应用data-option-icon-md
- 与data-option-icon
相同,但仅当 MD 主题处于激活状态时才会应用
例如
<option data-option-icon="my-icon">
将生成<i class="icon my-icon"></i>
列表项图标<option data-option-icon="f7:house_fill">
将生成<i class="icon f7-icons">house_fill</i>
列表项图标<option data-option-icon="material:home">
将生成<i class="icon material-icons">home</i>
列表项图标<option data-option-icon-ios="f7:house" data-option-icon-md="material:home">
将生成<i class="icon f7-icons">house</i>
- 当 iOS 主题处于激活状态时<i class="icon material-icons">home</i>
- 当 MD 主题处于激活状态时
自定义选项颜色和图像
我们还可以指定智能选择页面列表视图元素图像或颜色。我们需要在智能选择 <select>
(为所有选项设置默认图像)或在 <option>
上使用附加 data-option-image
属性来设置单个选项上的图像或图标。
对于单个选项,我们还可以使用 data-option-color
和 data-option-class
属性来添加特定选项颜色或 css 类以进行附加样式处理
<li>
<a href="#" class="item-link smart-select">
<select name="fruits">
<option value="apple" selected data-option-image="https://cdn.framework7.io/placeholder/abstract-29x29-1.jpg">Apple</option>
<option value="pineapple" data-option-image="https://cdn.framework7.io/placeholder/abstract-29x29-2.jpg">Pineapple</option>
<option value="pear" data-option-color="orange" data-option-image="https://cdn.framework7.io/placeholder/abstract-29x29-3.jpg">Pear</option>
...
</select>
<div class="item-content">
<div class="item-inner">
<div class="item-title">Fruit</div>
</div>
</div>
</a>
</li>
多选和 <optgroup>
我们还可以使用 <optgroup>
对选项进行多选和分组。因此,如果我们为选择添加 multiple
属性,则智能选择页面上的单选按钮将自动转换为复选框
<li>
<a href="#" class="item-link smart-select">
<!-- "multiple" attribute for multiple select-->
<select name="car" multiple>
<!-- options grouped within "optgroup" tag-->
<optgroup label="Japanese">
<option value="honda" selected>Honda</option>
<option value="lexus">Lexus</option>
...
</optgroup>
<optgroup label="German">
<option value="audi" selected>Audi</option>
<option value="bmw">BMW</option>
...
</optgroup>
<optgroup label="American">
<option value="cadillac">Cadillac</option>
<option value="chrysler">Chrysler</option>
...
</optgroup>
</select>
<div class="item-content">
<div class="item-inner">
<div class="item-title">Car</div>
</div>
</div>
</a>
</li>
多选和 maxlength
对于多选,我们还可以使用 maxlength 属性来限制可能选定的选项数量
<li>
<a href="#" class="item-link smart-select">
<!-- "maxlength" attribute to limit number of possible selected items -->
<!-- we won't allow to select more than 3 items -->
<select name="car" multiple maxlength="3">
<optgroup label="Japanese">
<option value="honda" selected>Honda</option>
<option value="lexus">Lexus</option>
...
</optgroup>
<optgroup label="German">
<option value="audi">Audi</option>
<option value="bmw">BMW</option>
...
</optgroup>
<optgroup label="American">
<option value="cadillac">Cadillac</option>
<option value="chrysler">Chrysler</option>
...
</optgroup>
</select>
<div class="item-content">
<div class="item-inner">
<div class="item-title">Car</div>
</div>
</div>
</a>
</li>
不同的显示值
在选项上使用 data-display-as
属性,我们可以在不同的方式中显示所选值
<li>
<a href="#" class="item-link smart-select">
<select name="days">
<option value="monday" selected data-display-as="Mon">Monday</option>
<option value="tuesday" data-display-as="Tue">Tuesday</option>
<option value="wednesday" data-display-as="Wed">Wednesday</option>
<option value="thursday" data-display-as="Thu">Thursday</option>
<option value="friday" data-display-as="Fri">Friday</option>
<option value="saturday" data-display-as="Sat">Saturday</option>
<option value="sunday" data-display-as="Sun">Sunday</option>
</select>
<div class="item-content">
<div class="item-inner">
<div class="item-title">Day</div>
</div>
</div>
</a>
</li>
智能选择应用方法
让我们查看相关的应用方法以使用智能选择
app.smartSelect.create(parameters)- 创建智能选择实例
- parameters - object。具有智能选择参数的对象
方法返回创建的 Smart Select 实例
app.smartSelect.destroy(smartSelectEl) - 销毁 Smart Select 实例
- smartSelectEl - HTMLElement 或 string(带有 CSS 选择器)或 object。要销毁的 Smart Select 元素或 Smart Select 实例。
app.smartSelect.get(smartSelectEl) - 通过 HTML 元素获取 Smart Select 实例
- smartSelectEl - HTMLElement 或 string(带有 CSS 选择器)。Smart Select 元素。
该方法返回 Smart Select 实例
app.smartSelect.open(smartSelectEl) - 打开 Smart Select
- smartSelectEl - HTMLElement 或 string(带有 CSS 选择器)。要打开的 Smart Select 元素。
该方法返回 Smart Select 实例
app.smartSelect.close(smartSelectEl) - 关闭 Smart Select
- smartSelectEl - HTMLElement 或 string(带有 CSS 选择器)。要关闭的 Smart Select 元素。
该方法返回 Smart Select 实例
Smart Select 参数
现在我们来看一看创建 Smart Select 所需的可用参数列表
参数 | 类型 | 默认 | 说明 |
---|---|---|---|
el | HTMLElement | Smart Select 元素。如果你已经在 HTML 中有了 Smart Select 元素并想使用此元素创建新实例,这会很有用 | |
view | object | 链接到已初始化的 View 实例,这是 Smart Select 工作所必需的。默认情况下,如果未指定,它将在父级 View 中打开。 | |
valueEl | HTMLElement | 插入所选值的视觉元素。如果未传递,它将查找 <div class="item-after"> 元素 | |
setValueText | boolean | true | 启用后,智能选择将自动根据 "formatValueText" 返回的格式将值文本插入到指定的 "valueEl" 中 |
formatValueText | function(values) | 用于格式化列表项中显示的智能选择文本值(在 <div class="item-after"> )中的自定义函数。values 是当前值的数组 | |
openIn | string | page | 定义如何打开 Smart Select。可以是 page 或 popup 或 popover 或 sheet |
popupPush | boolean | false | 允许智能选择弹出窗口在打开时将视图推到后面 |
popupSwipeToClose | boolean | undefined | 能够通过滑动关闭智能选择弹出窗口。未指定时,它继承应用程序弹出窗口 swipeToClose 参数 |
sheetPush | boolean | false | 使智能选择工作表能够在打开时将视图推到后面 |
sheetSwipeToClose | boolean | undefined | 能够通过滑动关闭智能选择工作表。未指定时,它继承应用程序工作表 swipeToClose 参数 |
sheetBackdrop | boolean | false | 启用智能选择工作表背景 |
pageTitle | string | 智能选择页面标题。如果未传递,它将是 <div class="item-title"> 文本 | |
pageBackLinkText | string | Back | 智能选择页面返回链接文本 |
popupCloseLinkText | string | 关闭 | 智能选择弹出框关闭链接文本 |
popupTabletFullscreen | boolean | false | 当启用时,智能选择弹出框将在平板电脑上以全屏方式显示 |
sheetCloseLinkText | string | 完成 | 智能选择工作表关闭链接文本 |
搜索栏 | boolean object | false | 启用智能选择页面上的搜索栏。如果作为对象传递,则它应该是有效的 搜索栏参数 |
searchbarPlaceholder | string | 搜索 | 搜索栏占位符文本 |
searchbarDisableText | string | 取消 | 搜索栏“取消”链接文本。仅在 iOS 主题中生效 |
searchbarSpellcheck | boolean | false | 设置搜索栏输入元素上 spellcheck 属性的值 |
appendSearchbarNotFound | boolean string HTMLElement | false | 在没有搜索栏结果时附加带有内容的块。 如果指定为字符串,它将附加
如果指定为
如果传递了 |
closeOnSelect | boolean | false | 如果启用,则在用户选择任何选项后,将自动关闭智能选择 |
虚拟列表 | boolean | false | 如果你的选择有很多(数百个、数千个)选项,则启用智能选择的虚拟列表 |
virtualListHeight | 数字 函数 | 虚拟列表项高度。如果 number - 列表项高度以像素为单位。如果 function 则函数应该返回项目高度。 | |
scrollToSelectedItem | boolean | false | 启用后,它将滚动智能选择内容以在打开时首先选择项目 |
formColorTheme | string | 智能选择页面的表单颜色主题。其中之一 默认颜色 | |
navbarColorTheme | string | 智能选择导航栏颜色主题。其中之一 默认颜色 | |
routableModals | boolean | false | 将打开的智能选择模式(当 openIn 为 popup 、popover 或 sheet )添加到路由器历史记录中,这提供了通过返回路由器历史记录来关闭智能选择并设置当前路由到智能选择模式的能力。 |
网址 | string | select/ | 将作为当前路由设置的智能选择页面/模式 URL |
cssClass | string | 要在智能选择容器(页面、弹出框、弹出框或工作表)上设置的附加 CSS 类名 | |
closeByBackdropClick | boolean | true | 启用后,智能选择模式(弹出框、弹出框、工作表)将在点击背景时关闭 |
inputIconPosition | string | 'start' | 选择选项复选框或单选按钮图标位置。可以是 'start' 或 'end' 。还可以通过 data-input-icon-position 属性在每个选项上进行设置 |
optionIcon | string | 选择选项图标以在所有选项上设置。如果它只是一个字符串,那么将使用此类创建一个图标。如果是 f7:icon_name 格式,则将创建一个 F7-Icons 图标。如果是 md:icon_name 格式,则将创建一个 Material 图标 | |
optionIconIos | string | 与 optionIcon 相同,但仅当 iOS 主题处于活动状态时才适用 | |
optionIconMd | string | 与 optionIcon 相同,但仅当 MD 主题处于活动状态时才适用 | |
呈现函数 | |||
renderSearchbar | 函数 | 呈现智能选择搜索栏下拉菜单的函数,必须返回搜索栏 HTML 字符串 | |
renderItem | function(item, index) | 呈现智能选择项的函数,必须返回项 HTML 字符串 | |
renderItems | function(items) | 呈现所有智能选择项的函数,必须返回所有项 HTML 字符串 | |
renderPage | function(items) | 呈现智能选择页面的函数,必须返回完整页面 HTML 字符串 | |
renderPopup | function(items) | 呈现智能选择弹出窗口的函数,必须返回完整弹出窗口 HTML 字符串 | |
renderSheet | function(items) | 呈现智能选择列表的函数,必须返回完整列表 HTML 字符串 | |
renderPopover | function(items) | 呈现智能选择弹出窗口的函数,必须返回完整弹出窗口 HTML 字符串 | |
事件 | |||
on | object | 带有事件处理程序的对象。例如
|
请注意,所有以下参数都可以用于 smartSelect
属性下的全局应用参数中,以为所有智能选择设置默认值。例如
var app = new Framework7({
smartSelect: {
pageTitle: 'Select Option',
openIn: 'popup',
}
});
智能选择方法和属性
因此,要创建智能选择,我们必须调用
var smartSelect = app.smartSelect.create({ /* parameters */ })
之后,我们获得了它的初始化实例(如上面示例中的 smartSelect
变量),其中包含有用的方法和属性
属性 | |
---|---|
smartSelect.app | 指向全局应用实例的链接 |
smartSelect.el | 智能选择 HTML 元素 |
smartSelect.$el | 带智能选择 HTML 元素的 Dom7 实例 |
smartSelect.valueEl | 用于显示值的 HTML 元素 |
smartSelect.$valueEl | 带用于显示值的 HTML 元素的 Dom7 实例 |
smartSelect.selectEl | 子选择元素 <select> |
smartSelect.$selectEl | 带子选择元素的 Dom7 实例 |
smartSelect.url | 智能选择 URL(在 url 参数中传递) |
smartSelect.view | 智能选择视图(在 view 参数中传递)或找到父视图 |
smartSelect.params | 智能选择参数 |
方法 | |
smartSelect.open() | 打开智能选择 |
smartSelect.close() | 关闭智能选择 |
smartSelect.getValue() | 返回智能选择值。如果是多选,则返回一个包含所选值的数组 |
smartSelect.setValue(newValue) | 设置新的智能选择值。如果是多选,则必须是一个包含新值的数组 |
smartSelect.unsetValue() | 取消设置智能选择值 |
smartSelect.scrollToSelectedItem() | 将智能选择内容滚动到第一个所选项目(打开时) |
smartSelect.destroy() | 销毁智能选择 |
smartSelect.on(event, handler) | 添加事件处理程序 |
smartSelect.once(event, handler) | 添加将在触发后删除的事件处理程序 |
smartSelect.off(event, handler) | 删除事件处理程序 |
smartSelect.off(event) | 删除指定事件的所有处理程序 |
smartSelect.emit(事件, ...args) | 实例中触发事件 |
智能选择事件
智能选择将在智能选择元素以及应用程序和智能选择实例上触发以下 DOM 事件
DOM 事件
事件 | 目标 | 说明 |
---|---|---|
smartselect:beforeopen | 智能选择元素<a class="item-link smart-select"> | 在智能选择打开前触发事件。event.detail.prevent 包含在调用时会阻止智能选择打开的函数 |
smartselect:open | 智能选择元素<a class="item-link smart-select"> | 当智能选择页面(或模式)开始其打开动画时触发事件 |
smartselect:opened | 智能选择元素<a class="item-link smart-select"> | 在智能选择页面(或模式)完成其打开动画后触发事件 |
smartselect:close | 智能选择元素<a class="item-link smart-select"> | 当智能选择页面(或模式)开始其关闭动画时触发事件 |
smartselect:closed | 智能选择元素<a class="item-link smart-select"> | 在智能选择页面(或模式)完成其关闭动画后触发事件 |
smartselect:beforedestroy | 智能选择元素<a class="item-link smart-select"> | 在销毁智能选择实例之前触发事件 |
应用程序和智能选择实例事件
智能选择实例在自身实例和应用程序实例上触发事件。应用程序实例事件具有相同名称,前缀为 smartSelect
。
事件 | 目标 | 参数 | 说明 |
---|---|---|---|
beforeOpen | smartSelect | (smartSelect, prevent) | 在智能选择打开前触发事件。作为参数,事件处理程序接收智能选择实例和在调用时会阻止智能选择打开的函数 |
smartSelectBeforeOpen | 应用程序 | ||
open | smartSelect | (smartSelect) | 当智能选择开始其打开动画时触发事件。作为参数,事件处理程序接收智能选择实例 |
smartSelectOpen | 应用程序 | ||
opened | smartSelect | (smartSelect) | 在智能选择完成其打开动画后触发事件。作为参数,事件处理程序接收智能选择实例 |
smartSelectOpened | 应用程序 | ||
close | smartSelect | (smartSelect) | 当智能选择开始其关闭动画时触发事件。作为参数,事件处理程序接收智能选择实例 |
smartSelectClose | 应用程序 | ||
closed | smartSelect | (smartSelect) | 在智能选择完成其关闭动画后触发事件。作为参数,事件处理程序接收智能选择实例 |
smartSelectClosed | 应用程序 | ||
beforeDestroy | smartSelect | (smartSelect) | 在销毁智能选择实例之前触发事件。作为参数,事件处理程序接收智能选择实例 |
smartSelectBeforeDestroy | 应用程序 |
智能选择自动初始化
如果您不需要使用智能选择 API,并且您的智能选择在页面中且在页面初始化时显示在 DOM 中,则可以通过只添加额外的 smart-select-init
类来自动初始化它
<li>
<!-- Add smart-select-init class -->
<a href="#" class="item-link smart-select smart-select-init">
<!-- select -->
<select name="fruits">
<option value="apple" selected>Apple</option>
<option value="pineapple">Pineapple</option>
...
</select>
<div class="item-content">
<div class="item-inner">
<div class="item-title">Fruit</div>
<div class="item-after">Apple</div>
</div>
</div>
</a>
</li>
在这种情况下,如果您需要访问创建的智能选择实例,可以使用应用程序方法 app.smartSelect.get
var smartSelect = app.smartSelect.get('.smart-select');
在使用自动初始化时,可能需要传递附加参数。在这种情况下,可以通过智能选择元素上的 data-
属性传递所有附加参数。
<li>
<!-- Pass parameters as kebab-case data attributes -->
<a href="#" class="item-link smart-select smart-select-init" data-open-in="popup" data-virtual-list="true" data-page-back-link-text="Go back">
<!-- select -->
<select name="fruits">
<option value="apple" selected>Apple</option>
<option value="pineapple">Pineapple</option>
...
</select>
<div class="item-content">
<div class="item-inner">
<div class="item-title">Fruit</div>
<div class="item-after">Apple</div>
</div>
</div>
</a>
</li>
CSS 变量
以下是与 CSS 变量(CSS 自定义属性)相关的变量列表。
请注意,带注释的变量在默认情况下未指定,并且它们的值是在这种情况下回退到的值。
:root {
/*
--f7-smart-select-sheet-bg: var(--f7-list-bg-color);
--f7-smart-select-sheet-toolbar-border-color: var(--f7-bars-border-color);
*/
}
示例
<div class="page">
<div class="navbar">
<div class="navbar-bg"></div>
<div class="navbar-inner sliding">
<div class="title">Smart Select</div>
</div>
</div>
<div class="page-content">
<div class="block">
Framework7 allows you to easily convert your usual form selects to dynamic pages with radios:
</div>
<div class="list list-strong-ios list-outline-ios list-dividers-ios">
<ul>
<li>
<a class="item-link smart-select smart-select-init">
<select name="fruits">
<option value="apple" selected>Apple</option>
<option value="pineapple">Pineapple</option>
<option value="pear">Pear</option>
<option value="orange">Orange</option>
<option value="melon">Melon</option>
<option value="peach">Peach</option>
<option value="banana">Banana</option>
</select>
<div class="item-content">
<div class="item-inner">
<div class="item-title">Fruit</div>
</div>
</div>
</a>
</li>
<li>
<a class="item-link smart-select smart-select-init" data-open-in="popup" data-searchbar="true"
data-searchbar-placeholder="Search car">
<select name="car" multiple>
<optgroup label="Japanese">
<option value="honda" selected>Honda</option>
<option value="lexus">Lexus</option>
<option value="mazda">Mazda</option>
<option value="nissan">Nissan</option>
<option value="toyota">Toyota</option>
</optgroup>
<optgroup label="German">
<option value="audi" selected>Audi</option>
<option value="bmw">BMW</option>
<option value="mercedes">Mercedes</option>
<option value="vw">Volkswagen</option>
<option value="volvo">Volvo</option>
</optgroup>
<optgroup label="American">
<option value="cadillac">Cadillac</option>
<option value="chrysler">Chrysler</option>
<option value="dodge">Dodge</option>
<option value="ford" selected>Ford</option>
</optgroup>
</select>
<div class="item-content">
<div class="item-inner">
<div class="item-title">Car</div>
</div>
</div>
</a>
</li>
<li>
<a class="item-link smart-select smart-select-init" data-open-in="sheet">
<select name="mac-windows">
<option value="mac" selected>Mac</option>
<option value="windows">Windows</option>
</select>
<div class="item-content">
<div class="item-inner">
<div class="item-title">Mac or Windows</div>
</div>
</div>
</a>
</li>
<li>
<a class="item-link smart-select smart-select-init" data-open-in="popover">
<select name="superhero" multiple>
<option value="Batman" selected>Batman</option>
<option value="Superman">Superman</option>
<option value="Hulk">Hulk</option>
<option value="Spiderman">Spiderman</option>
<option value="Ironman">Ironman</option>
<option value="Thor">Thor</option>
<option value="Wonder Woman">Wonder Woman</option>
</select>
<div class="item-content">
<div class="item-inner">
<div class="item-title">Super Hero</div>
</div>
</div>
</a>
</li>
</ul>
</div>
</div>
</div>