Uniapp之键盘弹窗

适用范围

  1. 评论输入框
  2. 自定义键盘顶部工具栏
  3. 其他吸附于键盘顶部的弹框

意义

对于输入框来说,一般都包含自动抬高输入框,但是对于一些自定义窗口来说(比如输入框下添加工具栏、键盘顶部添加工具栏等),就需要自己处理弹框位置了,那么这个时候键盘弹窗就解决了复杂的处理。

示例

下面示例用于展示 keyboard-popup 使用示例,当 textarea 聚焦时,textarea 就会自动抬高到键盘上方。

html 复制代码
<template>
  <!-- 评论输入框 -->
  <!-- 注意这里需要添加adjustPosition=false属性来关闭自动上推页面 -->
  <keyboard-popup ref="replyPopup">
    	<textarea
        ref="textarea"
        v-model="content"
        placeholder="请输入内容"
        focus
        auto-focus
        maxlength="500"
        :style="{height: '160rpx'}"
        :adjustPosition="false"
        :showConfirmBar="false">
        </textarea>
  </keyboard-popup>
</template>
<script>
export default {
  data() {
    return {
      content: ''
    }
  },
  methods: {
    openPopup() {
      // 打开弹窗
      this.$refs.replyPopup.open()
    },
    openPopup() {
      // 关闭弹窗
      this.$refs.replyPopup.colse()
    }
  },
  mounted() {
    // 监听键盘高度变化,用于抬高评论框
    this.$refs.replyPopup.handleKeyboardHeightChange()
  },
  onUnload() {
    // 取消键盘高度变化监听
    this.$refs.replyPopup.offKeyboardHeightChange()
  },
}
</script>

源码

以下是 KeyboardPopup 组件的源码,可根据自己的需求加以改进。

html 复制代码
<script>
export default {
  name: 'KeyboardPopup',
  props: {
    // 是否显示底部安全距离
    showSafeBottom: {
      type: Boolean,
      default: true
    }
  },
  data() {
    return {
      showVal: false,
      keyboardHeight: 0,
      isOpen: false,
      safeAreaInsetBottom: 0
    }
  },
  methods: {
    open() {
      this.showVal = true
      this.$nextTick(() => {
        this.isOpen = true
      })
    },
    close() {
      this.isOpen = false
      this.showVal = false
    },
    onClose() {
      this.isOpen = false
      this.showVal = false
      this.$emit('close')
    },
    /**
     * 设置键盘高度,用于设置内容抬高的位置
     * @param height 高度
     */
    setKeyboardHeight(height) {
      this.keyboardHeight = height
    },
    handleKeyboardHeightChange() {
      uni.onKeyboardHeightChange(res => {
        this.keyboardHeight = res.height
      })
    },
    offKeyboardHeightChange() {
      uni.offKeyboardHeightChange()
    }
  },
  mounted() {
    // 获取底部安全距离
    if (this.showSafeBottom) {
      this.safeAreaInsetBottom = uni.getSystemInfoSync().safeAreaInsets.bottom
    }
  }
}
</script>

<template>
  <u-popup :show="showVal" @close="onClose" bgColor="transparent" :safeAreaInsetBottom="false" closeOnClickOverlay>
    <view class="content-container" :style="{bottom: keyboardHeight + 'px'}">
      <slot :isOpen="isOpen"></slot>
    </view>
    <!--  底部安全距离  -->
    <view class="safeBottom" v-if="!isOpen" :style="{height: safeAreaInsetBottom + 'px'}"></view>
  </u-popup>
</template>

<style scoped lang="scss">
.content-container {
  position: relative;
}

.safeBottom {
  width: 100%;
  background-color: #fff;
}
</style>
相关推荐
颜进强1 分钟前
从零搭建私人 RAG 知识库:让项目决策真正“可检索、可追溯”
前端·后端·ai编程
颜进强3 分钟前
Embedding 模型介绍:热门模型对比与应用场景
前端·后端·ai编程
颜进强5 分钟前
LanceDB 基础使用:用 TypeScript 完成第一次向量检索
前端·后端·ai编程
xyphf_和派孔明6 分钟前
企业级微前端项目完整创建步骤,第二步:配置主应用
前端
默_笙11 分钟前
🔑 让 AI 学会"读"网页:我用 Cheerio 爬了一篇掘金文章,然后切成小块存进了向量库
前端·javascript
颜进强12 分钟前
Ollama 从入门到实践:本地模型运行、API 调用
前端·后端·ai编程
颜进强16 分钟前
Embedding 基础使用:用 Ollama 和 LangChain.js 生成文本向量
前端·后端·ai编程
颜进强21 分钟前
Vector Store 入门:什么是向量数据库,主流产品如何选择
前端·后端·ai编程
方方洛40 分钟前
AI 教程系列-TUI 应用开发教程14-技能系统与可扩展性
前端·javascript·typescript
方方洛44 分钟前
AI 教程系列-TUI 应用开发教程05-大模型对话界面设计
前端·javascript·typescript