当前位置: 首页 > news >正文

实现动态滚动效果的 Vue 组件:一个实战案例

动态滚动效果常常被用于展示动态数据,例如新闻列表、报警信息或实时数据流。这种效果不仅能够节省页面空间,还能增强用户体验。本文将通过一个具体的 Vue 组件案例,详细介绍如何实现一个动态滚动效果,尤其是如何在用户交互时暂停和恢复滚动。

场景描述

需求:需要在一个固定高度的容器中展示多条报警信息,并且这些信息会自动滚动展示。同时,当用户鼠标悬停在信息列表上时,滚动应暂停,鼠标移开后继续滚动。这种效果可以通过 Vue 和原生 JavaScript 的结合来实现。

实现思路

  1. 动态数据展示:使用 Vue 的 v-for 指令动态渲染报警信息列表。
  2. 自动滚动逻辑:通过定时器和 scrollTop 属性控制容器的滚动。
  3. 用户交互响应:监听鼠标进入和离开事件,动态控制滚动的暂停和恢复。

代码实现

脚本部分

在脚本中,我们实现了滚动逻辑,并通过 Vue 的生命周期钩子管理滚动效果的启动和销毁。

<script setup lang="ts">
import { ref, onMounted, onUnmounted } from 'vue';
import CardTitle from '@/components/CardTitle/index.vue';

const list = ref([
  // 报警信息数据
]);

let isScrolling = true; // 控制滚动状态
let scrollInterval: any = null; // 定时器引用

onMounted(() => {
  const container = document.querySelector('.list-container') as HTMLElement;
  if (!container) {
    console.error('滚动容器未找到,请检查类名是否正确');
    return;
  }

  const scrollHeight = container.scrollHeight;
  const containerHeight = container.clientHeight;

  if (scrollHeight <= containerHeight) {
    console.warn('内容高度小于容器高度,无需滚动');
    return;
  }

  let scrollPosition = 0;

  function smoothScroll() {
    if (!isScrolling) return;

    scrollPosition += 1; // 每次滚动的高度
    if (scrollPosition >= scrollHeight - containerHeight) {
      scrollPosition = 0; // 滚动到顶部
    }
    container.scrollTop = scrollPosition;

    scrollInterval = setTimeout(smoothScroll, 100); // 递归调用,模拟滚动
  }

  // 开始滚动
  smoothScroll();

  // 鼠标进入暂停滚动
  container.addEventListener('mouseenter', () => {
    isScrolling = false;
    clearTimeout(scrollInterval);
  });

  // 鼠标移出恢复滚动
  container.addEventListener('mouseleave', () => {
    isScrolling = true;
    smoothScroll();
  });
});

onUnmounted(() => {
  // 清理事件监听器和定时器
  const container = document.querySelector('.list-container') as HTMLElement;
  if (container) {
    container.removeEventListener('mouseenter', () => {});
    container.removeEventListener('mouseleave', () => {});
  }
  clearTimeout(scrollInterval);
});
</script>
.list-container {
        height: 100%;
        overflow-y: auto; /* 允许垂直滚动 */
}

关键点解析

  1. 滚动逻辑:通过 setTimeoutscrollTop 实现平滑滚动。每次滚动固定高度,当滚动到底部时重置到顶部。
  2. 用户交互:监听 mouseentermouseleave 事件,动态控制滚动状态。
  3. 性能优化:使用 clearTimeout 清理定时器,避免内存泄漏。

相关文章:

  • 【微信小程序(云开发模式)变通实现DeepSeek支持语音】
  • 【Docker】windows本地docker使用compose编排容器化部署mysql
  • 机器学习之KMeans算法
  • atop命令介绍(全面资源监控:同时监控CPU、内存、磁盘、网络和进程活动)性能监控、资源数据
  • 基于MySQL的创建Java实体Bean和TypeScript实体Bean
  • DeepSeek-R1深度解读
  • Vue + CSS实现渐变栅格进度条
  • 【机器学习】强化学习
  • 鬼泣:动作系统3
  • 服装零售行业数字化时代的业务与IT转型规划P111(111页PPT)(文末有下载方式)
  • springmvc中使用interceptor拦截
  • PyTorch使用(2)-张量数值计算
  • mysql解析器和优化器
  • Solana笔记案例:写一个SOL转账程序
  • DeepSeek写打台球手机小游戏
  • 后端接口开发完成后,接口地址访问不到提示404,Spring项目的包结构错误
  • [特殊字符]1.2.1 新型基础设施建设
  • 手搓聊天室1.0.0----基于ws和protobuf协议
  • git 查看某个函数的所有提交日志
  • 友思特应用 | 行业首创:基于深度学习视觉平台的AI驱动轮胎检测自动化
  • 锚定“双一流”战略坐标,福建农林大学向全球英才“伸出橄榄枝”
  • 新城市志|中国消费第一城,迎来“补贴力度最大”购物节
  • 南方医科大学原副校长宁习洲主动投案,接受审查调查
  • 无视规范开“远端”、企业云端被窃密,国安部:莫让运维成运“危”
  • 长三角议事厅|国际产业转移对中国产业链韧性的影响与对策
  • 央行上海总部:受益于过境免签政策,上海市外卡刷卡支付交易量稳步增长