vue3(实现上下无限来往滚动)

一、问题描述

        一般在大屏项目中,很常见的效果,就是容器中的内容缓慢地向下移动,直到底部停止,然后快速滚动回顶部,然后接着缓慢滚动到底部。并且在特定的情况下,还需要进行一些小交互,那就还得让他停下来,当鼠标移入的时候,停止滚动,当鼠标移开的时候,继续从停止的地方接着滚动。如此反复。

二、效果

三、demo代码

<template>
  <div class="clean-con" @mouseenter="stopAutoScroll" @mouseleave="startAutoScroll">
    <div class="clean-main" ref="mainRef">
      <div class="clean-item"></div>
      <div class="clean-item"></div>
      <div class="clean-item"></div>
      <div class="clean-item"></div>
      <div class="clean-item"></div>
      <div class="clean-item"></div>
      <div class="clean-item"></div>
      <div class="clean-item"></div>
      <div class="clean-item"></div>
      <div class="clean-item"></div>
    </div>
  </div>
</template>

<script setup>
import { ref, onMounted } from 'vue';

const mainRef = ref(null);
let isAutoScrolling = true;

const stopAutoScroll = () => {
  isAutoScrolling = false;
}

const startAutoScroll = () => {
  isAutoScrolling = true;
  autoScroll();
}

const autoScroll = () => {
  if (!isAutoScrolling) return;

  const mainEl = mainRef.value;
  mainEl.scrollTop += 1; // 每次滚动的距离

  if (mainEl.scrollTop >= mainEl.scrollHeight - mainEl.clientHeight) {
    setTimeout(() => {
      mainEl.scrollTo({ top: 0, behavior: 'smooth' });
      setTimeout(autoScroll, 2000); // 2秒后再次滚动到底部
    }, 1000); // 暂停1秒后开始快速滚回顶部
  } else {
    requestAnimationFrame(autoScroll);
  }
}

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

<style>
.clean-con {
  overflow: hidden;
  padding: 20px;
  width: 400px;
  height: 700px;
  background-color: #000;
}
.clean-main {
  overflow-y: scroll;
  height: 700px;
}
.clean-item {
  height: 200px;
  background-color: #7c5c5c;
  margin-top: 20px;
}
.clean-item:last-child {
  background-color: aqua !important;
}
</style>

四、代码片段说明

        当主区域(mainEl)的滚动距离(mainEl.scrollTop)大于等于内容总高度(mainEl.scrollHeight)减去可见区域高度(mainEl.clientHeight)时,意味着主区域已经滚动到底部。这个判断条件用于触发以下操作:

  1. 首先,我们会通过 mainEl.scrollTo({ top: 0, behavior: 'smooth' }) 将主区域快速滚动回顶部,使用 behavior: 'smooth' 参数可以实现平滑的滚动效果。

  2. 然后,我们设置一个延迟,等待1秒钟,然后再次启动自动滚动逻辑。在这个延迟期间,主区域会停留在顶部,给用户一种暂停停顿的感觉。

  3. 在1秒延迟后,我们调用 setTimeout(autoScroll, 2000) 函数,即在2秒后再次触发自动滚动函数autoScroll。这会导致主区域快速滚动到底部,形成了一个循环滚动的效果。

        整体来说,这段代码实现了一个不断循环、平滑滚动的效果:当主区域滚动到底部后,会快速回到顶部,然后在延迟后再次快速滚动到底部,如此反复,形成一个流畅的滚动循环效果。

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RabbitMQ之生产批量发送

为什么要用生产批量发送&#xff1f; 批量发送消息&#xff0c;可以提高MQ发送性能。但是 RabbitMQ 并没有提供了批量发送消息的 API 接口,使用 spring-amqp 的 BatchingRabbitTemplate 实现批量能力。 SimpleBatchingStrategy 发送策略满足以下规则会进行发送&#xff1a; ba…

FreeRTOS低功耗模式(1-19)

低功耗模式简介(了解) 很多应用场合对于功耗的要求很严格&#xff0c;比如可穿戴低功耗产品、物联网低功耗产品等 一般MCU都有相应的低功耗模式,裸机开发时可以使用MCU的低功耗模式。 FreeRTOS也提供了一个叫Tickless的低功耗模式,方便带FreeRTOS操作系统的应用开发 stm32的低…

C#创建obj三维模型文件

介绍 使用开源库创建obj三维模型文件。 开源库地址&#xff1a;https://github.com/JeremyAnsel/JeremyAnsel.Media.WavefrontObj 相关API地址&#xff1a;https://jeremyansel.github.io/JeremyAnsel.Media.WavefrontObj/api/JeremyAnsel.Media.WavefrontObj.ObjFile.html …

docker desktop实战部署oracle篇

1、前言 oracle数据库官方已提供现成的镜像&#xff0c;可以直接拿来部署了。 由于项目中需要使用oracle数据库的分表功能&#xff0c;之前安装的是standard版本&#xff0c;无奈只能重新安装。网上查了一番&#xff0c;使用的方法都比较传统老旧&#xff1a;下载安装包手动安…

多线程局部存储技术

问题 多线程上下文中&#xff0c;每个线程需要使用一个专属的全局变量&#xff0c;该如何实现&#xff1f; 代码示例 一种可能的解决方案 test1.c #define _GNU_SOURCE /* To get pthread_getattr_np() declaration */ #define _XOPEN_SOURCE > 500 || _POSIX_C_SOURC…

谷歌上架,为什么会触发填表单,可以避免吗?怎么填表单可以提高通过率?

在谷歌上架过程中&#xff0c;相信大部分开发者都有收到过谷歌发来表单填写的邮件通知&#xff0c;要求开发者们在14天内根据表单要求回复关于应用部分情况。邮件如图&#xff1a; 根据触发填表单的开发者分享的经验来看&#xff0c;填完表之后出现的情况不尽相同&#xff0c;且…

【华为】路由综合实验(OSPF+BGP基础)

【华为】路由综合实验 实验需求拓扑配置AR1AR2AR3AR4AR5PC1PC2 查看通信OSPF邻居OSPF路由表 BGPBGP邻居BGP 路由表 配置文档 实验需求 ① 自行规划IP地址 ② 在区域1里面 启用OSPF ③ 在区域1和区域2 启用BGP&#xff0c;使AR4和AR3成为eBGP&#xff0c;AR4和AR5成为iBGP对等体…

【JVM】class文件格式,JVM加载class文件流程,JVM运行时内存区域,对象分配内存流程

这篇文章本来只是想讲一下class文件格式&#xff0c;讲着讲着越讲越多。JVM这一块吧&#xff0c;知识比较散比较多&#xff0c;如果深研究下去如死扣《深入理解Java虚拟机》&#xff0c;这本书很深很细&#xff0c;全记住是不可能的&#xff0c;其实也没必要。趁这个机会直接把…

RK3568平台(基础篇)linux错误码

一.概述 linux应用程序开发过程中&#xff0c;经常会遇到一些错误信息的返回&#xff0c;存在的可能性有&#xff0c;参数有误、非法访问、系统资源限制、设备/文件不存在、访问权限限制等等。对于这类错误&#xff0c;可以通过perror函数输出具体描述&#xff0c;或者通过str…

nacos-server-1.2.1启动

1、双击startup.cmd 2、启动日志 3、访问http://192.168.26.210:8848/nacos/index.html 4、登录 用户名&#xff1a;nacos 密码&#xff1a;nacos

掌握JavaScript面向对象编程核心密码:深入解析JavaScript面向对象机制对象概念、原型模式与继承策略全面指南,高效创建高质量、可维护代码

ECMAScript&#xff08;简称ES&#xff0c;是JavaScript的标准规范&#xff09;支持面向对象编程&#xff0c;通过构造函数模拟类&#xff0c;原型链实现继承&#xff0c;以及ES6引入的class语法糖简化面向对象开发。对象可通过构造函数创建&#xff0c;使用原型链共享方法和属…

【云原生】Docker 的网络通信

Docker 的网络通信 1.Docker 容器网络通信的基本原理1.1 查看 Docker 容器网络1.2 宿主机与 Docker 容器建立网络通信的过程 2.使用命令查看 Docker 的网络配置信息3.Docker 的 4 种网络通信模式3.1 bridge 模式3.2 host 模式3.3 container 模式3.4 none 模式 4.容器间的通信4.…

小白如何搭建git

1、安装git 在Windows上安装git&#xff1a; 关注微信公众号“机器人学”回复 “搭建git” 利用百度云网盘下载安装包&#xff0c;建议下载如下版本的否则可能会出现错误。 安装完成后&#xff0c;在开始菜单里Git->git bash&#xff0c;弹出命令窗说明git安装成功。 鼠标右…

【Python项目】基于DJANGO的【基于语音识别的智能垃圾分类系统】

技术简介&#xff1a;使用Python技术、DJANGO框架、MYSQL数据库等实现。 系统简介&#xff1a;用户们可以在系统上面录入自己的个人信息&#xff0c;录入后还可以对信息进行修改&#xff0c;网站可以对用户上传的音频文件进行识别&#xff0c;然后进行垃圾分类。 背景&#xf…

【学习AI-相关路程-工具使用-自我学习-NVIDIA-cuda-工具安装 (1)】

【学习AI-相关路程-工具使用-自我学习-NVIDIA-cuda &#xff08;1&#xff09;】 1、前言2、环境配置1、对于jetson orin nx 的cuda环境2、对于Ubuntu 20.04下cuda环境 3、自我总结-安装流程1、在ubuntu下&#xff0c;如果想使用cuda平台&#xff0c;应该注意什么 和 都安装什么…

BGE向量模型架构和训练细节

模型论文&#xff1a;https://arxiv.org/pdf/2309.07597 模型数据&#xff1a;https://data.baai.ac.cn/details/BAAI-MTP 训练数据 由无标签数据和有标签数据组成。 无标签数据使用了悟道等数据集&#xff0c;有标签数据使用了dureader等数据集。 都是文本对&#xff0c;对于…

rust使用Atomic创建全局变量和使用

Mutex用起来简单&#xff0c;但是无法并发读&#xff0c;RwLock可以并发读&#xff0c;但是使用场景较为受限且性能不够&#xff0c;那么有没有一种全能性选手呢&#xff1f; 欢迎我们的Atomic闪亮登场。 从 Rust1.34 版本后&#xff0c;就正式支持原子类型。原子指的是一系列…

【redis】Redis数据类型(五)ZSet类型

目录 类型介绍特点补充 使用场景 Zset类型数据结构ziplist&#xff1a;压缩列表&#xff08;参考之前的文章&#xff09;skiplist&#xff1a;跳表解析 面试题&#xff1a;MySQL索引为什么用B树而不用跳表区别总结 常用命令ZADD示例 ZREM示例 ZCARD示例 ZCOUNT示例 ZSCORE示例 …

在线OJ——链表经典例题详解

引言&#xff1a;本篇博客详细讲解了关于链表的三个经典例题&#xff0c;分别是&#xff1a;环形链表&#xff08;简单&#xff09;&#xff0c;环形链表Ⅱ&#xff08;中等&#xff09;&#xff0c;随机链表的复制&#xff08;中等&#xff09;。当你能毫无压力地听懂和成功地…

单调栈|496.下一个更大元素I

力扣题目链接 class Solution { public:vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {stack<int> st;vector<int> result(nums1.size(), -1);if (nums1.size() 0) return result;unordered_map<int, …