InputNumber 数字输入框
数字输入组件:内层为文本输入 + 数字键盘(inputmode="decimal"),带步进按钮、范围约束与格式化显示,role="spinbutton" 提供完整的数值 aria 状态。
基础用法
基础用法
placeholder 透传内层输入框作为占位提示;未设置 label 时占位文本同时参与可访问名称回退链(见下方 label 一节)。
范围与步长
min / max / step
到达边界时对应步进按钮自动禁用。键入越界值不会打断逐位输入(先输 1 再补 00 凑 100 不受影响),失焦时矫正到范围内并临时以红边提示越界(见「校验态与越界提示」)。
精度
precision
precision 同时控制显示与提交值的小数位数:1.5 显示为 1.50,步进与失焦矫正后保持两位小数。
尺寸
size(sm / md / lg)
size 三档对齐全局控件 token(--oas-control-height-* / --oas-font-size-*),默认 md。
步进按钮形态
controls 显隐与 controls-position 位置
controls默认显示步进按钮;controls="false"隐藏(键盘 ↑↓ 步进仍然可用)controls-position="right"(默认):输入框右侧上下箭头controls-position="both":两侧- / +大按钮,触屏计数器场景更友好
按住步进按钮 800ms 后进入连击:每 100ms 自动步进一次,松手即停(内置行为,无需配置)。
前后缀
prefix / suffix
prefix-text / suffix-text 为输入框内嵌装饰文案(不参与数值解析);也支持同名插槽分发任意内容:<span slot="prefix">…</span>。prefix / suffix 为兼容别名(规范名 prefix-text / suffix-text),attribute 与 property(React / Vue 绑定)两条通道均可用。
clearable + 步进钮 + 后缀叠加
clearable / 步进钮 / 前后缀可任意叠加:右侧元素按「后缀 → 清除钮 → 步进钮区」自左向右排布,全部内嵌在输入框内,输入文字按叠加总宽自动让位(controls-position="both" 时清除钮/后缀在框内让开右侧 + 钮)。
千分位与格式化(声明式)
grouping 千分位
format 货币 / 百分比 / 单位
grouping:千分位分组显示(解析时自动剥离分组符)format:Intl 风格声明式格式——percent(比率语义:0.15显示15%)、currency:USD、unit:GB等,跟随宿主 locale- 格式化后的可读文本会同步到
aria-valuetext,读屏朗读格式化结果
格式化(函数式)
formatter / parser 函数 property
attribute 传不了函数,复杂格式通过 JS property 成对设置(优先于声明式格式属性):
el.formatter = (v) => `≈ ${v.toLocaleString()} 件`
el.parser = (s) => Number(s.replace(/[^0-9.\-]/g, ''))parser 返回非有限数按非法输入处理(失焦还原上一个有效值)。上方示例的 formatter / parser 在本页底部统一的脚本块中挂接。
空值与可清空
clearable 与空值语义
「未填」≠「0」:value 为空串(或未设置)时是空值态,oas-change 派发 detail.value === null,表单序列化为空串。输入数值后出现清除按钮,一键回到空值态(派发 oas-clear + oas-change null)。空值时步进从 min(设了 min 时)或 0 起步。
校验态与越界提示
status 与越界临时红显
status 三态(error / warning / success)控制边框语义色,用于表单校验联动。第四个示例:键入 200 观察越界临时红边(不打断输入),失焦自动矫正回 100。
严格步进
step-strictly
step-strictly 开启后,提交时值吸附到最近的 step 倍数(整箱 / 整打采购场景):键入 7 失焦后变为 12,键入 5 变为 0。
只读
readonly
readonly 与 disabled 语义分立:可聚焦、可复制、值可提交,但步进按钮禁用、键盘与滚轮不改变值(aria-readonly 同步)。
滚轮步进
wheel(默认关闭)
设置 wheel 后聚焦输入框时滚轮步进(上滚增、下滚减),并阻止页面滚动;默认关闭以防误触。
指针微调(scrub)
按住数字区横向拖动(scrub)+ Shift/Alt 精调
数字区支持指针微调(scrub):按住输入框横向拖动,每 4px 计一步(步长 = step),密集调参时不必精确点按或键入。修饰键与 knob 同一口径:Shift 精调(×0.2)、Alt 超精调(×0.04),不引入加速档;拖回按下位置即恢复原值(误拖无损撤销);位移不足一步视为普通点击(聚焦与文本选择不受影响)。松手按提交制写回(oas-change,值未变化不派发),拖动过程派发 oas-input。
触屏(coarse pointer)不启用 scrub(点按即聚焦弹键盘,文本键入优先);CSS 已放行纵向触摸滚动(touch-action: pan-y),横向位移才进入 scrub。需要完全关闭时设 scrub="false"。
禁用
禁用
无障碍名称(label)
label(可访问名称)
label 作为输入框的可访问名称(aria-label):设置后读屏朗读该名称;未设置时依次回退 placeholder → 内置文案「数字输入框」。步进按钮「增加 / 减少」的可访问名称同样走内置文案。
小数分隔符(decimal-separator)
decimal-separator(缺省 locale 感知)
decimal-separator 指定小数点字符(默认取运行环境 locale 的小数分隔符,与 Intl 格式化同源)。左侧为 locale 默认,右侧显式设为逗号:显示、键入解析与提交值三者一致——右侧键入 2,5 提交 2.5,失焦后回显 2,5。监听 oas-change 可读回提交的数字值。
形态(variant)
variant 三态
variant 支持 outlined(默认描边)/ filled(填充底色、聚焦才出边框)/ borderless(无框无底色),语义与 oas-input 变体一致;controls-position="both" 时两侧 −/+ 按钮同档跟随形态。
对齐(align)
align 数字对齐
align 控制数字文本对齐(left / center / right)。为 RTL 安全,映射为逻辑 text-align: start/end:left / right 在 dir="rtl" 下自动镜像为行首/行尾;未设置时使用浏览器默认(start,LTR 下即左对齐)。
自动聚焦(autofocus)
autofocus(挂载后聚焦内层输入)
autofocus 在挂载后把焦点转发给 shadow 内层输入(原生 autofocus 不穿透 shadow DOM),页面/表单打开即可直接键入。为避免文档页加载即抢焦点,这里由按钮动态创建带 autofocus 的组件演示。
事件
change / clear / focus / blur / input
oas-change:失焦 / Enter / 步进 / 滚轮 / 清空时触发,detail: { value },value为数字或null(空值)oas-clear:清除按钮点击oas-focus/oas-blur:内层输入聚焦/失焦时派发,detail: { value }为当前已提交值(数字或null;blur 在提交后派发,携带提交后的新值)oas-input:键入过程实时派发,detail: { value }为当前显示文本(string,未提交语义,格式化场景含装饰字符)
required 必填
required 必填(原生校验链)
required 驱动原生校验链(form-associated):未填时 checkValidity() 为 false(valueMissing),原生表单提交被阻止;填写后自动恢复 :valid。
程序性读/写当前值走公开 value property:el.value 读取——FormData 口径(内部 input 在场读实时解析值,空值/非法键入为空串);el.value = x 写入——写受控 value 属性并强制回显(无视聚焦保护),不派发事件。
API
oas-input-number
属性
| 属性 | 说明 | 类型 | 默认值 |
|---|---|---|---|
align | 数字文本对齐 left/center/right(逻辑映射,RTL 镜像) | string | — |
autofocus | 挂载后聚焦内层输入(原生 autofocus 不穿透 shadow) | boolean | — |
clearable | 有值时显示清除按钮(一键回空值态) | boolean | — |
controls | 步进按钮显隐(缺省显示;controls="false" 隐藏,键盘 ↑↓ 仍可步进) | — | — |
controls-position | 按钮位置:right(默认,右侧上下箭头)/ both(两侧 −/+,触屏计数器形态) | — | — |
decimal-separator | 小数点字符(显示与键入解析用;缺省 locale 感知,提交值仍规范数字串) | string | — |
disabled | 禁用 | boolean | — |
format | Intl 风格声明式格式:percent(0.15→15%)/ currency:USD / unit:GB,跟随宿主 locale | string | — |
grouping | 千分位分组显示(解析时自动剥离分组符) | boolean | — |
label | 可访问名称(aria-label 来源,未设时回退内置文案「数字输入框」) | string | — |
max | 范围,越界自动钳制 | string | — |
min | 范围,越界自动钳制 | string | — |
placeholder | 占位文本(参与 aria-label 回退链) | string | — |
precision | 小数位数 | string | — |
prefix-text | 内嵌前缀文案(slot="prefix" 可分发任意内容,不参与数值解析) | string | — |
readonly | 只读:可聚焦可复制可提交,按钮禁用 + aria-readonly,键盘/滚轮不改值 | boolean | — |
required | 必填标记(驱动原生校验链 valueMissing;不透传内层 input) | boolean | — |
scrub | 数字区指针微调(scrub,默认开启):按住输入框横向拖动,每 4px 计一步(步长 = step);Shift 精调(×0.2)、Alt 超精调(×0.04);拖回按下位置恢复原值;位移不足一步视为普通点击(保留键入/文本选择);松手按提交制写回(oas-change);scrub="false" 关闭;触屏(coarse pointer)不启用 | string | true |
size | 尺寸档位 sm / md(默认)/ lg:控高与字号联动 | — | — |
status | 校验态:error / warning / success 边框语义色 | — | — |
step | 步长 | string | 1 |
step-strictly | 严格步进:提交值吸附最近 step 倍数 | boolean | — |
suffix-text | 内嵌后缀文案(slot="suffix" 同上) | string | — |
value | 当前值(受控) | string | — |
variant | 形态 outlined/filled/borderless(对齐 input) | string | — |
wheel | 聚焦时滚轮步进(上增下减;默认关防误触) | boolean | — |
Property(JS property;是否写回 attribute 见各行说明)
| Property | 说明 | 类型 | 默认值 |
|---|---|---|---|
value | 当前值:实时解析后的数字串(空值 / 非法键入为空串) | string | — |
事件
| 事件 | 说明 |
|---|---|
oas-blur | 失焦时派发(提交后),detail: { value } 携带提交后的新值 |
oas-change | 步进或失焦变化,detail: { value }(数字;空值态为 null) |
oas-clear | 点击清除按钮时派发(值回空值态),detail: {} |
oas-focus | 聚焦时派发,detail: { value }(当前已提交值) |
oas-input | 键入实时派发,detail: { value } 为当前显示文本(未提交) |
插槽
| 名称 | 说明 |
|---|---|
prefix | 前缀内容插槽(不参与数值解析) |
suffix | 后缀内容插槽(不参与数值解析) |
CSS 变量
| CSS 变量 | 默认值 |
|---|---|
--oas-button-group-radius | var(--oas-radius-md) |
--oas-input-number-controls-pad | 28px |
--oas-input-number-font | var(--oas-font-size-md) |
--oas-input-number-height | var(--oas-control-height-md) |