微信小程序实现仿微信聊天界面(各种细节处理)

下面先来看看效果

在这里插入图片描述

为实现这样的效果,首先要解决两个问题:

1.点击输入框弹出软键盘后,将已有的少许聊天内容弹出,导致看不到的问题;
2.键盘弹出或收起时,聊天消息没有自动滚到最底部。

首先解决第二个问题,自动滚动到最底部,这很简单,这里提供三种方法(推荐第三种):
1.计算每条消息的最大高度,设置scroll-top=(单条msg最大高度 * msg条数)px。

2.用 将展示msg的目标scroll-view包裹,
通过js获取到该view的实际高度:

var that = this;
var query = wx.createSelectorQuery();
query.select('.scrollMsg').boundingClientRect(function(rect) {that.setData({scrollTop: rect.height+'px';});
}).exec();

3.(推荐)将所有msg都编号如:msg-0,msg-1,msg-2… 直接锁定最后一条msg,滚动到那里。
在scroll-view中添加:scroll-into-view='{{toView}}'
在wx:for后面添加:wx:for-index="index"
在每个msg布局中添加:id='msg-{{index}}'
最后直接:

this.setData({toView: 'msg-' + (msgList.length - 1)
})

到这里第二个问题解决了,那么我们回过来解决第一个问题:

(点击输入框弹出软键盘后,将已有的少许聊天内容弹出,导致看不到的问题)
1.首先我们需要将input的自动向上推给关掉,这里有个坑:

在input组件中添加:adjust-position='{{false}}'
而不是:adjust-position='false'
这么做虽然不再向上推,但却导致了软键盘弹起时,会遮挡屏幕下部分的消息。

2.如何解决软键盘弹起时,会遮挡屏幕下部分的消息?

当软键盘弹起时,将scroll-view的高度缩短至软键盘遮挡不到的屏幕上方部分,当软键盘收起时,再将scroll-view的高度还原,这样解决了遮挡问题。

提示:
input中的bindfocus='focus'可获取软键盘高度并监听软键盘弹起,bindblur='blur'可监听软键盘收起,var windowHeight = wx.getSystemInfoSync().windowHeight;可获得屏幕高度。

scrollHeight(滚动条高度) = windowHeight(屏幕高度) - 软键盘高度;

最后将input组件放在软键盘上面就完成了。

|
|
|
|
|
|
|

各位要不要代码?

|
|
|
|
|
|
|
contact.js:

// pages/contact/contact.js
const app = getApp();
var inputVal = '';
var msgList = [];
var windowWidth = wx.getSystemInfoSync().windowWidth;
var windowHeight = wx.getSystemInfoSync().windowHeight;
var keyHeight = 0;/*** 初始化数据*/
function initData(that) {inputVal = '';msgList = [{speaker: 'server',contentType: 'text',content: '欢迎来到英雄联盟,敌军还有30秒到达战场,请做好准备!'},{speaker: 'customer',contentType: 'text',content: '我怕是走错片场了...'}]that.setData({msgList,inputVal})
}/*** 计算msg总高度*/
// function calScrollHeight(that, keyHeight) {
//   var query = wx.createSelectorQuery();
//   query.select('.scrollMsg').boundingClientRect(function(rect) {
//   }).exec();
// }Page({/*** 页面的初始数据*/data: {scrollHeight: '100vh',inputBottom: 0},/*** 生命周期函数--监听页面加载*/onLoad: function(options) {initData(this);this.setData({cusHeadIcon: app.globalData.userInfo.avatarUrl,});},/*** 生命周期函数--监听页面显示*/onShow: function() {},/*** 页面相关事件处理函数--监听用户下拉动作*/onPullDownRefresh: function() {},/*** 页面上拉触底事件的处理函数*/onReachBottom: function() {},/*** 获取聚焦*/focus: function(e) {keyHeight = e.detail.height;this.setData({scrollHeight: (windowHeight - keyHeight) + 'px'});this.setData({toView: 'msg-' + (msgList.length - 1),inputBottom: keyHeight + 'px'})//计算msg高度// calScrollHeight(this, keyHeight);},//失去聚焦(软键盘消失)blur: function(e) {this.setData({scrollHeight: '100vh',inputBottom: 0})this.setData({toView: 'msg-' + (msgList.length - 1)})},/*** 发送点击监听*/sendClick: function(e) {msgList.push({speaker: 'customer',contentType: 'text',content: e.detail.value})inputVal = '';this.setData({msgList,inputVal});},/*** 退回上一页*/toBackClick: function() {wx.navigateBack({})}})

contact.wxml:

<!--pages/contact/contact.wxml--><view><scroll-view scroll-y scroll-into-view='{{toView}}' style='height: {{scrollHeight}};'><!-- <view class='scrollMsg'> --><block wx:key wx:for='{{msgList}}' wx:for-index="index"><!-- 单个消息1 客服发出(左) --><view wx:if='{{item.speaker=="server"}}' id='msg-{{index}}' style='display: flex; padding: 2vw 11vw 2vw 2vw;'><view style='width: 11vw; height: 11vw;'><image style='width: 11vw; height: 11vw; border-radius: 10rpx;' src='../../images/contact_member.png'></image></view><view style='width: 4vw; height: 11vw; margin-left: 0.5vw; display: flex; align-items: center; z-index: 9;'><image style='width: 4vw;' src='../../images/left_msg.png' mode='widthFix'></image></view><view class='leftMsg'>{{item.content}}</view></view><!-- 单个消息2 用户发出(右) --><view wx:else id='msg-{{index}}' style='display: flex; justify-content: flex-end; padding: 2vw 2vw 2vw 11vw;'><view class='rightMsg'>{{item.content}}</view><view style='width: 4vw; height: 11vw; margin-right: 0.5vw; display: flex; align-items: center; z-index: 9;'><image style='width: 4vw;' src='../../images/right_msg.png' mode='widthFix'></image></view><view style='width: 11vw; height: 11vw;'><image style='width: 11vw; height: 11vw; border-radius: 10rpx;' src='{{cusHeadIcon}}'></image></view></view></block><!-- </view> --><!-- 占位 --><view style='width: 100%; height: 18vw;'></view></scroll-view><view class='inputRoom' style='bottom: {{inputBottom}}'><image style='width: 7vw; margin-left: 3.2vw;' src='../../images/pic_icon.png' mode='widthFix'></image><input bindconfirm='sendClick' adjust-position='{{false}}' value='{{inputVal}}' confirm-type='send' bindfocus='focus' bindblur='blur'></input></view>
</view>

contact.wxss:

/* pages/contact/contact.wxss */page {background-color: #f1f1f1;
}.inputRoom {width: 100vw;height: 16vw;border-top: 1px solid #cdcdcd;background-color: #f1f1f1;position: fixed;bottom: 0;display: flex;align-items: center;z-index: 20;
}input {width: 76vw;height: 9.33vw;background-color: #fff;border-radius: 40rpx;margin-left: 2vw;padding: 0 3vw;font-size: 28rpx;color: #444;
}.leftMsg {font-size: 35rpx;color: #444;line-height: 7vw;padding: 2vw 2.5vw;background-color: #fff;margin-left: -1.6vw;border-radius: 10rpx;z-index: 10;
}.rightMsg {font-size: 35rpx;color: #444;line-height: 7vw;padding: 2vw 2.5vw;background-color: #96EB6A;margin-right: -1.6vw;border-radius: 10rpx;z-index: 10;
}

到此就结束了,希望能帮到各位,记得拿走时请扣6
有问题在评论区留言

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

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

相关文章

小程序中如何实现即时通信聊天功能?

项目背景&#xff1a;小程序中实现实时聊天功能 一、服务器域名配置 配置流程 配置参考URL&#xff1a;https://developers.weixin.qq.com/miniprogram/dev/api/api-network.html 二、nginx中配置反向代理加密websocket(wss) upstream websocket{hash $remote_addr consiste…

微信小程序的测试方法,抓包,模拟

微信小程序的测试&#xff0c;抓包&#xff0c;模拟 不仅仅只是测试同学需要完整的对我们的程序进行测试&#xff0c;同时也需要我们的开发同学对如何进行微信小程序的测试有一定的了解&#xff0c;接下来&#xff0c;我们来对一些特殊场景的微信小程序进行测试。 目录 微信小…

如何在微信小程序里实现聊天室功能?

准备工作 下载环信 小程序demosdkgit clone https://github.com/easemob/webim-weixin-xcx创建一个文件夹&#xff0c;将 demo 中的文件 comps、images、sdk、utils 拷贝到新的文件&#xff0c;文件目录说明 集成 登录环信没什么可说的&#xff0c;这里选择的是使用 usernam…

具身智能,是机器人的“冷饭热炒”吗?

大模型正如火如荼&#xff0c;下一个AI风口就来了。 如果你关注2023世界人工智能大会等行业峰会&#xff0c;以及英伟达、微软、谷歌、特斯拉和国內科技大厂的最新发布会&#xff0c;除了“大模型”&#xff0c;应该会听到另一个高频词——具身智能。 所谓具身智能Embodied AI …

chatgpt赋能python:Python图片拼接:将多张图片拼接成一张大图

Python 图片拼接&#xff1a;将多张图片拼接成一张大图 在当今数字化的时代&#xff0c;图片已经成为了我们生活和工作中不可或缺的一部分。图片不仅可以记录生活的美好瞬间&#xff0c;同时也可以用于商业宣传、教育培训等方面。然而&#xff0c;在某些情况下&#xff0c;我们…

英伟达终于开源GPU内核模块代码

作者 | 钰莹&#xff0c;核子可乐 内容来源&#xff1a;infoq 近日&#xff0c;英伟达&#xff08;NVIDIA&#xff09;宣布&#xff0c;将 Linux GPU 内核模块作为开放源代码发布。早在几天前&#xff0c;NVIDIA 开始在 GitHub 上陆续公开相关代码&#xff0c;目前该项目已经…

2002年3月英伟达发布核弹GPU与大算力自动驾驶芯片

2002年3月英伟达发布核弹GPU与大算力自动驾驶芯片 英伟达核弹级GPU&#xff1a;800亿晶体管&#xff0c;20块承载全球互联网流量 2022年3 月 22 日&#xff0c;在英伟达 GTC2022 上&#xff0c;英伟达介绍了 Hopper 架构、H100 GPU、元宇宙、新型超级计算机、软件、数据中心等方…

最近火爆的英伟达数据中心GPU所有型号及参数汇总,含售价

关注、星标公众号&#xff0c;精彩内容每日送达 来源&#xff1a;网络素材 注&#xff1a;英伟达A800是NVIDIA公司生产的显卡&#xff0c;是为了解决美国商务部的半导体出口新规&#xff0c;以取代A100 GPU。 NVIDIA H100 CNX产品规格 ———— / END / ————

从英伟达 vs ATI的芯片大战看GPU前世今生

导读&#xff1a;本文带你回顾从CPU到GPU的历史&#xff0c;再展望从GPU到TPU的未来。 作者&#xff1a;钱纲 来源&#xff1a;大数据DT&#xff08;ID&#xff1a;hzdashuju&#xff09; 01 第一代、第二代GPU 1998年英伟达宣布GPU的研发成功&#xff0c;是计算机显示的历史性…

20 个 GPU 可承载相当于全球互联网流量、Grace CPU 超级芯片现世,英伟达这届 GTC 发布了什么?...

整理 | 苏宓 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 技术的极限在哪里&#xff1f; 想必科技圈给出回答大概率是没有&#xff01; 这不&#xff0c;在 GTC 2022 Keynote 上&#xff0c;身着黑色夹克「战袍」的黄仁勋挂帅&#xff0c;英伟达带着采用台积电…

随着ChatGPT、文言一心的大火,未来可能的生活工作方式

前面的文章笼统的扯了一些ChatGPT、文言一心的差异化&#xff0c;感觉还是不够明白直观。特地找了一份资料&#xff0c;通过基础能力、进阶能力、和一些垂直领域的几百个各种问题&#xff0c;来对比分析两者的回答情况&#xff0c;让大家可以有个更接地气的了解。 由于问题太多…

chatgpt赋能python:Python是如何实现数据可视化的

Python是如何实现数据可视化的 看到数据可能让人头疼&#xff0c;但它也是条件成熟时必不可少的细节。在这些细节中&#xff0c;数据可视化是一个让人看起来轻松的过程&#xff0c;很多时候这种方法都是为了达到更好的效果。对于数据 Visualization&#xff0c;Python 无疑是一…

chatgpt赋能python:Python画图怎么保存

Python画图怎么保存 Python作为一门高级编程语言&#xff0c;广泛应用于数据分析、机器学习、人工智能等领域。在数据分析这一领域中&#xff0c;数据可视化是非常重要的一环&#xff0c;而Python作为数据分析的利器之一&#xff0c;也有着强大的画图能力。那么&#xff0c;在…

他山之石可以攻玉:解锁9个chatGPT常用姿势

ChatGPT是一个颠覆性的人工智能&#xff0c;可以用来实现众多目标。下面是我们用中文提出的关于这些任务的指令&#xff0c;以及来自ChatGPT的中文回答示例。 调试代码 提示&#xff1a;为什么我的python代码报错&#xff1a;x [2, 3, 8 9]&#xff1f; ChatGPT回答&#x…

JSP实现简易的聊天功能(Session机制)

JSP实现简易的聊天功能&#xff08;Session机制&#xff09; 基于服务器端全局应用空间 application 的简易聊天室实现 1.login.jsp <% page language"java" contentType"text/html; charsetUTF-8"pageEncoding"UTF-8"%> <!DOCTYPE …

在本地使用远程服务器的Jupyter Notebook

问题 python项目含有ipynb文件&#xff0c;用Pycharm打开&#xff0c;提示安装jupyter。于是转到jupyter notebook中运行项目&#xff0c;这就引出了一个问题&#xff0c; 即如何在本地使用远程服务器上的jupyter notebook。  这里提供一种方法。 解决方法 1 在服务器上安装…

硅基罗丹明-小分子聚乙二醇-叠氮 SiR-PEG4-azide

科研实验中大家比较常见硅基罗丹明&#xff0c;对于其性质应用&#xff0c;大家有所了解吗&#xff1f;今天瑞禧小编通过对SiR-PEG4-azide 硅-罗丹明-四聚乙二醇-叠氮来为大家介绍硅基罗丹明的应用。 下面是瑞禧小编整理的SiR-PEG4-azide 硅-罗丹明-四聚乙二醇-叠氮的产品详情&…

硅基罗丹明荧光染料小分子聚乙二醇修饰反式环辛烯SiR-PEG3-TCO

硅基罗丹明-三聚乙二醇-反式环辛烯 SiR-PEG3-TCO 硅基罗丹明SIR(siliconrhodamine)染料是一种深红色近红外荧光染料、细胞渗透性强、高特异性的DNA探针。具有优异光物理性质、良好的生物相容性&#xff0c;在保留了罗丹明荧光染料优越的光学性质的同时&#xff0c;光谱发生明显…

英特尔正式宣布:All in硅基自旋量子比特

&#xff08;图片来源&#xff1a;英特尔&#xff09; 最近&#xff0c;在美国物理学会&#xff08;APS&#xff09;的三月会议上&#xff0c;英特尔不仅介绍了公司最新发表的14篇论文成果&#xff0c;并透露了公司的量子战略计划。 在英特尔看来&#xff0c;实用的量子计算未来…

给小朋友讲故事——科学课,地球,太阳和月亮

在2022年05月19日按照九迁的课程表&#xff0c;给他上了一节科学课&#xff0c;内容是&#xff1a;地球&#xff0c;太阳和月亮。 但是因为当天发生的事情&#xff08;关于校园霸凌&#xff0c;刚刚发生&#xff08;2022年05月20日教育局加三个校长的到来&#xff09;&#xff…