【Element-plus】如何让滚动条永远在最底部(支持在线演示)

如何让滚动条永远在最底部

一、适用场景

在某些场景下,你可能希望滚动条保持在最底部,以确保用户始终看到最新的内容或信息。如:在实时聊天应用程序中,当新消息到达时,滚动条自动滚动到最底部,方便用户立即看到最新的对话。

二、实现思路

  1. 使用 nextTick 等待 DOM 更新完成 ,然后计算出内部容器的总高度 max(如:当前可视区只有第4、5、6项,前面的3项已经由于滚动的关系不可见了。我们需要获取的总高度是包含 1~6 项的总高,而不仅是可视的高度);
  2. 当出现滚动条时,因为滚动条到容器顶部的距离一定恒小于 在第一步计算出来的内部容器的总高度 max
  3. 所以,每当新增一项或者删除一项时,我设置滚动条到顶部的距离 为第一步计算出来的内部容器的总高度 max,就可以让滚动条滚动到底部了。

三、效果图

四、在线演示

点击此处即可跳转到 Element Plus Playground

五、完整代码

下面使用的是vue3语法:

html 复制代码
<template>
  <div class="header">
    <el-button @click="add">新增一项</el-button>
    <el-button @click="onDelete">删除一项</el-button>
    <el-button @click="setScrollToTop">回到顶部</el-button>
  </div>
  <el-scrollbar ref="scrollbarRef" max-height="200px" always @scroll="handleScroll">
    <div ref="innerRef">
      <p v-for="item in count" :key="item" class="scrollbar-demo-item">{{ item }}</p>
    </div>
  </el-scrollbar>
</template>
typescript 复制代码
import { nextTick, ref } from 'vue'

const count = ref(5) // 计数器
const scrollbarRef = ref() // 滚动条实例
const innerRef = ref() // 计数器内部实例

/**
 * 控制滚动条滚动到容器的底部
 */
async function setScrollToBottom() {
  // 注意:需要通过 nextTick 以等待 DOM 更新完成
  await nextTick()
  const max = innerRef.value!.clientHeight
  console.log('max', max) // 如:当 count = 5 时,max = 总项数 * 每一项的高度 + 外边距 * (总项数 - 1),即 max = 5 * 50px + 20px * (5 - 1) = 330px
  scrollbarRef.value!.setScrollTop(max) 
}

/**
 * 控制滚动条滚动到容器的顶部
 */
function setScrollToTop() {
  scrollbarRef.value!.setScrollTop(0)
}

/**
 * 当触发滚动事件时,返回滚动的距离
 */
function handleScroll({ scrollTop }) {
  console.log('scrollTop', scrollTop)
}

/**
 * 新增一项
 */
async function add() {
  count.value++
  await setScrollToBottom()
}

/**
 * 删除一项
 */
async function onDelete() {
  if (count.value > 0) {
    count.value--
  }
  await setScrollToBottom()
}
css 复制代码
.header {
  margin: 10px;
}
.scrollbar-demo-item {
  display: flex;
  align-items: center;
  justify-content: center;
  height: 50px;
  margin: 20px;
  text-align: center;
  border-radius: 4px;
  background: var(--el-color-primary-light-9);
  color: var(--el-color-primary);
}
相关推荐
KaMeidebaby15 小时前
卡梅德生物技术快报|骆驼纳米抗体:从原核表达、高通量测序到分子对接全流程实现
前端·数据库·其他·百度·新浪微博
子兮曰17 小时前
Node.js v26.1.0 深度解读:FFI、后量子密码与调试器的进化
前端·后端·node.js
测试员周周17 小时前
【Appium 系列】第06节-页面对象实现 — LoginPage 实战
开发语言·前端·人工智能·python·功能测试·appium·测试用例
西洼工作室18 小时前
前端直传OSS服务端签名(Policy+Signature)/STS临时凭证
前端·文件上传·oss
你很易烊千玺19 小时前
日常练习-数组 字符串常用的场景
前端·javascript·字符串·数组
weixin1997010801620 小时前
[特殊字符] RESTful API 接口规范详解:构建高效、可扩展的 Web 服务(附 Python 源码)
前端·python·restful
存在的五月雨20 小时前
Vue3项目一些语法
前端·javascript·react.js
nashane20 小时前
HarmonyOS 6学习:Web组件同层渲染事件处理与智能长截图实现
前端·学习·harmonyos·harmonyos 5
大家的林语冰20 小时前
Node 2026 发布,JS 三大新功能上线,最后一个奇偶版本
前端·javascript·node.js