智能选择器

智能选择器允许你轻松将通常的表单选择器转换为具有分组的单选按钮或复选框输入的动态页面。在许多本机 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 属性来指定智能选择页面列表视图(选项)图标

例如

自定义选项颜色和图像

我们还可以指定智能选择页面列表视图元素图像或颜色。我们需要在智能选择 <select>(为所有选项设置默认图像)或在 <option> 上使用附加 data-option-image 属性来设置单个选项上的图像或图标。

对于单个选项,我们还可以使用 data-option-colordata-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 - HTMLElementstring(带有 CSS 选择器)或 object。要销毁的 Smart Select 元素或 Smart Select 实例。

app.smartSelect.get(smartSelectEl) - 通过 HTML 元素获取 Smart Select 实例

  • smartSelectEl - HTMLElementstring(带有 CSS 选择器)。Smart Select 元素。

该方法返回 Smart Select 实例

app.smartSelect.open(smartSelectEl) - 打开 Smart Select

  • smartSelectEl - HTMLElementstring(带有 CSS 选择器)。要打开的 Smart Select 元素。

该方法返回 Smart Select 实例

app.smartSelect.close(smartSelectEl) - 关闭 Smart Select

  • smartSelectEl - HTMLElementstring(带有 CSS 选择器)。要关闭的 Smart Select 元素。

该方法返回 Smart Select 实例

Smart Select 参数

现在我们来看一看创建 Smart Select 所需的可用参数列表

参数类型默认说明
elHTMLElementSmart Select 元素。如果你已经在 HTML 中有了 Smart Select 元素并想使用此元素创建新实例,这会很有用
viewobject链接到已初始化的 View 实例,这是 Smart Select 工作所必需的。默认情况下,如果未指定,它将在父级 View 中打开。
valueElHTMLElement插入所选值的视觉元素。如果未传递,它将查找 <div class="item-after"> 元素
setValueTextbooleantrue启用后,智能选择将自动根据 "formatValueText" 返回的格式将值文本插入到指定的 "valueEl" 中
formatValueTextfunction(values)用于格式化列表项中显示的智能选择文本值(在 <div class="item-after">)中的自定义函数。values 是当前值的数组
openInstringpage定义如何打开 Smart Select。可以是 pagepopuppopoversheet
popupPushbooleanfalse允许智能选择弹出窗口在打开时将视图推到后面
popupSwipeToClosebooleanundefined能够通过滑动关闭智能选择弹出窗口。未指定时,它继承应用程序弹出窗口 swipeToClose 参数
sheetPushbooleanfalse使智能选择工作表能够在打开时将视图推到后面
sheetSwipeToClosebooleanundefined能够通过滑动关闭智能选择工作表。未指定时,它继承应用程序工作表 swipeToClose 参数
sheetBackdropbooleanfalse启用智能选择工作表背景
pageTitlestring智能选择页面标题。如果未传递,它将是 <div class="item-title"> 文本
pageBackLinkTextstringBack智能选择页面返回链接文本
popupCloseLinkTextstring关闭智能选择弹出框关闭链接文本
popupTabletFullscreenbooleanfalse当启用时,智能选择弹出框将在平板电脑上以全屏方式显示
sheetCloseLinkTextstring完成智能选择工作表关闭链接文本
搜索栏boolean
object
false启用智能选择页面上的搜索栏。如果作为对象传递,则它应该是有效的 搜索栏参数
searchbarPlaceholderstring搜索搜索栏占位符文本
searchbarDisableTextstring取消搜索栏“取消”链接文本。仅在 iOS 主题中生效
searchbarSpellcheckbooleanfalse设置搜索栏输入元素上 spellcheck 属性的值
appendSearchbarNotFoundboolean
string
HTMLElement
false在没有搜索栏结果时附加带有内容的块。

如果指定为字符串,它将附加

<div class="block searchbar-not-found">{{appendSearchbarNotFound}}</div>

如果指定为 true

<div class="block searchbar-not-found">Nothing found</div>

如果传递了 HTMLElement,它将添加该元素。

closeOnSelectbooleanfalse如果启用,则在用户选择任何选项后,将自动关闭智能选择
虚拟列表booleanfalse如果你的选择有很多(数百个、数千个)选项,则启用智能选择的虚拟列表
virtualListHeight数字
函数
虚拟列表项高度。如果 number - 列表项高度以像素为单位。如果 function 则函数应该返回项目高度。
scrollToSelectedItembooleanfalse启用后,它将滚动智能选择内容以在打开时首先选择项目
formColorThemestring智能选择页面的表单颜色主题。其中之一 默认颜色
navbarColorThemestring智能选择导航栏颜色主题。其中之一 默认颜色
routableModalsbooleanfalse将打开的智能选择模式(当 openInpopuppopoversheet)添加到路由器历史记录中,这提供了通过返回路由器历史记录来关闭智能选择并设置当前路由到智能选择模式的能力。
网址stringselect/将作为当前路由设置的智能选择页面/模式 URL
cssClassstring要在智能选择容器(页面、弹出框、弹出框或工作表)上设置的附加 CSS 类名
closeByBackdropClickbooleantrue启用后,智能选择模式(弹出框、弹出框、工作表)将在点击背景时关闭
inputIconPositionstring'start'选择选项复选框或单选按钮图标位置。可以是 'start''end'。还可以通过 data-input-icon-position 属性在每个选项上进行设置
optionIconstring选择选项图标以在所有选项上设置。如果它只是一个字符串,那么将使用此类创建一个图标。如果是 f7:icon_name 格式,则将创建一个 F7-Icons 图标。如果是 md:icon_name 格式,则将创建一个 Material 图标
optionIconIosstringoptionIcon 相同,但仅当 iOS 主题处于活动状态时才适用
optionIconMdstringoptionIcon 相同,但仅当 MD 主题处于活动状态时才适用
呈现函数
renderSearchbar函数呈现智能选择搜索栏下拉菜单的函数,必须返回搜索栏 HTML 字符串
renderItemfunction(item, index)呈现智能选择项的函数,必须返回项 HTML 字符串
renderItemsfunction(items)呈现所有智能选择项的函数,必须返回所有项 HTML 字符串
renderPagefunction(items)呈现智能选择页面的函数,必须返回完整页面 HTML 字符串
renderPopupfunction(items)呈现智能选择弹出窗口的函数,必须返回完整弹出窗口 HTML 字符串
renderSheetfunction(items)呈现智能选择列表的函数,必须返回完整列表 HTML 字符串
renderPopoverfunction(items)呈现智能选择弹出窗口的函数,必须返回完整弹出窗口 HTML 字符串
事件
onobject

带有事件处理程序的对象。例如

var smartSelect = app.smartSelect.create({
  ...
  on: {
    opened: function () {
      console.log('Smart select opened')
    }
  }
})

请注意,所有以下参数都可以用于 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

事件目标参数说明
beforeOpensmartSelect(smartSelect, prevent)在智能选择打开前触发事件。作为参数,事件处理程序接收智能选择实例和在调用时会阻止智能选择打开的函数
smartSelectBeforeOpen应用程序
opensmartSelect(smartSelect)当智能选择开始其打开动画时触发事件。作为参数,事件处理程序接收智能选择实例
smartSelectOpen应用程序
openedsmartSelect(smartSelect)在智能选择完成其打开动画后触发事件。作为参数,事件处理程序接收智能选择实例
smartSelectOpened应用程序
closesmartSelect(smartSelect)当智能选择开始其关闭动画时触发事件。作为参数,事件处理程序接收智能选择实例
smartSelectClose应用程序
closedsmartSelect(smartSelect)在智能选择完成其关闭动画后触发事件。作为参数,事件处理程序接收智能选择实例
smartSelectClosed应用程序
beforeDestroysmartSelect(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);
  */
}

示例

smart-select.html
<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>