跳至主要内容
版本:v8

ion-select

阴影

选择器是用于从一组选项中选择一个或多个选项的表单控件。当用户点击选择器时,会弹出一个对话框,其中包含所有选项,并以易于选择的列表形式显示。

选择器应与子 <ion-select-option> 元素一起使用。如果子选项没有指定 value 属性,则其文本将用作值。

如果在 <ion-select> 上设置了 value,则将根据该值选择选定选项。

标签

标签应用于描述选择器。它们可以被用于视觉效果,而且当用户将焦点放在选择器上时,屏幕阅读器也会读出它们。这使得用户能够轻松地理解选择器的目的。选择器有几种方法可以分配标签。

选择器有多种选项可以为组件提供标签。

  • label 属性:用于纯文本标签
  • label 槽:用于自定义 HTML 标签
  • aria-label:用于为屏幕阅读器提供标签,但不添加任何可见的标签

标签位置

标签默认情况下会占用其内容的宽度。开发人员可以使用 labelPlacement 属性来控制标签相对于控件的位置。虽然这里使用了 label 属性,但 labelPlacement 也可以与 label 槽一起使用。

标签槽

虽然纯文本标签应该通过 label 属性传递,但如果需要自定义 HTML,则可以通过 label 槽传递。

无可见标签

如果不需要可见标签,开发人员仍应提供 aria-label,以便屏幕阅读器能够访问选择器。

单选

默认情况下,选择器只允许用户选择一个选项。警报界面向用户呈现一个带单选按钮样式的选项列表。选择器组件的值接收选定选项的值。

单选的键盘交互在下面 键盘交互 部分中描述。

多选

通过向选择器添加 multiple 属性,用户可以選擇多個选项。当可以選擇多个选项时,警报、弹出框或模态覆盖层会向用户呈现一个带复选框样式的选项列表。选择器组件的值接收所有选定选项值的数组。

注意

action-sheet 界面不支持多选。

多选的键盘交互在下面 键盘交互 部分中描述。

界面

默认情况下,选择器使用 ion-alert 在警报中打开选项的覆盖层。可以通过将 action-sheetpopovermodal 分别传递给 interface 属性,将界面更改为使用 ion-action-sheetion-popoverion-modal。继续阅读其他部分以了解不同界面的限制。

警报

操作表

弹出框

响应交互

处理用户与选择器交互的主要方法是 ionChangeionDismissionCancel 事件。有关这些事件以及选择器触发的其他事件的更多详细信息,请参阅 事件

控制台
当从上面的示例中记录时,控制台消息将显示在此处。

对象值引用

当使用对象作为选择器值时,如果这些对象来自服务器或数据库,则它们的标识可能会发生变化,而选定值的标识保持不变。例如,这可能发生在将具有所需对象值的现有记录加载到选择器中时,但新检索到的选择器选项现在具有不同的标识。这将导致选择器看起来没有任何值,即使原始选择仍然完好无损。

默认情况下,选择器使用严格相等性 (===) 来确定选项是否被选中。这可以通过向 compareWith 属性提供属性名或函数来覆盖。

使用 compareWith

控制台
当从上面的示例中记录时,控制台消息将显示在此处。

对象值和多选

控制台
当从上面的示例中记录时,控制台消息将显示在此处。

对齐方式

开发人员可以使用 justify 属性来控制标签和控件在一行上的排列方式。

填充选择器

Material Design 为选择器提供了填充样式。选择器上的 fill 属性可以设置为 "solid""outline"

通过将选择器的 mode 设置为 md,可以在 iOS 上使用填充选择器。

警告

使用 fill 的选择器不应该在 ion-item 中使用,因为组件之间存在样式冲突。

选择器按钮

警报支持两个按钮:取消确定。每个按钮的文本都可以使用 cancelTextokText 属性进行自定义。

action-sheetpopover 界面没有 确定 按钮,点击任何选项都会自动关闭覆盖层并选择该值。popover 界面没有 取消 按钮,点击遮罩层会关闭覆盖层。

modal 接口的标题中只有一个 关闭 按钮。 此按钮仅负责关闭模态框。 点击此按钮或使用其他方法关闭模态框后,所有选择都将保留。

接口选项

由于 select 使用了 alert、action sheet、popover 和 modal 接口,因此可以通过 interfaceOptions 属性将选项传递给这些组件。 这可以用于传递自定义标题、副标题、css 类等等。

请查看 ion-alert 文档ion-action-sheet 文档ion-popover 文档 以及 ion-modal 文档,了解每个接口接受的属性。

注意:interfaceOptions 不会覆盖 alert 接口中的 inputsbuttons

开始和结束插槽

startend 插槽可用于在 select 的两侧放置图标、按钮或前缀/后缀文本。 如果单击插槽内容,select 不会打开。

注意

在大多数情况下,放置在这些插槽中的 Icon 组件应该具有 aria-hidden="true"。 有关更多信息,请查看 Icon 可访问性文档

如果插槽内容旨在进行交互,则应将其包装在交互式元素中,例如 Button。 这可以确保内容可以被 Tab 键选中。

自定义

Select 组件由两个单元组成,每个单元都需要单独设置样式。 ion-select 元素在视图中由选定值(如果有)或占位符和下拉图标表示。 接口(在上面的 接口 部分定义)是在单击 ion-select 时打开的对话框。 接口包含通过添加 ion-select-option 元素定义的所有选项。 以下部分将介绍对这些元素进行样式设置之间的差异。

设置 Select 元素的样式

如前所述,ion-select 元素仅由视图中显示的值(如果有)或占位符和图标组成。 要自定义它,请使用 CSS 和任何 CSS 自定义属性 的组合进行设置样式。

或者,根据需要的 浏览器支持,可以使用 CSS 阴影部件来设置 select 的样式。 请注意,使用 ::part,可以定位元素上的任何 CSS 属性。

设置 Select 接口的样式

自定义接口对话框应该通过遵循该接口文档中的样式设置部分(CSS 阴影部件、CSS 自定义属性和插槽)来完成。

但是,Select 选项会设置一个类以简化样式设置,并允许将类传递给叠加选项,请查看 Select 选项文档,了解自定义选项的用法示例。

自定义切换图标

显示在 select 文本旁边的图标可以使用 toggleIcon 和/或 expandedIcon 属性设置为任何 Ionicon

图标翻转行为

默认情况下,当 select 打开时,切换图标会在 md 模式下自动旋转,并在 ios 模式下保持静态。 此行为可以使用 CSS 进行自定义。

以下示例还使用了一个 自定义的 toggleIcon 来更好地演示 ios 上的翻转行为,因为默认图标是垂直对称的。

联想输入组件

联想输入或自动完成功能可以使用现有的 Ionic 组件构建。 我们建议使用 ion-modal 来充分利用可用屏幕空间。

接口

SelectChangeEventDetail

interface SelectChangeEventDetail<T = any> {
value: T;
}

SelectCustomEvent

虽然不是必需的,但此接口可以代替 CustomEvent 接口使用,以便更强类型地使用从该组件发出的 Ionic 事件。

interface SelectCustomEvent<T = any> extends CustomEvent {
detail: SelectChangeEventDetail<T>;
target: HTMLIonSelectElement;
}

从旧版 Select 语法迁移

Ionic 在 Ionic 7.0 中引入了更简单的 select 语法。 此新语法减少了设置 select 所需的样板代码,解决了可访问性问题,并改善了开发人员体验。

开发人员可以一次迁移一个 select。 虽然开发人员可以继续使用旧版语法,但我们建议尽快迁移。

使用现代语法

使用现代语法涉及两个步骤。

  1. 删除 ion-label,并在 ion-select 上使用 label 属性。 标签的位置可以使用 ion-select 上的 labelPlacement 属性进行配置。
  2. ion-itemfillshape 的任何用法移动到 ion-select 上。
<!-- Label and Label Position -->

<!-- Before -->
<ion-item>
<ion-label position="floating">Favorite Fruit:</ion-label>
<ion-select>...</ion-select>
</ion-item>

<!-- After -->
<ion-item>
<ion-select label="Favorite Fruit:" label-placement="floating">...</ion-select>
</ion-item>


<!-- Fill -->

<!-- Before -->
<ion-item fill="outline" shape="round">
<ion-label position="floating">Favorite Fruit:</ion-label>
<ion-select>...</ion-select>
</ion-item>

<!-- After -->

<!-- Inputs using `fill` should not be placed in ion-item -->
<ion-select fill="outline" shape="round" label="Favorite Fruit:" label-placement="floating">...</ion-select>

使用旧版语法

Ionic 使用启发式方法来检测应用程序是否使用现代 select 语法。 在某些情况下,可能更愿意继续使用旧版语法。 开发人员可以在 ion-select 上设置 legacy 属性为 true,以强制该输入实例使用旧版语法。

可访问性

键盘交互

Ionic 的键盘交互遵循网络的实现模式,而不是原生 iOS select,以确保所有平台上的一致体验。

当满足以下条件时,这些键盘交互适用于所有 ion-select 元素。

  • select 已关闭。
  • select 已获得焦点。
  • select 未禁用。
描述
Enter打开叠加层,并将焦点设置到第一个选定选项。 如果没有选定选项,则将焦点设置到第一个选项。
空格打开叠加层,并将焦点设置到第一个选定选项。 如果没有选定选项,则将焦点设置到第一个选项。

单选

单选键盘交互遵循 单选按钮的 ARIA 实现模式

这些键盘交互适用于 ion-action-sheetion-alertion-popoverion-modal 元素,当叠加层显示并获得焦点时。

描述
向下箭头将焦点设置到列表中的下一个选项,并选择它。 如果没有下一个选项,则选择将循环到第一个选项。
向左箭头将焦点设置到列表中的上一个选项,并选择它。 如果没有上一个选项,则选择将循环到最后一个选项。
向右箭头将焦点设置到列表中的下一个选项,并选择它。 如果没有下一个选项,则选择将循环到第一个选项。
向上箭头将焦点设置到列表中的上一个选项,并选择它。 如果没有上一个选项,则选择将循环到最后一个选项。
Enter如果选项获得焦点,则会选择该选项。 没有 “确定” 按钮的叠加层会立即提交值,关闭叠加层并将焦点返回到 ion-select 元素。

如果 “确定” 按钮获得焦点,则会保存用户的选择,关闭叠加层并将焦点返回到 ion-select 元素。
Escape关闭叠加层,不更改提交的选项。 将焦点返回到 ion-select 元素。
空格如果获得焦点的单选按钮未选中,则取消选中当前选中的单选按钮,并选中获得焦点的单选按钮。 否则,不执行任何操作。 如果叠加层没有 “确定” 按钮,则会立即提交值,叠加层会关闭。
Tab将焦点移动到叠加层上的下一个可聚焦元素(取消按钮、“确定” 按钮,或选择或第一个选项)。 如果下一个可聚焦元素是选项,则会将焦点设置到选定选项,否则会将焦点设置到第一个选项。

多选

多选键盘交互遵循 复选框的 ARIA 实现模式

这些键盘交互适用于 ion-alertion-popoverion-modal 元素,当叠加层显示并启用多选时。

描述
Enter当 “确定” 按钮获得焦点时,它会保存用户的选择,关闭叠加层并将焦点返回到 ion-select 元素。
Escape关闭叠加层,不更改提交的选项。 将焦点返回到 ion-select 元素。
空格选中或取消选中当前获得焦点的选项。 这不会取消选中其他选定选项。 如果叠加层没有 “确定” 按钮,则会立即提交值。
Tab将焦点移动到叠加层上的下一个可聚焦元素(取消按钮、“确定” 按钮,或任何选项)。 如果下一个可聚焦元素是选项列表,则它应该迭代每个选项。

属性

cancelText

描述在取消按钮上显示的文本。
属性cancel-text
类型string
默认值'Cancel'

color

描述从应用程序调色板中使用的颜色。 默认选项为:"primary""secondary""tertiary""success""warning""danger""light""medium""dark"。 有关颜色的更多信息,请查看 主题

此属性仅在使用现代 select 语法时可用。
属性color
类型"danger" | "dark" | "light" | "medium" | "primary" | "secondary" | "success" | "tertiary" | "warning" | string | undefined
默认值undefined

compareWith

描述此属性允许开发者在确定 ion-select 中选定选项时,为比较对象指定自定义函数或属性名称。如果未指定,则默认行为将使用严格相等 (===) 进行比较。
属性compare-with
类型((currentValue: any, compareValue: any) => boolean) | null | string | undefined
默认值undefined

disabled

描述如果为 true,则用户无法与 select 交互。
属性disabled
类型boolean
默认值false

expandedIcon

描述select 打开时显示的切换图标。如果已定义,则在 md 模式下的图标旋转行为将被禁用。如果未定义,则 toggleIcon 将用于 select 打开和关闭时的图标。
属性expanded-icon
类型string | undefined
默认值undefined

fill

描述项目的填充。如果为 "solid",则项目将有背景。如果为 "outline",则项目将为透明且带有边框。仅在 md 模式下可用。
属性fill
类型"outline" | "solid" | undefined
默认值undefined

interface

描述select 应使用的界面:action-sheetpopoveralertmodal
属性interface
类型"action-sheet" | "alert" | "modal" | "popover"
默认值'alert'

interfaceOptions

描述alertaction-sheetpopover 界面可以接受的任何其他选项。请参阅 ion-alert 文档ion-action-sheet 文档ion-popover 文档 以及 ion-modal 文档,了解每个界面的创建选项。

注意:interfaceOptions 不会覆盖 alert 接口中的 inputsbuttons
属性interface-options
类型any
默认值{}

justify

描述如何在同一行中排列标签和 select。当 labelPlacement 设置为 "floating""stacked" 时,justify 不适用于标签和 select 在不同行上的情况。"start":标签和 select 将在 LTR 中显示在左侧,在 RTL 中显示在右侧。"end":标签和 select 将在 LTR 中显示在右侧,在 RTL 中显示在左侧。"space-between":标签和 select 将显示在行的两端,两元素之间留有间距。
属性justify
类型"end" | "space-between" | "start" | undefined
默认值undefined

label

描述与 select 关联的可见标签。

如果您需要呈现纯文本标签,请使用此属性。

如果同时使用 label 属性和 label 插槽,则 label 属性将优先于 label 插槽。
属性label
类型string | undefined
默认值undefined

labelPlacement

描述标签相对于 select 的放置位置。"start":标签将在 LTR 中显示在 select 的左侧,在 RTL 中显示在右侧。"end":标签将在 LTR 中显示在 select 的右侧,在 RTL 中显示在左侧。"floating":当 select 获得焦点或具有值时,标签将显示得更小并在 select 上方显示。否则,它将显示在 select 的顶部。"stacked":无论 select 是否处于模糊状态或没有值,标签都将显示得更小并在 select 上方显示。"fixed":标签的行为与 "start" 相同,但它还具有固定宽度。长文本将用省略号 ("...") 截断。当使用 "floating""stacked" 时,我们建议使用 valueplaceholder 初始化 select。
属性label-placement
类型"end" | "fixed" | "floating" | "stacked" | "start" | undefined
默认值'start'

mode

描述模式决定使用哪种平台样式。
属性mode
类型"ios" | "md"
默认值undefined

multiple

描述如果为 true,则 select 可以接受多个值。
属性multiple
类型boolean
默认值false

name

描述控件的名称,与表单数据一起提交。
属性name
类型string
默认值this.inputId

okText

描述要在确定按钮上显示的文本。
属性ok-text
类型string
默认值'OK'

placeholder

描述select 为空时显示的文本。
属性placeholder
类型string | undefined
默认值undefined

selectedText

描述要显示的文本,而不是选定选项的值。
属性selected-text
类型null | string | undefined
默认值undefined

shape

描述select 的形状。如果为 "round",则将具有更大的边框半径。
属性shape
类型"round" | undefined
默认值undefined

toggleIcon

描述要使用的切换图标。对于 ios 模式默认为 chevronExpand,对于 md 模式默认为 caretDownSharp
属性toggle-icon
类型string | undefined
默认值undefined

value

描述select 的值。
属性value
类型any
默认值undefined

Events

Name描述Bubbles
ionBlurselect 失去焦点时发出。true
ionCancel选择取消时发出。true
ionChange值更改时发出。

以编程方式设置 value 属性时,此事件不会发出。
true
ionDismiss覆盖层关闭时发出。true
ionFocusselect 获得焦点时发出。true

Methods

open

描述打开 select 覆盖层。覆盖层是警报、操作表或弹出窗口,具体取决于 ion-select 上的 interface 属性。
Signatureopen(event?: UIEvent) => Promise<any>

CSS Shadow Parts

Name描述
container选定文本或占位符的容器。
iconselect 图标容器。
label描述 select 的标签文本。
placeholder没有值时在 select 中显示的文本。
textselect 的显示值。

CSS Custom Properties

Name描述
--backgroundselect 的背景
--border-colorselect 边框的颜色
--border-radiusselect 边框的半径。当使用 fill="outline" 时,较大的半径可能显示不均匀;如果需要,请改用 shape="round" 或增加 --padding-start。
--border-styleselect 边框的样式
--border-widthselect 边框的宽度
--highlight-color-focusedselect 获得焦点时高亮的颜色
--highlight-color-invalidselect 无效时高亮的颜色
--highlight-color-validselect 有效时高亮的颜色
--highlight-heightselect 高亮的高度。仅适用于 md 模式。
--padding-bottomselect 底部填充
--padding-end如果方向为从左到右,则为 select 的右侧填充;如果方向为从右到左,则为左侧填充
--padding-start如果方向为从左到右,则为 select 的左侧填充;如果方向为从右到左,则为右侧填充
--padding-topselect 顶部填充
--placeholder-colorselect 占位符文本的颜色
--placeholder-opacityselect 占位符文本的不透明度
--ripple-colorMD 模式下波纹效果的颜色。

Slots

Name描述
end在 select 的尾部边缘显示的内容。
label与 select 关联的标签文本。使用 labelPlacement 属性来控制标签相对于 select 的放置位置。如果您需要呈现带有自定义 HTML 的标签,请使用此属性。
start在 select 的头部边缘显示的内容。