Skip to content

输入框 Input

单行文本输入。标签、提示与错误的写法见表单字段

状态

examples/input/states.html
html
h-11 w-full rounded-lg border border-input bg-background px-3.5 text-sm text-foreground transition-colors
placeholder:text-muted-foreground
focus:border-brand focus:ring-3 focus:ring-ring/20 focus:outline-none
disabled:cursor-not-allowed disabled:bg-muted disabled:text-muted-foreground
aria-invalid:border-destructive aria-invalid:focus:ring-destructive/20

常见类型

选对 typeinputmodeautocomplete,手机上会弹出合适的键盘,浏览器也能正确自动填充。

examples/input/types.html
内容属性
邮箱type="email" autocomplete="email"
手机号type="tel" inputmode="numeric" autocomplete="tel-national"
验证码使用验证码输入组件
日期使用日期选择组件,不用 type="date"(各浏览器外观与格式不一致)
金额inputmode="decimal",数字使用 font-mono
证件号autocomplete="off" spellcheck="false"font-mono uppercase

前后缀与操作

examples/input/addons.html
  • 前置图标:外层 relative,图标 absolute left-3.5,输入框改为 pl-10
  • 后缀单位:absolute right-3.5,输入框改为 pr-14
  • 输入框 + 按钮:flex gap-2,按钮同为 44px 高,输入框加 min-w-0 防止撑破

交互脚本

属性作用
data-cb-digits只保留数字,粘贴的空格、横线会被去掉
data-cb-countdown="60"点击后禁用按钮并倒计时,data-countdown-text="{s} 秒后重发" 定义倒计时文案
data-cb-countdown-manual点击时不自动开始,接口成功后调用 CbtisUI.startCountdown(button)

使用建议

推荐

  • 输入框宽度与预期内容长度匹配,但在移动端一律通栏
  • placeholder 只写示例(「例如:CHAN」),不写说明

避免

  • 用 placeholder 代替标签
  • 禁止粘贴(尤其是邮箱确认、验证码)

无障碍

  • 禁用的输入框不会被提交也不能聚焦;只读但需要被读到的内容用 readonly
  • 自动填充:Chrome / Safari 自动填充时可能不触发 input 事件,Vue 等框架中需要额外监听 change / animationstart(v2 的 TextInput.vue 已处理)

与 v2 的差异

v2 现状规范
焦点环 ring-2 ring-ring/30,按钮是 ring-3 ring-ring/50,两套表单控件统一 ring-3 ring-ring/20 + 品牌蓝描边
没有禁用样式增加 disabled:bg-muted
样式在 TextInput.vuekyc/classes.tsmodel.ts 各写一份以本页类名为准