【功能完善】客服消息输入键盘弹起适配

This commit is contained in:
puhui999
2025-05-08 17:49:12 +08:00
parent 9f1cd4c3a7
commit e0f7ec3629
+51 -5
View File
@@ -30,20 +30,21 @@
<script setup> <script setup>
import MessageListItem from '@/pages/chat/components/messageListItem.vue'; import MessageListItem from '@/pages/chat/components/messageListItem.vue';
import { onMounted, reactive, ref } from 'vue'; import { onMounted, reactive, ref, computed } from 'vue';
import KeFuApi from '@/sheep/api/promotion/kefu'; import KeFuApi from '@/sheep/api/promotion/kefu';
import { isEmpty } from '@/sheep/helper/utils'; import { isEmpty } from '@/sheep/helper/utils';
import { formatDate } from '@/sheep/util'; import { formatDate } from '@/sheep/util';
import sheep from '@/sheep'; import sheep from '@/sheep';
const { safeAreaInsets } = sheep.$platform.device; const { safeAreaInsets } = sheep.$platform.device;
const safeAreaInsetsBottom = safeAreaInsets.bottom + 'px' // 底部安全区域 const safeAreaInsetsBottom = safeAreaInsets.bottom + 'px'; // 底部安全区域
const messageList = ref([]); // 消息列表 const messageList = ref([]); // 消息列表
const showTip = ref(false); // 显示提示 const showTip = ref(false); // 显示提示
const showNewMessageTip = ref(false); // 显示有新消息提示 const showNewMessageTip = ref(false); // 显示有新消息提示
const refreshMessage = ref(false); // 更新消息列表 const refreshMessage = ref(false); // 更新消息列表
const isLoading = ref(false); // 是否正在加载更多 const isLoading = ref(false); // 是否正在加载更多
const hasMore = ref(true); // 是否还有更多数据 const hasMore = ref(true); // 是否还有更多数据
const keyboardHeight = ref(0); // 键盘高度
const scroll = ref({ const scroll = ref({
top: 0, top: 0,
oldTop: 0, oldTop: 0,
@@ -54,6 +55,16 @@
createTime: undefined, createTime: undefined,
}); // 查询参数 }); // 查询参数
// 计算聊天窗口高度
const chatScrollHeight = computed(() => {
const baseHeight = 'calc(100vh - 100px - ' + safeAreaInsetsBottom + ')';
if (keyboardHeight.value > 0) {
// 键盘弹起状态,减去键盘高度
return `calc(${baseHeight} - ${keyboardHeight.value}px)`;
}
return baseHeight;
});
// 获得消息分页列表 // 获得消息分页列表
const getMessageList = async () => { const getMessageList = async () => {
isLoading.value = true; isLoading.value = true;
@@ -147,7 +158,16 @@
showTip.value = false; showTip.value = false;
}; };
defineExpose({ getMessageList, refreshMessageList, scrollToTop }); /** 设置键盘高度 */
const setKeyboardHeight = (height) => {
keyboardHeight.value = height;
// 键盘弹起时,滚动到最新消息
if (height > 0) {
scrollToTop();
}
};
defineExpose({ getMessageList, refreshMessageList });
/** 监听消息列表滚动 */ /** 监听消息列表滚动 */
const onScroll = (e) => { const onScroll = (e) => {
@@ -161,16 +181,42 @@
} }
}; };
// 监听键盘弹起和收起事件
const setupKeyboardListeners = () => {
// #ifdef H5
// H5环境
window.addEventListener('resize', () => {
// 窗口大小变化可能是由键盘引起的
if (document.activeElement && (document.activeElement.tagName === 'INPUT' || document.activeElement.tagName === 'TEXTAREA')) {
// 估算键盘高度,实际上是窗口高度变化
const currentHeight = window.innerHeight;
const viewportHeight = window.visualViewport ? window.visualViewport.height : window.innerHeight;
const keyboardHeight = currentHeight - viewportHeight;
setKeyboardHeight(keyboardHeight > 0 ? keyboardHeight : 0);
} else {
setKeyboardHeight(0);
}
});
// #endif
// #ifdef MP-WEIXIN
// 微信小程序环境
uni.onKeyboardHeightChange((res) => {
setKeyboardHeight(res.height);
});
// #endif
};
onMounted(() => { onMounted(() => {
queryParams.no = 1; // 确保首次加载是第一页 queryParams.no = 1; // 确保首次加载是第一页
getMessageList(); getMessageList();
setupKeyboardListeners();
}); });
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.chat-scroll-view { .chat-scroll-view {
/* 减去底部输入框的高度 */ height: v-bind(chatScrollHeight);
height: calc(100vh - 100px - v-bind(safeAreaInsetsBottom));
width: 100%; width: 100%;
position: relative; position: relative;
background-color: #f8f8f8; background-color: #f8f8f8;