1***@163.com
1***@163.com
  • 发布:2026-07-10 17:13
  • 更新:2026-07-10 17:14
  • 阅读:31

输入框拉起键盘时,页面底部会多出来一部分区域造成页面可滑动

分类:uni-app

使用的uniapp做的ios App 开发

在开发IM聊天功能时,输入框拉起键盘后会将页面自动上推,此处input配置中adjust-position设置为true了,造成页面自动上推
,然后客户不想要这种效果

我这里处理方式是将adjust-position设置为false,然后当键盘拉起时,获取键盘高度,再计算出设置输入框的偏移量,保持输入框再键盘上方展示,然后页面高度计算uni.upx2px(1624) - 键盘高度

然后就有如题目描述的一样,展示上有一个键盘大小的区域,造成了页面的滑动,这个高度不在页面css高度控制范围内

预期想要的效果是拉起键盘后页面不要滚动

2026-07-10 17:13 负责人:无 分享
已邀请:
Ask小助手

Ask小助手 - Ask社区AI助手

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

针对你遇到的 ios app 端 adjust-position="false" 后页面底部多出一块可滚动区域的问题,这是一个已知的常见现象。核心原因是当你禁用自动上推后,webview 本身的高度并没有改变,键盘弹出时会在 webview 下方,导致整个 webview 内容区域可以被向上滑动,从而露出底部原本被键盘遮挡的输入框。

可以尝试以下几种方案来解决这个问题:

方案一:使用 softinputMode: "adjustResize" 模式(推荐优先尝试)

这是比较推荐的解决思路。在 pages.json 中,将当前页面的软键盘弹出模式从默认的 adjustPan 改为 adjustResize

// pages.json  
{  
  "path": "pages/chat/chat", // 你的聊天页面路径  
  "style": {  
    "app-plus": {  
      "softinputMode": "adjustResize"  
    }  
  }  
}

本助手使用国产模型,生成代码可能不准确。专业的代码生成需要全球顶尖的AI Coding模型。推荐使用uni-agent

  • 原理adjustResize 模式会让软键盘弹出时挤压 webview 的高度,而不是将整个页面向上推。这样页面总高度会减少,不会出现因为键盘占位而产生的多余可滚动区域。
  • 注意事项:你之前提到 adjustResize 模式下输入框会有“闪现”问题。这个可以通过监听键盘高度,配合 css 过渡动画来优化输入框上移的体验,让视觉效果更平滑。这个方案是官方提供的能力,稳定性最好。

方案二:动态设置 webview 窗口高度

如果方案一无法满足需求,可以考虑在键盘弹出和收起时,动态地修改当前 webview 的高度。

  1. pages.json 中保持当前页面为 adjustPan 模式(或不配置,即为默认值)。
  2. 在页面中监听键盘高度变化事件。
  3. 当键盘弹出时,减少 webview 的高度(减去键盘高度);当键盘收起时,恢复 webview 高度。
// 在聊天页面中  
export default {  
  data() {  
    return {  
      originalWebviewHeight: 0  
    }  
  },  
  onReady() {  
    // 获取当前 webview 对象  
    const currentWebview = this.$scope.$getAppWebview ? this.$scope.$getAppWebview() : null;  
    if (currentWebview) {  
      this.originalWebviewHeight = currentWebview.getStyle().height;  
    }  
  },  
  methods: {  
    onKeyboardHeightChange(res) {  
      const keyboardHeight = res.height;  
      const currentWebview = this.$scope.$getAppWebview ? this.$scope.$getAppWebview() : null;  

      if (!currentWebview || !this.originalWebviewHeight) return;  

      if (keyboardHeight > 0) {  
        // 键盘弹出,减小 webview 高度  
        const newHeight = this.originalWebviewHeight - keyboardHeight;  
        currentWebview.setStyle({ height: newHeight });  
      } else {  
        // 键盘收起,恢复 webview 高度  
        currentWebview.setStyle({ height: this.originalWebviewHeight });  
      }  
    }  
  }  
}

本助手使用国产模型,生成代码可能不准确。专业的代码生成需要全球顶尖的AI Coding模型。推荐使用uni-agent

  • 原理:通过主动缩小 webview 的显示区域,为键盘腾出空间,这样页面内容区域本身就不会被撑出滚动条。
  • 注意:此方法需要处理 originalWebviewHeight 的获取时机,以及在不同机型上的兼容性。页面中有其他固定定位元素时,可能需要额外调整。

方案三:使用插件市场的专用组件

如果手动处理比较繁琐,也可以考虑使用插件市场中已封装好的组件来解决此问题。

  • x-fixed-keyboard 组件:这个组件专门用于处理键盘弹出时的固定布局问题,可以让底部输入区域智能地跟随键盘显示和隐藏,避免页面布局错乱和多余滚动条。你可以在插件市场搜索 x-fixed-keyboard 查看详情和使用方法。 x-fixed-keyboard 插件地址

关于方案二的补充说明

你之前尝试的计算高度方法(uni.upx2px(1624) - 键盘高度)可能不够精确或时机不对,导致问题。采用动态设置 webview 高度的方法时,建议直接使用获取到的当前 webview 实际高度进行计算,避免使用固定值。

内容为 AI 生成,仅供参考

要回复问题请先登录注册