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>
相关推荐
ganshenml15 分钟前
【Web】证书(SSL/TLS)与域名之间的关系:完整、通俗、可落地的讲解
前端·网络协议·ssl
这是个栗子1 小时前
npm报错 : 无法加载文件 npm.ps1,因为在此系统上禁止运行脚本
前端·npm·node.js
HIT_Weston1 小时前
44、【Ubuntu】【Gitlab】拉出内网 Web 服务:http.server 分析(一)
前端·ubuntu·gitlab
脾气有点小暴2 小时前
uniapp滚动容器冲突
uni-app
华仔啊2 小时前
Vue3 如何实现图片懒加载?其实一个 Intersection Observer 就搞定了
前端·vue.js
JamesGosling6662 小时前
深入理解内容安全策略(CSP):原理、作用与实践指南
前端·浏览器
不要想太多2 小时前
前端进阶系列之《浏览器渲染原理》
前端
g***96902 小时前
Node.js npm 安装过程中 EBUSY 错误的分析与解决方案
前端·npm·node.js
七喜小伙儿3 小时前
第2节:趣谈FreeRTOS--打工人的日常
前端
我叫张小白。3 小时前
Vue3 响应式数据:让数据拥有“生命力“
前端·javascript·vue.js·vue3