Vue实现滚动元素始终固定在最底部

news2024/9/21 14:39:12

1. 应用场景——聊天

在聊天的时候,展示聊天内容的元素是可以滚动的,通过上下滚动来查看过往消息。不过在首次打开聊天页面以及发送新消息时需要固定在滚动的最底部以及时展示最新的消息,这样才能获得比较好的用户体验。

效果:
在这里插入图片描述

2. 实现

假设滚动的元素为div,只需要设置下面这个语句即可:

div.scrollTop = div.scrollHeight;

scrollHeight 属性:
只读属性,是一个元素内容高度的度量,包括由于溢出导致的视图中不可见内容。

scrollTop 属性
对于设置了垂直滚动的元素,scrollTop 的值是这个元素的内容窗口顶部到它的可视窗口顶部的距离。这是个差值,意味着向上滚动的高度。

这里要区分两个概念:内容窗口和可视窗口。
内容窗口:
内容窗口就是实际内容所占的box,高度随着内容的高度增大而增大(默认向下增大),超出div的部分需要滑动才可见。
可视窗口:
就是设置了滚动属性的元素,它的宽高有多少可视的范围就是多大。
在这里插入图片描述
因此我们当内容窗口的高度变大时,比如发送了新消息,我们将scrollTop 的值设成这两个窗口高度的差值就实现了自动固定到底部的效果。

srcollHeight 就是内容窗口的高度,我们还需要获得可视窗口的高度。其实我们不需要获得,因为可以利用scrollTop 的一个特点:如果设置了超出这个容器可滚动的值,scrollTop 会被设为最大值(也就是滑动到最底部)。

因此我们可以设置成一个比较大的值赋给它,这个值就可以选择srcollHeight ,这个值会始终会超出容器的可滚动范围(因为它的高度就是可滚动范围+视窗高度),因此就实现了固定到底部的效果。

3. 巧用 nextTick

虽然使用div.scrollTop = div.scrollHeight;这个语句就能达成效果,但在实际使用时会有bug,比如在这个聊天场景中,刚发送新消息时,没有自动滑动到最后一条消息,而是滚动到倒数第二条消息了。
这是因此组件在刷新时有延迟,我们没有读取到选然后的最新值导致的。
解决办法就是使用nextTick函数封装一下。

 nextTick(() => {
            div.scrollTop = div.scrollHeight;
    })

nextTick 的作用
nextTick 是vue 提供的一个API,作用是下一次DOM更新后调用的方法。

原理:
当更改了vue的响应式状态之后,DOM的刷新不是同步的,而是将刷新dom的任务放到一个队列中去等待执行,直到下一个tick才一起执行。nextTick就是监听dom刷新的方法,在tick 了之后会立即被执行,因此可以利用这个原理解决之前的bug。

详见: vue: nextTick

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

每日一练,java

目录 描述示例 总结 描述 题目来自牛客网 •输入一个字符串,请按长度为8拆分每个输入字符串并进行输出; •长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。 输入描述: 连续输入字符串(每个字符串长度小于等于100) 输…

Wikijs 部署教程

以下是一个 Wikijs 部署的简单教程,涵盖了使用 Docker 和直接安装两种方式: 方法一: 使用 Docker (推荐) Docker 是一个方便快捷的方式来部署 Wikijs,它可以避免许多手动配置步骤。 安装 Docker: 按照 https://docs.docker.com/…

接口测试返回参数的自动化对比!

引言 在现代软件开发过程中,接口测试是验证系统功能正确性和稳定性的核心环节。接口返回参数的对比不仅是确保接口功能实现的手段,也是测试过程中常见且重要的任务。为了提高对比的效率和准确性,我们可以通过自动化手段实现这一过程。本文将…

android CameraX构建相机拍照

Android CameraX 是一个 Jetpack 支持库,旨在简化相机应用的开发工作。它提供了一致且易用的API接口,适用于大多数Android设备,并可向后兼容至Android 5.0(API级别21)。 CameraX解决了在多种设备上实现相机功能时所遇…

LLM代理应用实战:构建Plotly数据可视化代理

如果你尝试过像ChatGPT这样的LLM,就会知道它们几乎可以为任何语言或包生成代码。但是仅仅依靠LLM是有局限的。对于数据可视化的问题我们需要提供一下的内容 描述数据:模型本身并不知道数据集的细节,比如列名和行细节。手动提供这些信息可能很麻烦&#…

javascipt学习笔记一

JavaScript基础day1 一、编程语言 1.编程 编程:就是让计算机为解决某个问题而使用某种编程设计语言编写程序代码,最终得到结果的过程 计算机程序: 就是计算机所执行的一系列的指令集合。 2.计算机语言 计算机语言指的是用于人与计算机之间通…

Manim的代码练习02:在manim中Dot ,Arrow和NumberPlane对象的使用

Dot:指代点对象或者表示点的符号。Arrow:指代箭头对象,包括直线上的箭头或者向量箭头等。NumberPlane:指代数轴平面对象,在Manim中用来创建包含坐标轴的数学坐标系平面。Text:指代文本对象,用来…

国产数据库VastBase与C/C++程序适配

背景 2022年底的项目,记录一下。 某项目后台使用C程序开发,使用的是OCI连接Oracle数据库。现需要做去O国产化适配改造。 本文聊聊C/C应用程序如何使用VastBase替换Oracle。 编译适配 开发包获取 从VastBase官方或接口人处获取OCI开发包,包含…

品牌产业出海指南如何搭建国际化架构的跨境电商平台?

在“品牌&产业出海指南 – 成功搭建跨境电商平台”系列中,我们将从电商分销系统、跨境平台商城/多商户商城系统和国际化架构三个方面对帮助您梳理不同平台模式的优缺点、应用场景、开发重点和运营建议。 在“品牌&产业出海指南 – 成功搭建跨境电商平台”系…

verITAS:大规模验证图像转换

1. 引言 斯坦福大学Trisha Datta、Binyi Chen 和 Dan Boneh 2024年论文《VerITAS: Verifying Image Transformations at Scale》,开源代码实现见: https://github.com/zk-VerITAS/VerITAS(RustPython) 依赖https://github.com/a…

Java的高级特性

类的继承 继承是从已有的类中派生出新的类,新的类能拥有已有类的属性和行为,并且可以拓展新的属性和行为 public class 子类 extends 父类{子类类体 } 优点 代码的复用 提高编码效率 易于维护 使类与类产生关联,是多态的前提 缺点 类缺乏独…

纯vue+js实现数字0到增加到指定数字动画效果功能

关于数字增加动画效果网上基本上都是借助第三方插件实现的,就会导致有的项目安装插件总会出问题,所有最好使用原生vue+js实现,比较稳妥 纯vue+js实现数字0到增加到指定数字动画效果功能 vue+js 实现数字增加动画功能 效果图 其中,关于数字变化的间隔时间,延时效果都可…

Linux环境下激活使用Navicat

Linux环境下激活使用Navicat 解压navicat15-premium-linux.zip文件,存放目录自行定义,此处我解压到/home/admin/Downloads,下载地址:https://www.123pan.com/s/hyS7Vv-zJCR.html # 在桌面创建临时目录 mkdir ~/Desktop/navicat…

Flutter和React Native(RN)的比较

Flutter和React Native(RN)都是用于构建跨平台移动应用程序的流行框架。两者都具有各自的优势和劣势,选择哪个框架取决于您的具体需求和项目。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 以下是…

算法学习笔记(8.5)-零钱兑换问题二

目录 Question: 动态规划思路: 代码实现: 空间优化代码 Question: 给定n种硬币,第i种硬币的面值为coins[i-1],目标金额为amt,每种硬币可以重复选取,问凑出目标金额的硬币组合数量。 动态规划思路…

教你如何白嫖ioDraw

ioDraw推出了这个活动,大家看看~ 领取页面 邀请奖励 您和好友都将获得7天的会员权益 邀请攻略 活动介绍 1. 每成功邀请一个新用户,邀请者与被邀请者均可获得7天会员 2. 每年最高可得350天 3. 新用户是指首次登录ioDraw的用户 获取邀请链接步骤 1. 浏…

VS2019配置OpenGL的库

OpenGL环境的配置&#xff08;GLUT安装教程&#xff09;_opengl官网-CSDN博客 我是根据这篇来配置的&#xff0c;然后&#xff1a; 引用的头文件不是<OpenGL/glut.h>而是<GL/glut.h>&#xff0c;然后就可以运行了。

CCSI: 数据无关类别增量学习的持续类特定印象| 文献速递-基于深度学习的多模态数据分析与生存分析

Title 题目 CCSI: Continual Class-Specific Impression for data-free class incremental learning CCSI: 数据无关类别增量学习的持续类特定印象 01 文献速递介绍 当前用于医学影像分类任务的深度学习模型表现出令人鼓舞的性能。这些模型大多数需要在训练之前收集所有的…

【tomcat】Tomcat如何扩展Java线程池原理

池化技术 在后端中&#xff0c;对于经常使用池化就是来提升系统性能&#xff0c;比如数据库连接池、线程池连接池等&#xff0c;本质都是利用空间换时间的来提升性能&#xff0c;用来避免资源的频繁创建和销毁&#xff0c;以此提高资源的复用率&#xff0c;所以合理设置系统所…

springboot个人健康信息管理小程序-计算机毕业设计源码

摘要 在当今这个数字化、信息化的时代&#xff0c;个人健康管理已成为人们生活中不可或缺的一部分。随着生活节奏的加快&#xff0c;越来越多的人开始关注自己的身体状况&#xff0c;希望能够及时了解并调整自己的生活习惯&#xff0c;以达到最佳的健康状态。为此&#xff0c;我…