Hector同学
Hector同学
  • 发布:2026-07-21 19:41
  • 更新:2026-07-21 19:42
  • 阅读:17

每个页面实例首次软键盘弹出时会额外原生上推视口一次,且 adjustPosition/softinputMode 均无效

分类:uni-app

[app-harmony] webview 每个页面实例首次软键盘弹出时会额外原生上推视口一次,且 adjustPosition/softinputMode 均无效

问题分类

app-harmony(鸿蒙 App)/ 软键盘 / webview 渲染

环境信息

  • 编译器:HBuilderX(版本请补充:帮助 → 关于)
  • 项目类型:uni-app(Vue3 组合式 API),编译目标 app-harmony
  • 鸿蒙设备:HarmonyOS 5.0(compatibleSdkVersion 5.0.0(12)),真机
  • 渲染层:ArkWeb webview

现象

在每个页面(webview 实例)首次弹出软键盘时,系统会把整个 webview 视口原生上推约一个键盘高度(类 adjustPan 行为),此行为:

  1. 无视 textarea/input 的 :adjust-position="false"——组件已显式关闭避让,视口仍被上推;
  2. 无视 pages.json 页面 style 的 "app-harmony": { "softinputMode": "adjustResize" }——配置后行为无任何变化;
  3. JS 层完全不可观测——上推期间 window.scrollX/scrollY 始终为 0(renderjs 中以 50ms 轮询实测),无法检测也无法用 scrollTo 撤销,推断为原生层视口平移而非 DOM 滚动;
  4. 仅每个 webview 实例的首次键盘弹起发生一次——失焦后视口复位,同一页面实例内后续聚焦不再上推;退出页面再进入(新 webview 实例)后又会复现一次。

造成的业务问题

我们的聊天输入条采用社区通用方案:adjust-position:false + 监听 @keyboardheightchangetransform: translateY(-键盘高度) 抬升输入条(微信小程序 / iOS / Android 三端一致可用;Android 基座已改 adjustResize 并停用 JS 抬升)。

在鸿蒙上,页面首次聚焦时「系统原生上推一个键盘高度 + JS 抬升一个键盘高度」叠加,输入框被顶到屏幕上部约两个键盘高度处,页面内容被顶出可视区;同一页面后续聚焦(系统不再上推)则表现正常。用户每次进入页面的第一次输入都会遇到明显异常。

复现步骤(最小化)

  1. 新建 uni-app Vue3 项目,页面底部放置 <textarea :adjust-position="false" @keyboardheightchange="onKb" />onKb 中对输入条容器施加 transform: translateY(-height px)
  2. 编译运行到鸿蒙真机;
  3. 进入页面后第一次点击 textarea 聚焦:输入条被抬升约两个键盘高度(系统上推 + transform 叠加);
  4. 收起键盘再次聚焦:仅 transform 生效,位置正确;
  5. 返回上一页,再次进入该页面,重复步骤 3:异常再次复现。

期望

任一即可解决:

  1. app-harmony 端尊重 adjust-position="false",不做原生视口上推;
  2. 或支持页面/全局的 softinputMode(adjustResize / adjustPan)配置,行为与 Android 端对齐;
  3. 或至少保证同一 webview 实例内行为一致(当前「仅首次上推」的不一致性使应用层无法做任何确定性补偿)。

已尝试且无效的规避

  • 页面 style 配置 app-harmony.softinputMode: "adjustResize":被忽略;
  • 聚焦瞬间用缓存键盘高度预抬升(抢在系统判定前让输入框可见):原生上推决策早于 JS 渲染上屏,无效;
  • renderjs 监听 focusin 并轮询回写 window.scroll:上推不体现在 window.scroll,检测不到;
  • 页面打开时程序化聚焦/失焦「预热」消耗首次上推:键盘可见闪动,用户体验不可接受。
2026-07-21 19:41 负责人:无 分享
已邀请:
Ask小助手

Ask小助手 - Ask社区AI助手

欢迎到专业群( uni-app鸿蒙化技术交流群 ) 咨询,群中有相关专业的管理员和群友。

根据知识库中的信息,您遇到的鸿蒙端 webview 首次软键盘弹出时原生上推视口、adjust-positionsoftinputMode 均无效的问题,属于已知问题范畴。

问题确认与参考

在 ISSUE 系统中有一条相关记录:鸿蒙输入框弹出后,会在底部留白。该 ISSUE 描述了鸿蒙真机中使用输入框时,设置 :adjust-position="false" 后页面仍被上推且不还原的现象,官方已确认复现,并说明预计下个版本修复,同时提供了临时解决方案——通过替换 har 包来缓解:

替换方式:把 har 包放到 harmony-configs/libs 目录下

您可以尝试按照该 ISSUE 中提供的方式替换 har 包,看是否能改善首次上推的行为。

关于配置项说明

  1. softinputMode(支持 adjustResizeadjustPan)在知识库中明确记载为 App(Android/iOS)平台 的配置项,配置路径为 pages.json -> style -> app-plus -> softinputMode。知识库中未找到 app-harmony 节点下支持 softinputMode 配置的依据,因此您在 app-harmony 下配置该字段被忽略是符合当前知识库记载的。

  2. adjust-position 属性在鸿蒙端 webview 渲染下的行为,目前知识库中未找到与 Android/iOS 完全对齐的说明。从 ISSUE 记录来看,鸿蒙端对该属性的支持存在已知缺陷。

建议

  1. 优先尝试 ISSUE 中提供的 har 包替换方案,确认是否能解决首次上推问题;
  2. 如果 har 包方案无法完全解决您描述的"仅首次上推、后续正常"的现象,建议您在 ask 社区或通过 HBuilderX 的"提 bug"入口提交一个新 ISSUE,附上最小复现工程和详细操作步骤,方便官方跟进。提交时可以引用上述已有 ISSUE 作为关联参考;
  3. 在官方修复之前,如果业务上需要规避"系统上推 + JS 抬升"叠加的问题,可以考虑在鸿蒙端(通过条件编译 #ifdef APP-HARMONY)临时禁用 JS 层的 transform 抬升逻辑,仅依赖系统默认行为,待修复后再恢复统一方案。
内容为 AI 生成,仅供参考

要回复问题请先登录注册