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

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.mzph.cn/pingmian/46846.shtml

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

相关文章

C++——类和对象(下)

文章目录 一、再探构造函数——初始化列表二、 类型转换三、static成员静态成员变量静态成员函数 四、 友元友元函数友元类 五、内部类六、匿名对象 一、再探构造函数——初始化列表 之前我们实现构造函数时,初始化成员变量主要使⽤函数体内赋值,构造函…

PostgreSQL使用(二)

说明:本文介绍PostgreSQL的DML语言; 插入数据 -- 1.全字段插入,字段名可以省略 insert into tb_student values (1, 张三, 1990-01-01, 88.88);-- 2.部分字段插入,字段名必须写全 insert into tb_student (id, name) values (2,…

【后端开发实习】用Redis实现消息队列邮件发送

简介 用Resi本身封装的方法相比于调redis-smq库,实现方式就要简单朴素很多: 调用redis本身的List数据结构的Lpush实现消息的进队。用Redis的List数据结构的brpop方法实现消息的出队。将出队消息通过邮件方法发送给指定的用户。 生动形象理解就是用redi…

《javeEE篇》--多线程(1)

进程 在讲线程之前我们先来简单了解一下进程 什么是进程 进程是操作系统对一个正在运行的程序的一种抽象,又或者说,可以把进程看作程序的一次运行过程(通俗的讲就是跑起来的程序)。 而且在操作系统内部,进程是资源分配的基本单位 PCB P…

内容长度不同的div如何自动对齐展示

平时我们经常会遇到页面内容div结构相同页,这时为了美观我们会希望div会对齐展示,但当div里的文字长度不一时又不想写固定高度,就会出现div长度长长短短,此时实现样式可以这样写: .e-commerce-Wrap {display: flex;fle…

轻量级自适用商城卡密发卡源码(可运营)

一款全开源非常好看的发卡源码。轻量级自适应个人自助发卡简介,这是一款二次开发的发卡平台源码修复原版bug,删除无用的代码。所有文件全部解密,只保留后台版权信息内容。大家放心使用,可以用于商业运营。轻量级自适应个人自助发卡。 源码下…

写python代码,怎么用工厂模式思维设计接口?

接口的好处 接口就是抽象方法,用来设计后架构,后端开发者和客户端调用者都可以使用这个接口规则同步写代码,客户端调用者(app、网页甚至时自动化接口测试)不用担心后端对接口的实现细节具体是什么样子的。直接去调用就…

获取欧洲时报中国板块前新闻数据(多线程版)

这里写目录标题 一.数据获取流程二.获取主页面数据并提取出文章url三.获取文章详情页的数据并提取整体代码展示 一.数据获取流程 我们首先通过抓包就能够找到我们所需数据的api 这里一共有五个参数其中只有第一个和第五个参数是变化的第一个参数就是第几页第五个是一个由时…

Qt 多窗体、复用窗口的使用

1.继承自QWidge的窗口的呈现,作为tabPage呈现,作为独立窗口呈现 2.继承自QMainWindow的窗口的呈现,作为abPage呈现,作为独立窗口呈现 1. 继承自QWidge的窗口的呈现 1.1 作为tabPage呈现 void MutiWindowExample::on_actWidgetI…

云计算数据中心(一)

目录 一、云数据中心的特征二、云数据中心网络部署(一)改进型树结构(二)递归层次结构(三)光交换网络(四)无线数据中心网络(五)软件定义网络 一、云数据中心的…

java 项目使用 acitiviti 流程引擎中的人员设置

学习目标: 目标 [ ]了解 java 项目使用 acitiviti 流程引擎中的人员设置 知识小记: - [x] 1、人员选择说明 - [x] 2、分配任务候选人 任务的候选人是指有权限对该任务进行操作的潜在用户群体,这个用户群体有权限处理(处理、完成)该任务…

最多可以派出多少支球队

最多可以派出多少支球队 解决“最多可以派出多少支球队”的问题需要准确理解题目要求,选择合适的算法(如贪心算法和双指针技术),并注意对原始数据进行适当的预处理(如排序)。在编程实现过程中,有…

MySQL索引重要知识点

1.什么是索引? 索引在项目中是比较常见的,它是帮助MySQL高效获取数据的数据结构,主要是用来提高数据检索的效率,降低数据库的I0成本,同时通过索引列对数据进行排序,降低数据排序的成本,也能降低…

java.sql.SQLException: Unknown system variable ‘query_cache_size‘【Pyspark】

1、问题描述 学习SparkSql中,将spark中dataframe数据结构保存为jdbc的格式并提交到本地的mysql中,相关代码见文章末尾。 运行代码时报出相关配置文件错误,如下。 根据该报错,发现网络上多数解决方都是基于java开发的解决方案&a…

uniapp字符串转base64,无需导入依赖(多端支持)

使用示例 import { Base64Encode, Base64Decode } from "@/utils/base64.js" base64.js const _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";export const Base64Encode = (text)

网络准入控制设备是什么?有哪些?网络准入设备臻品优选

小李:“小张,最近公司网络频繁遭遇外部攻击,我们得加强一下网络安全了。” 小张:“是啊,我听说实施网络准入控制是个不错的选择。但具体什么是网络准入控制设备?我们有哪些选择呢?” 小李微笑…

iredmail服务器安装步骤详解!如何做配置?

iredmail服务器安全性设置指南?怎么升级邮件服务器? iredmail是一个功能强大的邮件服务器解决方案,它集成了多个开源软件,使您能够快速部署和管理邮件服务。AokSend将逐步引导您完成安装过程,无需深入的编程知识即可轻…

AI智能名片在Web 3.0技术栈中的应用与前景研究

摘要:在Web 3.0的浪潮中,AI智能名片作为一种创新的数字工具,正逐步渗透到商业交流的各个层面。本文深入探讨了AI智能名片在Web 3.0技术栈中的具体应用,详细分析了其背后的技术支撑、应用场景、优势以及面临的挑战。通过案例分析、…

A Survey on Multimodal Large Language Models综述

论文题目:A Survey on Multimodal Large Language Models 论文地址:https://arxiv.org/pdf/2306.13549 话题:多模态LLMs综述 MLLMs Paper: https://github.com/BradyFU/Awesome-Multimodal-Large-Language-Models 1. 摘要 近期,以GPT-4V为代表的跨模态大型语言模型(MLLM…

Java版【植物大战僵尸+源码】

上期回顾: 今天给大家推荐一个Gtihub开源项目:PythonPlantsVsZombies,翻译成中就是植物大战僵尸。 《植物大战僵尸》是一款极富策略性的小游戏。可怕的僵尸即将入侵,每种僵尸都有不同的特点,例如铁桶僵尸拥有极强的抗…