移动端 H5 接 AI 对话,软键盘弹起把输入框顶飞了

这篇专门记一个移动端的经典坑:软键盘。做过 H5 聊天界面的应该都被它折磨过,我接 AI 对话框的时候又栽了一次。

现象

页面布局很常规:上面一个滚动的消息列表,底部一个 fixed 的输入框。PC 上完美。一到手机上,点输入框,软键盘弹起来------

  • iOS Safari 上,底部 fixed 的输入框直接被顶到屏幕中间,飘着,下面一大片空白还能看到背景。
  • 安卓部分机型上,输入框倒是没飘,但消息列表没跟着往上推,最新消息被键盘盖住了,用户看不到 AI 刚回的话。

体验稀碎。

原因

简单说,iOS 的 position: fixed 在键盘弹起时不靠谱,它不会随着可视区域收缩重新定位,而是相对一个"假的"视口。安卓各家 webview 对键盘弹起是 resize 还是 overlay 又各有脾气,行为不统一。

我最后的解法

折腾了好几版,记两个关键点。

第一,别用 fixed 钉底,改用 flex 撑满。 外层容器 height: 100% + display: flex; flex-direction: column,消息列表 flex: 1; overflow-y: auto,输入框自然排在最下面。这样键盘把容器高度压缩时,列表区域跟着缩,输入框始终贴在缩小后的容器底部,不飘。

第二,配合 visualViewport 监听键盘。 iOS 上拿 window.visualViewport.height 才是键盘弹起后真实可视高度,用它去校正容器高度:

javascript 复制代码
const vv = window.visualViewport
vv?.addEventListener('resize', () => {
  document.documentElement.style.setProperty(
    '--app-h', `${vv.height}px`
  )
})

然后容器用 height: var(--app-h, 100vh)。

第三,键盘弹起后把列表滚到底 ,否则最新消息还是可能被盖。监听到 resize 就 scrollTop = scrollHeight。

还没解决干净的

visualViewport 在一些老安卓 webview 里没有,我只能降级回 window.innerHeight 的兜底,那些机器上偶尔还是会抖一下。这块没洁癖地全解掉,先这样了。

对话本身的模型我接的讯飞 MaaS,现成 API,重心全放在端上这些破事上了。移动端聊天界面你们还踩过啥键盘坑?评论区交流。

相关推荐
Csvn11 分钟前
附录 A+B 主流框架速查 & 工具与资源清单
人工智能·aigc·agent
进击的横打21 分钟前
【人工智能】把经验沉淀成 Skill
人工智能
天天被压力23 分钟前
【别再到处找免费股票数据API了:官方204个接口,32篇一次讲透 #02】涨停跌停与特色股池:5类股池接口一次拉全
java·人工智能·python
代码方舟32 分钟前
PHP数据工程:利用天远学历信息高级版优化专家资源池合规体验
人工智能
飞哥数智坊34 分钟前
ZCode 可以自己看微信小程序了
人工智能·ai编程
江润舟36 分钟前
万物|炼器 从零手搓工业级旋转目标检测网络 · 卷3 —— 核心算子锻造(三)
人工智能·深度学习
桃西西呀37 分钟前
你的 Agent 每判一次都要为大模型吐的字买单?-Laya模型帮你做判断
人工智能·llm·ai编程
品牌常新1 小时前
安防巡检机器人推荐:园区仓储楼宇怎么选
人工智能
释厄6231 小时前
多黑洞具现论·物理/生物/金融三域显化·虚拟宇宙黑洞·奇点=0 圆圈
开发语言·数据结构·人工智能·程序人生·安全威胁分析