auto-height仅在微信、支付宝、百度等小程序端原生生效,H5和App端无效,必须手动监听@input并用boundingClientRect动态计算高度,且需绑定max-height样式才有效。

直接用 auto-height 属性就行,但仅限小程序端;H5 和 App 端必须手动计算高度,否则会出现闪动、撑开错位或 max-height 失效。
textarea auto-height 在哪些平台生效?
auto-height 是 uni-app 官方提供的原生属性,但它有明确的平台限制:
- 微信/支付宝/百度等小程序:✅ 原生支持,设了就自动撑高,无需 JS 干预
- H5:❌ 完全不生效,
auto-height被忽略,必须自己监听@input+createSelectorQuery - App(iOS/Android):❌ 同样无效,即使写了也当没写,强行依赖会导致 H5 和 App 表现不一致
别被文档里“支持所有平台”的模糊描述误导——实际运行时,只有小程序真能靠它跑通。跨端项目必须按平台分路径处理。
为什么用 offsetHeight 或 clientHeight 计算会不准?
因为 textarea 渲染后的真实视觉高度 ≠ DOM 元素的 offsetHeight,尤其在设置了 padding、border、字体缩放或行高之后,浏览器计算逻辑和 uni-app 的渲染层存在偏差。
正确做法是用 boundingClientRect 获取渲染后的实际尺寸:
- 必须加
.in(this)绑定组件作用域,否则查不到节点 - 不能在
@input回调里立刻查——内容刚更新,DOM 还没重绘,要加setTimeout(() => {}, 0)或nextTick - 返回的
data.height是含padding的真实像素值,可直接赋给:style="{ height: data.height + 'px' }"
示例关键片段:
onInput() {
setTimeout(() => {
uni.createSelectorQuery()
.in(this)
.select('textarea')
.boundingClientRect(res => {
if (res) this.textareaHeight = Math.max(40, res.height);
})
.exec();
}, 0);
}max-height 怎么才真正起作用?
光在 CSS 里写 max-height: 200px 没用:auto-height 开启时它被绕过,手动绑定 height 时又被内联样式覆盖优先级。
必须用动态 style 绑定:
:style="{ height: textareaHeight + 'px', 'max-height': '200px' }"- 不能只写
max-height,必须同时控制height,否则 iOS 上会突然跳变或卡住 - 注意单位统一:rpx 会随屏幕缩放失准,建议全部用 px
另外,textarea 的 rows 属性在 uni-app 中基本无效,别指望靠它做高度兜底。
App 端键盘弹起时底部输入框上移错位怎么办?
不是输入框没动,是整个 web-view 容器没跟着缩高 —— 尤其在嵌套 web-view 的场景下,H5 页面里的 textarea 被键盘挡住,是因为原生容器高度没变。
解法只有一个:改 webview-styles:
- 键盘弹起时,设
webview-styles.height = `calc(100vh - ${keyboardHeight}px)` - 键盘收起时,还原为
webview-styles.height = ''(空字符串,不是'100%') - 同时同步处理
webview-styles.top:加上statusBarHeight,否则安卓状态栏区域会白一块 - 安卓虚拟导航键高度要扣减:
realKeyboardHeight = res.height - (screenHeight - windowHeight)
这个逻辑必须放在原生层响应,纯 H5 的 scrollIntoView 或 focus 在 App 端大概率失效。
最易被忽略的是:H5 和 App 的 textarea 高度计算必须走两套逻辑,且 web-view 场景下连键盘高度都要从原生回调里拿,前端自己监听 resize 或 focus 基本不可靠。


















