前端开发攻略---用Vue实现无限滚动的几种方法

news2024/12/23 9:36:31

目录

1、原理

2、使用CSS动画

代码:

3、使用JS实现

代码:


1、原理

  1. 复制内容:将需要滚动的内容复制一次,并将这些副本放置在原始内容的后面。这样,当用户滚动到内容的末尾时,就会无缝地切换回到内容的起始位置。

  2. 动画滚动:使用 CSS 或 JavaScript 动画来滚动内容。通常,通过改变元素的位置(例如使用 transform 属性的 translate 函数)来实现滚动效果。

  3. 无限循环:当滚动到最后一个复制的内容时,将滚动位置重新设置为内容的起始位置,以创建无限循环的效果。这通常需要检测滚动位置,并在必要时进行调整。

  4. 控制滚动:根据用户的交互(例如鼠标移入/移出、滚动等),控制滚动的开始和暂停。这通常涉及使用事件处理程序来监听用户的交互,并相应地调整滚动的状态。

2、使用CSS动画

优点:

  1. 性能优化: CSS 动画通常会通过浏览器的硬件加速来执行,因此在性能方面可能更有效率。
  2. 简单易用: 使用 CSS 实现无限滚动通常比使用 JavaScript 更简单,并且可以通过几行 CSS 代码就能实现基本的效果。
  3. 响应式设计: CSS 可以轻松实现响应式设计,使得滚动效果在不同设备上具有一致的表现。
  4. 动画流畅性: 使用 CSS 实现的动画通常更加平滑,因为浏览器会根据自身的渲染节奏来处理动画效果。

缺点:

  1. 功能受限: 使用 CSS 实现的滚动效果通常比较基础,功能上受到一定的限制,例如无法实现复杂的动态交互或逻辑控制。
  2. 浏览器兼容性: 某些高级的 CSS 特性可能不被一些旧版本的浏览器所支持,这可能会导致在一些浏览器上无法正常显示滚动效果。
  3. 难以调试: 对于复杂的 CSS 动画效果,调试起来可能相对困难,特别是涉及到交互逻辑时。
  4. 性能消耗: 虽然 CSS 动画通常有较好的性能,但对于复杂的动画效果,可能会引起页面的重绘和重排,导致性能下降。

难受的点:当滚动容器内的元素使用了margin值,动画每结束一次就会抖动一次

代码:

<template>
  <div class="aaa">
    <div class="box">
      <ul>
        <li v-for="item in 2">
          <div></div>
          <div></div>
          <div></div>
          <div></div>
          <div></div>
        </li>
      </ul>
    </div>
  </div>
</template>

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

</script>

<style scoped lang="scss">
.aaa{
  display: flex;
  justify-content: center;
  align-items: center;
  height: 100vh;
  .box {
    width: 1050px;
    height: 300px;
    overflow: hidden;
    ul {
      width: 200%;
      height: 100%;
      animation: scroll 2s linear infinite;

      & > li {
        width: 1050px;
        background-color: rgb(255, 255, 255);
        height: 100%;
        float: left;
        list-style: none;
        display: flex;
        & > div {
          width: 200px;
          height: 100%;
          margin-right: 10px;
        }
        & > div:nth-child(1) {
          background-color: saddlebrown;
        }
        & > div:nth-child(2) {
          background-color: rgb(238, 254, 0);
        }
        & > div:nth-child(3) {
          background-color: rgb(34, 255, 5);
        }
        & > div:nth-child(4) {
          background-color: rgb(10, 194, 235);
        }
        & > div:nth-child(5) {
          background-color: rgb(50, 9, 215);
        }
      }
    }
    ul:hover {
      animation-play-state: paused;
    }
    @keyframes scroll {
      0% {
        transform: translateX(0);
      }
      100% {
        transform: translateX(-780px);
      }
    }
  }
}
</style>

3、使用JS实现

优点:

  1. 灵活性: 使用 JavaScript 实现无限滚动效果可以更灵活地控制动画的行为,包括速度、加速度、缓动效果等,以及根据用户交互进行动态调整。
  2. 功能丰富: JavaScript 提供了丰富的 API 和库,可以实现复杂的交互效果和逻辑控制,使得滚动效果更具创意和个性化。
  3. 兼容性: JavaScript 可以在几乎所有现代浏览器中运行,因此更具有跨浏览器兼容性。
  4. 调试方便: 使用 JavaScript 编写的动画代码通常更易于调试,因为可以通过控制台输出、断点调试等方式进行调试。

缺点:

  1. 性能消耗: JavaScript 动画可能会消耗更多的 CPU 和内存资源,尤其是对于复杂的动画效果或需要频繁计算的情况。
  2. 编码复杂度: 相对于使用 CSS 实现,使用 JavaScript 实现动画通常需要更多的编码工作,因为需要处理更多的逻辑和交互细节。
  3. 性能不稳定: 由于 JavaScript 是单线程执行的,当 JavaScript 代码执行时间过长或执行过程中阻塞了主线程,可能会导致页面卡顿或动画不流畅的问题。
  4. 兼容性问题: 某些低版本或旧版浏览器可能不支持或支持不完整某些 JavaScript 特性,导致在这些浏览器上无法正常运行动画效果。

代码:

<template>
  <div class="aaa">
    <div class="box">
      <ul ref="ulDom" @mouseenter="pause" @mouseleave="resume">
        <li v-for="item in 2">
          <div></div>
          <div></div>
          <div></div>
          <div></div>
          <div></div>
        </li>
      </ul>
    </div>
  </div>
</template>

<script setup>
import { ref, onMounted } from 'vue'
const ulDom = ref(null)
let animationId = null
let isPaused = false

onMounted(() => {
  animation()
})
const pause = () => {
  cancelAnimationFrame(animationId)
  isPaused = true
}

const resume = () => {
  if (!isPaused) return
  animationId = requestAnimationFrame(animation)
  isPaused = false
}
let position = 0
const animation = () => {
  const ulWidth = ulDom.value.offsetWidth
  const animate = () => {
    position -= 10
    if (position <= -(ulWidth / 2)) {
      position = 0
    }
    ulDom.value.style.transform = `translateX(${position}px)`
    animationId = requestAnimationFrame(animate)
  }
  animate()
}
</script>

<style scoped lang="scss">
.aaa{
  display: flex;
  justify-content: center;
  align-items: center;
  height: 100vh;
  .box {
    width: 1050px;
    height: 300px;
    overflow: hidden;
    ul {
      width: 200%;
      height: 100%;
      & > li {
        width: 1050px;
        background-color: rgb(255, 255, 255);
        height: 100%;
        float: left;
        list-style: none;
        display: flex;
        & > div {
          width: 200px;
          height: 100%;
          margin-right: 10px;
        }
        & > div:nth-child(1) {
          background-color: saddlebrown;
        }
        & > div:nth-child(2) {
          background-color: rgb(238, 254, 0);
        }
        & > div:nth-child(3) {
          background-color: rgb(34, 255, 5);
        }
        & > div:nth-child(4) {
          background-color: rgb(10, 194, 235);
        }
        & > div:nth-child(5) {
          background-color: rgb(50, 9, 215);
        }
      }
    }
  }
}
</style>

 代码解释:

  1. 引入依赖

    • 使用了 Vue 3 的 refonMounted 函数来创建响应式数据和在组件挂载后执行动画。
  2. 初始化变量

    • ulDom:通过 ref 创建的引用,指向 <ul> 元素,用于获取其宽度以及控制动画。
    • animationId:用于存储动画帧的 ID,方便后续取消动画。
    • isPaused:用于记录动画是否处于暂停状态。
  3. 初始化动画 (onMounted 钩子):

    • 调用 animation 函数启动动画。
  4. 暂停和继续动画

    • pause 方法:取消当前动画帧的执行,并将 isPaused 标志设置为 true,表示动画暂停。
    • resume 方法:如果动画没有处于暂停状态,则重新启动动画。
  5. 动画逻辑 (animation 函数):

    • 获取 <ul> 元素的宽度,以便在动画中使用。
    • 定义 animate 函数,该函数负责实际的动画逻辑。
    • animate 函数中,每帧向左移动 10px,直到移动到一半宽度的位置时,将位置重置为 0,从而实现无限滚动的效果。
    • 使用 requestAnimationFrame 来实现流畅的动画效果。

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

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

相关文章

【Python】—— 公共的方法

目录 &#xff08;一&#xff09;公共操作 1.1 公共操作之运算符加号 1.2 公共操作之运算符乘号 1.3 公共操作之运算符判断数据是否存在 &#xff08;二&#xff09;公共方法 2.1 公共方法-len 2.2 公共方法-del 2.3 公共方法-max和min 2.4 公共方法-range 2.5 公共方…

如果 SEC 批准以太坊现货 ETF,会有更多山寨币 ETF 吗?

撰文&#xff1a;Protos 编译&#xff1a;Ismay&#xff0c;BlockBeats 文章来源香港Web3媒体Techun News 编者按&#xff1a;SEC 已与交易平台和 ETF 申请人就 19b-4 规则变更请求进行沟通&#xff0c;这表明以太坊现货 ETF 获批的可能性大大增加。与此同时山寨币投资者猜测…

嵌入式开发中树莓派和单片机关键区别

综合了几篇帖子作以信息收录&#xff1a;树莓派和单片机作为嵌入式系统领域中两种广泛使用的设备&#xff0c;各自有着不同的特性和应用场景&#xff0c;文章从五个方面进行比对展开。 架构与性能&#xff1a; 树莓派&#xff1a;是一款微型计算机&#xff0c;通常配备基于AR…

解决 git:OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 0

解决 git&#xff1a;OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 0 问题 git pull报错&#xff1a;fatal: unable to access ‘https://github.com/aircrushin/ultrav-music.git/’: Failed to connect to github.com port 443 after 21077 ms: Couldn’t connect to serve…

成本管控:如何利用 SOLIDWORKS Costing 高效估算成本?

现在全球材料短缺、生活成本上升以及能源价格上涨而导致的成本上升问题突显。 生产产品需要的成本以及如何让产品的成本下降就成为很多的企业越来越关注的问题。 SOLIDWORKS Costing是集成到 SOLIDWORKS Professional 和 Premium 中的一款允许用户和制造商估算产品生产成本的工…

Java 多线程抢红包

问题需求 一个人在群里发了1个100元的红包&#xff0c;被分成了8个&#xff0c;群里有10个人一起来抢红包&#xff0c;有抢到的金额随机分配。 红包功能需要满足哪些具体规则呢? 1、被分的人数抢到的金额之和要等于红包金额&#xff0c;不能多也不能少。 2、每个人至少抢到1元…

A股翻车现场

英伟达业绩炸裂&#xff0c;但今天A股这边不仅没喝着汤&#xff0c;还再度上演大型翻车现场&#xff0c;人家不仅股价大涨7个点还站上1000美元大关&#xff0c; 而咱A股里的英伟达&#xff0c;AI&#xff0c;TMT相关概念股&#xff0c;包括工业&#xff08;富联&#xff09;&am…

Redis常见数据类型(4) - hash, List

hash 命令小结 命令执行效果时间复杂度hset key field value设置值O(1)hget key field获取值O(1)hdel key field [field...]删除值O(k), k是field个数hlen key计算field个数O(1)hgetall key获取所有的field-valueO(k), k是field的个数hmget field [field...]批量获取field-va…

springboot+jsp校园理发店美容美发店信息管理系统0h29g

前台管理:会员管理、会员预定、开单点单、收银结帐、技师提成 后台管理:数据维护、物料管理、数据查询、报表分析、系统设置等 灵活的付款方式&#xff0c;支持现金、挂帐、会员卡&#xff0c;同时支持多种折扣方式并可按用户要求设置多种结帐类型善的充值卡管理模块:支持优惠卡…

重谈端口号(五元组标识通信),netstat命令介绍

目录 重谈端口号 引入 介绍 知名端口 查看 netstat 引入 介绍 第一列 其他列 选项 重谈端口号 引入 我们已经介绍了很多关于网络协议/网络相关知识了,这里,我们重新回过头再来看看端口号 之前介绍端口号的博客 -- 网络通信另个角度的认识(进程间通信),端口号(为什么…

ctfshow web 萌新赛

给他 谐音.git 用githack还原文件 <?php $passsprintf("and pass%s",addslashes($_GET[pass])); $sqlsprintf("select * from user where name%s $pass",addslashes($_GET[name])); ?>用addslashes函数进行转义 它会在以下字符前添加反斜杠&am…

【施磊】C++语言基础提高:深入学习C++语言先要练好的内功

课程总目录 文章目录 一、进程的虚拟地址空间内存划分和布局二、函数的调用堆栈详细过程三、程序编译链接原理1. 编译过程2. 链接过程 一、进程的虚拟地址空间内存划分和布局 任何的编程语言 → \to → 产生两种东西&#xff1a;指令和数据 编译链接完成之后会产生一个可执行…

【笔记】软件架构师要点记录(2)

【笔记】软件架构师要点记录 20240523案例一案例二案例三案例四案例五案例六案例七案例十 20240523 基于前10个架构案例场景&#xff0c;对用到的专业术语进行整理&#xff0c;方便后续查看。 案例一 MVC架构风格组件交互方式 MVC是一种用来构建用户界面时采用的架构设计风格…

SpringBoot中使用AOP实现日志记录功能

目录 一、SpringBoot框架介绍 二、什么是 AOP 三、日志记录的必要性 四、SpringBoot中如何使用AOP实现日志记录功能 一、SpringBoot框架介绍 SpringBoot是一个开源的Java开发框架&#xff0c;旨在简化基于Spring框架的应用程序的开发。它提供了一套开箱即用的工具&#xf…

企业知识库智能问答系统的实践

1、页面效果 PC端 2、页面效果 手机端 3、主要支持功能 新建会话 历史会话 2、智能问答 支持 文本分类和意图识别&#xff0c;支持基于大模型的对话理解&#xff0c;支持流式对话 3、支持手机端 语音识别 4、主要服务包括 向量库Milvus 向量计算和文本分类服务 …

吃透一道题day2:Java算法中的“如何找到给定字符串中的不同字符“

写在开头&#xff1a;很久没有开启有关算法的内容了,在正式开启开启今天这段算法之旅之前,跟大家谈一谈上周五歌手也就是第二期我的一些直观感受:相比第一期(chante moore的if i aint got you和faouzia的crazy带给我的经验)没有任何特别的惊艳之处,很平淡甚至可以说是心如止水,…

使用docker+jenkins构建前端项目发布到nginx

1.准备环境 为了方便公司开发优化代码&#xff0c;不需要反复地将项目包发送给运维部署&#xff0c;我们对开发环境的前端项目利用jenkinsCI/CD进行自动化部署 需要两台服务器 一台jenkins 一台发布服务器,这里发布服务器 我直接使用开发环境的服务器 将admin界面与云计算展示…

优化电源设计:反激二极管选择与注意事项

反激二极管也被称为续流二极管、缓冲二极管、抑制二极管、钳位二极管或换向二极管&#xff0c;是一种电子元件&#xff0c;通常应用在开关电源和其他涉及电感性负载的电路中。它的主要功能是保护电路&#xff0c;防止感性负载在开关断开时产生的反激电压&#xff08;或反电动势…

Paddle 傅里叶变换基础及领域应用

Paddle 傅里叶变换基础及领域应用 1. 傅里叶变换基础 1.1 傅里叶变换简介 傅里叶变换是一种重要的信号处理技术&#xff0c;它可以将一个信号从时域转换到频域。在频域中&#xff0c;信号的频率特性更加明显&#xff0c;有利于分析和处理。傅里叶变换的基本思想是将一个信号…

P6【知识点】【数据结构】【树tree】C++版

树是由一个集合以及在该集合上定义的一种关系构成的&#xff0c;集合中的元素称为树的结点&#xff0c;所定义的关系称为父子关系。父子关系在树的结点之间建立了一个层次结构&#xff0c;在这种层次结构中有一个结点具有特殊的地位&#xff0c;这个结点称为该树的根结点。 二叉…