解决uni-app微信小程序底部输入框,键盘弹起时页面整体上移问题

存在问题

做了一个记录页面(类似单方聊天页),输入框在底部;当弹出键盘时,页面整体上移,页面头信息会消失不见

需要实现效果:

比如一个记录页面,需要在键盘弹出时:

  • 底部的输入框跟随键盘上弹
  • 页面头固定在顶部不动
  • 聊天信息区域(即内容区)调整高度,该区域局部滚动

在这里插入图片描述

解决方法

  • 底部输入框fixed定位在底部,使用输入框的@focus获取键盘高度,更改输入框bottom;@blur 时恢复 bottom=0
  • 使用包含页面头和内容区
    1. container的padding-bottom设置为输入框高度+输入框bottom,避免被输入框和键盘遮挡;并设置为flex column布局
    2. 头部定高(如果不定高可以不设置);
    3. 内容区设flex-grow:1,overflow-y:auto; 使其自适应高度并实现滚动;

实现代码

<template><view><view class="container" :style="{'padding-bottom': `${52+inputBottom}px`}"><view class="header">我是头部</view><scroll-view class="content" :scroll-y="true" :scroll-top="scrollTop"><view><view class="message" v-for="(item,index) in records" :key="index"><view class="message-content" v-html="item.content"></view><view class="message-time">{{item.updateTime}}</view></view></view></scroll-view></view><view class="bottom-textarea" :style="{bottom: inputBottom+'px'}"><view class="textarea-container"><textareav-model="recordInput":maxlength="-1":auto-height="true":show-confirm-bar="false":cursor-spacing="10":fixed="true":adjust-position="false"@focus="focusTextarea"@blur="blurTextarea"/></view><button @click="addRecord" class="primary-btn">记录</button></view></view>
</template><script>
export default {data() {return {records: [],recordInput: "",itemAverageHeight: 500, //每条数据平均高度,为确保能滚到底部,可以设置大一些scrollTop: 1000,inputBottom: 0,};},methods: {getList() {uni.showNavigationBarLoading();//   获取记录信息this.$api.getRecords().then((res) => {this.records = res.reverse().map((item) => ({...item,content: item.content.replace(/\n/g, "<br/>"),}));if (this.records.length > 0)this.scrollTop = this.itemAverageHeight * this.records.length;}).finally(() => {uni.hideNavigationBarLoading();});},addRecord() {const trueValue = this.recordInput.trim();this.$api.addRecord(trueValue).then(() => {this.records.push({content: trueValue.replace(/\n/g, "<br/>"),updateTime: new Date(),});this.recordInput = "";this.scrollTop = this.scrollTop + this.itemAverageHeight; //滚到底部});},focusTextarea(e) {this.inputBottom = e.detail.height;this.scrollTop += 1; //滚到底部},blurTextarea(e) {this.inputBottom = 0;this.scrollTop += 1; //滚到底部},},onLoad(options) {this.getList();},
};
</script><style lang="less">
@left-right-margin: 40rpx;
.container {width: 100vw;height: 100vh;box-sizing: border-box;padding-bottom: 52px;display: flex;flex-direction: column;.header {flex-shrink: 0;padding: 0px @left-right-margin 32rpx @left-right-margin;}.content {flex-grow: 1;overflow: auto;.message {margin: 0px @left-right-margin 32rpx;display: flex;flex-direction: column;align-items: flex-end;.message-content {width: auto;max-width: calc(100vw - 80rpx);word-wrap: break-word;box-sizing: border-box;padding: 32rpx;line-height: 48rpx;background: pink;border-radius: 16rpx 0px 16rpx 16rpx;}.message-time {line-height: 32rpx;margin-top: 16rpx;}}}
}
.bottom-textarea {position: fixed;bottom: 0px;left: 0px;right: 0px;background-color: #f2f2f2;border-top: 2rpx solid rgba(226, 226, 226, 1);padding: 6px 20px;display: flex;align-items: flex-end;.textarea-container {flex: 1;min-height: 80rpx;background: rgba(255, 255, 255, 1);border-radius: 8rpx;box-sizing: border-box;padding: 20rpx 16rpx;> textarea {max-height: 250rpx;font-size: 36rpx;color: rgba(8, 8, 8, 1);width: auto;}}> button {flex-shrink: 0;height: 80rpx;margin: 0;margin-left: 16rpx;}
}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/8855.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

还在用策略模式解决 if-else?Map+函数式接口方法才是YYDS!

本文介绍策略模式的具体应用以及Map函数式接口如何 “更完美” 的解决 if-else的问题。 需求 最近写了一个服务&#xff1a;根据优惠券的类型resourceType和编码resourceId来 查询 发放方式grantType和领取规则 实现方式&#xff1a; 根据优惠券类型resourceType -> 确定查…

数据结构 | 二叉排序树

一、数据结构定义 /* 二叉排序树 */ typedef int TreeType; typedef struct BSTNode {TreeType data;struct BSTNode* lchild, * rchild; }*BSTree, BSTNode;二、方法概览 BSTNode* CreateTreeNode(TreeType data); // 创建二叉树结点 BSTNode* InsertTree(TreeType data, BS…

5个网站帮你找到免费优质的视频素材

5个免费可商用视频素材网站&#xff0c;建议收藏&#xff01; 潮点视频 https://shipin520.com/shipin-mb/all-def-267-all-all-all-all-all-0-1.html?from_code2510 潮点视频是一个提供优质高清、无水印的视频素材网站&#xff0c;站内有大量的AE模板、PR模板、实拍素材、视…

Dinky:问题总结

一、启动时指定flink版本&#xff0c;因为dinky本身也集成了部分flink ./auto.sh start 1.12 二、数据源管理新增mysql时的url jdbc:mysql://ip:3306/dinky?useUnicodetrue&characterEncodingutf8&useSSLfalse&autoReconnecttrue&failOverReadOnlyfalse 不要…

【Java高级语法】(十三)注解:解码程序设计中的元数据利器,在小小的@符里挖呀挖呀挖~用小小的注解做强大的开发...

Java高级语法详解之注解 1️⃣ 概念2️⃣ 优势和缺点3️⃣ 使用3.1 元注解3.2 自定义注解3.3 常用内置注解 4️⃣ 应用场景5️⃣ 底层原理6️⃣ 扩展&#xff1a;那些流行框架中的注解&#x1f33e; 总结 1️⃣ 概念 Java 注解&#xff08;Annotation&#xff09; 是Java语言中…

【Java】顺序表ArrayList

文章目录 一、顺序表二、ArrayList 的简介三、ArrayList 的使用3.1 构造方法3.2 常见操作3.3 遍历方法3.4 扩容机制 四、ArrayList 的模拟实现五、ArrayList 的使用案例5.1 扑克牌案例5.2 杨辉三角案例 六、ArrayList 存在的问题 一、顺序表 顺序表&#xff08;Sequential Lis…

js vuejs dagre-d3绘制流程图实用指南 有向图可视化

写在前面 之前有小伙伴问我如何使用 D3 在前端绘制流程图,今天在这里给安排上,与大家分享。 明确一点,只要你的数据计算能力足够强,使用原生D3绘制流程图绝对可以的,但是,为了让大家更容易上手,避免重复造轮子,给大家推荐一个专门绘制流程图的 D3 插件 dagre-d3。 首…

基于Flask+Bootstrap+机器学习的世界杯比赛预测系统

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

Springboot分布式事务

一、先了解什么是本地事务 1. 概念 本地事务是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器位于同一节点相同数据库上。 又称为传统事务。它是一个操作序列&#xff0c;这些操作要么都执行&#xff0c;要么都不执行&#xff0c;是一个不可分割的工作单位。例…

你真的不想知道怎么用ai绘画图片生成图片吗?

亲爱的二次元迷们&#xff0c;你是否曾经梦想过能够画出自己心中的二次元角色&#xff0c;让他们跃然纸上、生动活泼地展现在世人面前&#xff1f;但是&#xff0c;面对空白的画板和一支笔&#xff0c;我们有时会感到无从下手&#xff0c;毫无艺术细胞可言。不要失望&#xff0…

贵阳阿里云代理商:阿里云中国区副总裁李国欢:数字经济与实体经济如何融合

中国青年报客户端讯&#xff08;中青在线记者 于璧嘉&#xff09;6月21日&#xff0c;在第六届世界智能大会即将召开之际&#xff0c;阿里云中国区副总裁李国欢在接受媒体专访时表示&#xff1a;“数字经济已经成为社会生产力革命的一个重要生产要素。” 6月21日&#xff0c;阿…

如何批量将PDF转换为图片?

在生活工作中&#xff0c;我们会处理很多电子合同。这些电子合同一般是PDF格式&#xff0c;不但存储空间大&#xff0c;且预览起来不太便捷&#xff0c;需要我们转换为图片格式更方便预览。如果人工一一处理比较繁琐复杂&#xff0c;有没有什么方案可以快速将pdf转换为图片呢&a…