编程 Vue3 实现页面上下滑动方案

2025-06-28 17:07:57 +0800 CST views 23

Vue3 实现页面上下滑动方案

在 Vue3 项目中,有时页面内容超高,导致鼠标滚轮或触控板无法触发滚动,这通常是因为未正确开启滚动容器或未绑定滚动事件。我们可以从以下几方面入手解决:

1️⃣ 使用滚动容器 + @scroll

最常见的方法是为内容外围元素(如 .scroll-container)设置固定高度与 overflow-y: auto,并监听其 scroll 事件:

<template>
  <div class="scroll-container" @scroll="handleScroll" ref="scrollEl">
    <!-- 内容区域 -->
    <p v-for="i in 100" :key="i">第 {{ i }} 行内容</p>
  </div>
</template>

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

const scrollEl = ref(null);
const scrollTop = ref(0);

function handleScroll(e) {
  scrollTop.value = e.target.scrollTop;
}
</script>

<style>
.scroll-container {
  height: 600px;
  overflow-y: auto;
  border: 1px solid #ccc;
}
</style>

这样不仅可以上下滑动,还能实时获取滚动位置信息 ([cnblogs.com][1])。


2️⃣ 使用 DOM 原生事件监听

若需要更灵活地控制或监听全局滚动,可以在 onMounted 中用 addEventListener 手动绑定:

import { ref, onMounted, onBeforeUnmount } from 'vue';

const scrollTop = ref(0);
function onScroll(e) {
  const target = e.target === window ? document.documentElement : e.target;
  scrollTop.value = target.scrollTop;
}

onMounted(() => {
  window.addEventListener('scroll', onScroll, { passive: true });
});
onBeforeUnmount(() => {
  window.removeEventListener('scroll', onScroll);
});

适合整个页面滚动监听,但请注意 防内存泄漏


3️⃣ 应用防抖/节流优化性能

滚动回调触发频繁,会导致性能问题。建议结合 lodash.debounce 或自定义节流机制:

import { debounce } from 'lodash-es';
const onScrollDebounced = debounce(onScroll, 100);
window.addEventListener('scroll', onScrollDebounced);

或使用 Vue Use 中的 useScroll Hooks,一并自动处理性能优化 。


4️⃣ 实现「滚动到底部」监听

当需要触底加载更多内容时,可以通过如下逻辑判断:

function handleScroll(e) {
  const el = e.target;
  if (el.scrollTop + el.clientHeight >= el.scrollHeight - 5) {
    // 已接近底部
    loadMore();
  }
}

这一思路被广泛用于「无限滚动」「触底刷新」场景 ([juejin.cn][2])。


5️⃣ 无缝滚动组件库支持

如果你需要不断自动滚动页面内容(如公告、数据流水等),推荐引入第三方组件库,如 vue3-seamless-scroll

npm install vue3-seamless-scroll

并在组件中这样使用:

<template>
  <Vue3SeamlessScroll :list="items" :direction="'up'" :step="0.5" hover />
</template>
<script setup>
import { ref } from 'vue';
import { Vue3SeamlessScroll } from 'vue3-seamless-scroll';

const items = ref([/* 大量滚动内容数组 */]);
</script>

支持自动、无限滚动,效果流畅 ([juejin.cn][3])。


✅ 小结对照表

方案触发方式用途性能建议
@scroll + 容器容器滚动常规上下滑动可 debouce
window.addEventListener('scroll')页面滚动全局滚动监听移除时显式解绑
useScroll (VueUse)任意元素滚动状态监测内建性能优化
判断触底滚动回调中判断无线加载、分页scrollHeight 精度要加 buffer
vue3-seamless-scrollCSS/JS 自动滚动内容轮播、公告滚动无滚条体验,样式可自定义

💡 实用贴士

  • 防抖/节流:滚动频繁触发建议引入机制;
  • 解绑监听:避免内存泄漏;
  • 容器样式:如果是内部滚动,需设置 overflow-y: auto 和固定高度;
  • 触底判断留白:根据业务需求设定合适 buffer (>= scrollHeight - N);
  • 使用组件库:有「自动无缝滚动」需求时,选用成熟组件可省力。

✅ 总结

在 Vue3 中,实现正常的上下滑动其实并不复杂,关键在于:

  1. 是否设置了滚动容器(overflow+y + 固定高度);
  2. 是否正确监听了滚动事件;
  3. 是否兼顾性能优化;
  4. 是否有分页或自动滚动的额外需求。
复制全文 生成海报 前端开发 Vue 用户体验 性能优化

推荐文章

12个非常有用的JavaScript技巧
2024-11-19 05:36:14 +0800 CST
php常用的正则表达式
2024-11-19 03:48:35 +0800 CST
html一个包含iPhoneX和MacBook模拟器
2024-11-19 08:03:47 +0800 CST
thinkphp swoole websocket 结合的demo
2024-11-18 10:18:17 +0800 CST
如何在Vue3中处理全局状态管理?
2024-11-18 19:25:59 +0800 CST
MySQL 主从同步一致性详解
2024-11-19 02:49:19 +0800 CST
HTML和CSS创建的弹性菜单
2024-11-19 10:09:04 +0800 CST
PHP 8.4 中的新数组函数
2024-11-19 08:33:52 +0800 CST
软件定制开发流程
2024-11-19 05:52:28 +0800 CST
css模拟了MacBook的外观
2024-11-18 14:07:40 +0800 CST
平面设计常用尺寸
2024-11-19 02:20:22 +0800 CST
JavaScript中设置器和获取器
2024-11-17 19:54:27 +0800 CST
开源AI反混淆JS代码:HumanifyJS
2024-11-19 02:30:40 +0800 CST
Vue 3 是如何实现更好的性能的?
2024-11-19 09:06:25 +0800 CST
批量导入scv数据库
2024-11-17 05:07:51 +0800 CST
Flet 构建跨平台应用的 Python 框架
2025-03-21 08:40:53 +0800 CST
PHP解决XSS攻击
2024-11-19 02:17:37 +0800 CST
在 Docker 中部署 Vue 开发环境
2024-11-18 15:04:41 +0800 CST
使用 Nginx 获取客户端真实 IP
2024-11-18 14:51:58 +0800 CST
pin.gl是基于WebRTC的屏幕共享工具
2024-11-19 06:38:05 +0800 CST
PHP如何进行MySQL数据备份?
2024-11-18 20:40:25 +0800 CST
程序员茄子在线接单