当前位置:   article > 正文

uniapp聊天页面之消息滚动_uni-app 聊天内容自动滚动到底部

uni-app 聊天内容自动滚动到底部

目录

1、HTML部分

2、 Js部分

3、注意,滚动方法调用


1、HTML部分

用整个scroll-view的高度减去所有聊天内容的高度,得到的就是滚动条需要下拉的距离,即可使聊天页下拉至最底部。

需要给 scroll-view一个固定的高度,并获取消息信息的高度。

  1. <view class="content">
  2. <scroll-view style="background-color: #f5f5f5;" class="chat-window" scroll-y="true" show-scrollbar="true"
  3. :scroll-with-animation="true" :scroll-top="scrollTop" :style="{height: style.contentViewHeight + 'px'}">
  4. <view class="all" id='chatContent'>
  5. <view class="word">
  6. <!-- 遍历获取到的消息 -->
  7. <view v-for="(item ,index) in chatLog" class="cu-chat">
  8. <!-- 他人信息 -->
  9. <view class="left-pal" v-show="item.from !== sendData.from">
  10. <up-image :src="userMap.get(item.from)" width="100rpx" height="100rpx" shape="circle"
  11. @click="skipDetails"></up-image>
  12. <view class="container"> {{item.content}}</view>
  13. </view>
  14. <!-- 自己发送信息 -->
  15. <view class="right-own" v-show='item.from === sendData.from'>
  16. <view class="oneself">
  17. <view class="container"> {{item.content}}</view>
  18. <up-image :src="userMap.get(item.from)" width="100rpx" height="100rpx" shape="circle"
  19. @click="skipMy"></up-image>
  20. </view>
  21. </view>
  22. </view>
  23. </view>
  24. </view>
  25. </scroll-view>
  26. <view class="base">
  27. <up-input placeholder="请输入内容" style="background-color: #fff;" border="surround"
  28. v-model="sendData.content"></up-input>
  29. <u-button text="发送" type="success" class="button" @click="Send"
  30. :disabled="sendData.content.length==0"></u-button>
  31. </view>
  32. </view>

2、 Js部分

  1. //定义盒子的初始高度
  2. const style = ref({
  3. contentViewHeight: 0,
  4. mitemHeight: 0
  5. })
  6. //contentViewHeight: 消息信息展示, mitemHeight: 消息总高度
  7. onLoad((option) => {
  8. const res = uni.getSystemInfoSync(); //获取手机可使用窗口高度
  9. style.value.contentViewHeight = res.windowHeight - 60;
  10. // res.windowHeight:屏幕的高度减去,输入框的高度,得到信息的需要展示的高度
  11. })
  1. /**
  2. * @information 跳转页面底部
  3. */
  4. const scrollToBottom = () => {
  5. let query = uni.createSelectorQuery();
  6. query.selectAll('.cu-chat').boundingClientRect();
  7. //获取所有消息节点
  8. query.exec((res) => {
  9. style.value.mitemHeight = 0;
  10. res[0].forEach((rect) => style.value.mitemHeight = style.value.mitemHeight + rect.height + 40)
  11. //获取所有内部子元素的高度,遍历得到总高度
  12. /** 因为vue的虚拟DOM 每次生成的新消息都是之前的,所以采用异步setTimeout
  13. * 主要就是添加了这定时器
  14. */
  15. setTimeout(
  16. () => {
  17. if (style.value.mitemHeight > (style.value.contentViewHeight - 100)) {
  18. //判断子元素高度是否大于显示高度
  19. scrollTop.value = style.value.mitemHeight - style.value.contentViewHeight
  20. //用子元素的高度减去显示的高度就获益获得序言滚动的高度
  21. }
  22. }, 100)
  23. })
  24. }

3、注意,滚动方法调用

        刚进入页面的时候,有可能会没有滚动效果,这可能是因为消息列表的DOM节点还没有渲染到页面上,滚动的方法变已经执行了,导致滚动效果消失。所以调用的时候最好放在nextTick中。

  1. nextTick(() => {
  2. scrollToBottom()
  3. })
  4. //待全部DOM节点加载完后再滚动

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/514621
推荐阅读
相关标签
  

闽ICP备14008679号