Textarea 使用手册
v1.0.2 · @snowui-design-system/components
许可阅读:首次阅读组件文档、源码或 npm 使用流程,先读完整 LICENSE;同任务同版本去重。公开 API 配置与内部实现修改分别按许可处理;全部组件使用统一运行包,源码权益以许可为准。
组件介绍
提供多行文本输入,可承接原生表单属性并组合字段反馈,适合描述、备注和较长内容的编辑。
使用选择
用于多行文本输入,单行用 Input。标签、帮助和错误组合 Field;不要把普通展示文本放进只读输入框来模拟布局。
bind:value 同步文本;defaultValue 只在 value 未定义时回退,表单重置需恢复绑定值。
resize 控制调整方向;readonly / disabled 或 resize="none" 时不提供调节手柄。name 用于表单提交。
快速开始
以下示例展示推荐的基本组合。更多场景与组合限制见后文。
API
未重新声明的继承能力请查所属基础组件文档;本表只列本组件源码具名公开属性。
使用边界与详细说明
内置组件双模式
parts.Indicator:统一配置 resize 模式下的内置 Indicator。Textarea value、invalid、disabled 与输入事件属于父组件受控协议。
2026-04-04 补充: 参考 Figma 10109:19152,Textarea 是表单系列里的单独例外:单独使用时默认内容留白为 top 12 / right 16 / bottom 24 / left 16。进入 Field 后,只看有没有 as="segment";未标 segment 时由外层 Field 处理默认 12 / 16 与 gap = 8,Textarea 去掉组件自身 padding,但保留自身 gap;标了 segment 时保留 Textarea 自身的 padding 与 gap。右下角使用统一 Indicator appearance="corner";字符计数器默认不显示,传入 maxCount 后在 hover 到组件时显示计数,超限时持续显示。 2026-04-09 补充: Textarea 右下角保留区(含缩放图标与计数器)始终存在;默认要求是 right = 16px、bottom = 0,不得贴边。 2026-04-24 补充: Textarea 使用与 Listbox 一致的自定义浮层滚动条:原生滚动条隐藏,thumb 覆盖在内容之上,不占布局宽度;默认宽 4px,hover 到 thumb 后从右向左变为 8px,右边缘距容器右边框 4px,轨道透明并支持拖拽。 2026-05-26 补充: Textarea 的顶部/底部滚动渐隐改为复用 layout.css 的 .snowui-scroll-mask 通用能力(即「内容渐隐层」基础共享能力的 CSS 静态形态,能力总览见 ../lib/edge-fade.md(源码参考:components/src/lib/edge-fade.md)),在原生 <textarea> 上通过 data-scroll-mask 驱动 mask-image,不再绘制可见渐变色块。
继承: 复用 Frame.svelte 的所有通用能力(状态、动效、响应式、Skeleton、样式编排)。 推荐容器: Field.svelte。 默认能力开关: enableResponsive=false, enableContext=true, enableScaleObserver=false。
内部原生 <textarea> 显式接入 layout.css 的 .snowui-native-control,只归一化 box sizing、margin 并继承消费环境的字体与颜色;Textarea 自身字号、行高、Padding、边框和状态视觉不依赖可选的 snowui-base.css。
布局模型
主布局模型:复合管理布局。
Textarea 的区域结构为 root host / native control / footer / Indicator corner / counter / overlay scrollbar。
进入 Field 时,Textarea 只作为多行输入宿主参与 Field 的槽位宿主布局;自身 footer、计数器、resize 与 scrollbar 仍由 Textarea 私有管理。
as="segment"只影响 Textarea 与 Field 的连续字段表面关系,不把 Textarea 改造成通用槽位容器。footer 的计数器与 Indicator 同排时优先 gap-1,并保留 4 CSS px 间距下限及较大 Token;单一附件不产生空槽。多行输入正文、计数显隐和手柄固有尺寸保持各自协议。
footer 使用内部 Pin 布局固定到
pin-bottom-right。独立模式偏移为var(--padding-1);嵌入 Field 时通过--pin-offset-x/y负值补偿 Field padding。自定义浮层滚动条复用
useOverlayScrollbar,但滚动条定位和右下角保留区属于 Textarea 私有区域结构。
表单组合与间距
基础节奏统一:
Field默认padding = 12 / 16,gap = 8Textarea单独使用时:组件自身默认内容留白为top 12 / right 16 / bottom 24 / left 16放进
Field后,先看有没有as="segment"没有
as="segment":由外层Field负责12 / 16padding 与8gap;Textarea去掉组件自身 padding,但保留自身 gap有
as="segment":这是连续字段表面的一段;保留Textarea自身的 padding 与 gapsegment之间才有分割线:横向是左右分割线,纵向是上下分割线相邻
segment之间只能有一条分割线,不能重复画线label / description / error不负责 padding、gap、分割线,它们只是内容元素普通
label + host + error:不作为 padding、gap 的判断依据,只负责文字内容Field row或Field column里,如果是连续输入段,子项要显式写as="segment"
组件定位
Textarea 的推荐用法是作为 Field 容器中的多行宿主:
单独使用时可保持兼容性的默认输入框表现
进入
Field上下文后,未标segment时由外层Field接管 padding;标了segment时保留Textarea自身留白适合与
Text as="label" / "error"、Frame as="row"等角色组合
Frame 能力继承
Textarea 仍然基于 Frame,因此继续支持:
responsive / stateStyle / customStates / variants / stylesHover / Click / Focus / whileAppear / timeline / orchestrateloading / skeleton / renderHintsas / use / layoutId / itemId / scope / access
组件负责的是多行文本宿主,不是放弃 Frame 通用能力。
错误反馈 Shake
Textarea invalid / aria-invalid 默认自动播放错误 shake。单独使用时由 Textarea 自身反馈;进入 Field 后,嵌入态 Textarea 不单独抖动,由外层 Field 汇总后整体反馈。
错误态与 shake 不会自动聚焦,也不会模拟 focus-within;焦点态只来自用户真实聚焦、显式 autofocus 或业务代码主动调用 focus()。
原生能力边界
Textarea 负责:
原生
<textarea>属性透传value / defaultValue解析bind:value同步resize方向控制invalid与aria-invalid汇总
Textarea 不负责:
富文本编辑
markdown 语法增强
业务指定的自动高度策略;当前组件按内容自动测高,最高约 15 行行高,手动调整高度后停止自动测高
业务级校验提示
使用示例
无障碍与表单建议
需要明确标签时,优先在
Field中显式渲染label错误提示建议通过
aria-describedby关联到宿主如果要做聊天输入框、评论框、带工具栏的富输入区,建议在
Field容器里继续组合,而不是把所有 UI 堆进Textarea本体
Textarea 样式覆盖
先阅读 完整 LICENSE;同任务、同版本、同范围去重。
优先用组件公开 Props 匹配合适样式,尽可能保留原有视觉。确需改写时按 样式选择与改写顺序 使用自己的 class(含项目已有 Tailwind)或实例 style。以下名称来自源码实际消费的公开 override;先核对目标作用域,不修改私有 DOM。采用 SnowUI Token 时选择正确类别,外部应用不被要求安装一方 utilities。
Textarea 类型与状态
必填属性:无具名必填属性。
可双向绑定:bind:value、bind:exceeded。
继承声明:Omit<FrameProps, "children" | "tag">。继承能力以基类公开文档为准;Omit 中的字段已排除,不能按基类原样使用。
以下为公开属性实际引用的类型声明,来自源码;Svelte Snippet 表示内容片段,ComponentProps 表示对应组件的 Props。
ComponentPartsOf
来源:components/src/logic/component-parts.svelte.ts
ConfigurableComponentPartProps
来源:components/src/logic/component-parts.svelte.ts
ComponentPartControlledKey
来源:components/src/logic/component-parts.svelte.ts
外部类型来源:
HTMLTextareaAttributes — svelte/elements