el-scrollbar实现自动滚动到底部(AI聊天)

目录

项目背景

实现步骤

实现代码

完整示例代码


项目背景

chatGPT聊天消息展示滚动面板,每次用户输入提问内容或者ai进行流式回答时需要不断的滚动到底部确保展示最新的消息。

实现步骤

采用element ui 的el-scrollbar作为聊天消息展示组件。

通过操作dom来实现滚动到底部。

通过vue的watch来监听聊天消息列表的变动。

实现代码

  <el-scrollbar height="400px" ref='scrollMenuRes'>
            <!-- 内容 -->
  </el-scrollbar>
//滚动面板自动滑动到底部
const scrollToBottom = () => {
    if (scrollMenuRes.value) {
        const container = scrollMenuRes.value.$el.querySelector('.el-scrollbar__wrap');
        container.style.scrollBehavior = 'smooth'; // 添加平滑滚动效果
        container.scrollTop = container.scrollHeight;
    }
};

完整示例代码

<template>
    <div>
        <el-scrollbar height="400px" ref='scrollMenuRes'>
            <!-- 内容 -->
            <h1>消息:1</h1>
            <h1>消息:11</h1>
            <h1>消息:111</h1>
            <h1>消息:1111</h1>
            <h1>消息:11111</h1>
            <h1>消息:111111</h1>
            <h1>消息:1111111</h1>
            <h1>消息:11111111</h1>
            <h1>消息:111111111</h1>
            <h1>消息:1111111111</h1>
            <h1>消息:11111111111</h1>
            <h1>消息:111111111111</h1>
            <h1>消息:1111111111111</h1>
        </el-scrollbar>
    </div>
</template>

<script setup lang="ts">
import { ref,onMounted,watch } from 'vue';
import { ElScrollbar } from 'element-plus';
//聊天消息滚动面板dom
const scrollMenuRes = ref<any>(null);

//滚动面板自动滑动到底部
const scrollToBottom = () => {
    if (scrollMenuRes.value) {
        const container = scrollMenuRes.value.$el.querySelector('.el-scrollbar__wrap');
        container.style.scrollBehavior = 'smooth'; // 添加平滑滚动效果
        container.scrollTop = container.scrollHeight;
    }
};

onMounted(() => {
    scrollToBottom();
})
</script>

<style scoped></style>
### 使用 `el-scrollbar` 实现自动滚动底部 为了实现 `el-scrollbar` 的自动滚动功能,可以通过监听特定事件或操作来触发滚动行为。下面是一个完整的解决方案,展示了如何通过 JavaScriptVue.js 来控制 `el-scrollbar` 组件的滚动位置。 #### HTML 结构 首先定义包含 `el-scrollbar` 的基本结构: ```html <template> <div class="scroll-container"> <el-scrollbar ref="scrollbarRef"> <!-- 这里放置需要滚动的内容 --> <ul id="content-list"> <li v-for="(item, index) in items" :key="index">{{ item }}</li> </ul> </el-scrollbar> <button @click="autoScrollToBottom">点击滚动到最底部</button> </div> </template> ``` #### 方法实现 接着,在脚本部分编写用于处理自动滚动逻辑的方法: ```javascript <script setup> import { ref } from 'vue'; const scrollbarRef = ref(null); let items = Array.from({ length: 100 }, (_, i) => `Item ${i + 1}`); function autoScrollToBottom() { const containerHeight = document.querySelector('.el-scrollbar__wrap').clientHeight; const contentHeight = document.getElementById('content-list').offsetHeight; if (containerHeight && contentHeight) { setTimeout(() => { scrollbarRef.value.setScrollTop(contentHeight); // 设置顶部偏移量等于内容高度以达到滚到底部效果 }, 100); } } </script> ``` 此方法利用了 `setScrollTop()` 函数设置垂直方向上的滚动距离,从而实现了页面加载完毕后的自动向下滚动至列表末端的功能[^2]。 另外需要注意的是,如果希望在某些情况下(比如新增加了一条记录)立即让视窗跳转到最后一条新加入的数据处,则可以在相应的地方调用上述函数完成即时刷新显示的目的。 对于更复杂的场景下可能还需要考虑动画过渡等因素提升用户体验感,此时可以借助 CSS 动画库或者其他插件辅助完成平滑滚动的效果调整[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蒾酒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值