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

文章介绍了如何在Vue项目中创建一个大屏容器,内容缓慢滚动并响应鼠标交互,实现滚动到顶部后延迟再滚动到底部的循环效果。代码展示了如何使用Vue的ref和生命周期钩子来控制滚动行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、问题描述

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

二、效果

三、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。这会导致主区域快速滚动到底部,形成了一个循环滚动的效果。

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

 

<think>好的,用户问的是关于Vue后台管理窗口缩小适配的问题。我需要先理解用户的具体需求。通常后台管理系统需要在不同屏幕尺寸下保持良好的显示效果,尤其是当窗口缩小时,布局可能需要调整,比如侧边栏折叠、表格滚动、元素隐藏等。 首先,我应该考虑响应式设计的基础,比如使用媒体查询(Media Queries)来检测屏幕尺寸变化,然后调整样式。Vue项目中,可能结合使用Flex布局或Grid布局来实现弹性布局,这样元素能自适应屏幕大小。 然后,想到Vue的响应式辅助工具,比如VueUse库中的useMediaQuery,可以监听屏幕尺寸变化,动态调整组件状态。例如,当屏幕宽度小于某个阈值时,侧边栏可以自动折叠,菜单项可能转换为图标形式,或者隐藏部分内容。 另外,Element UI或Ant Design Vue这样的UI框架本身提供了响应式组件,可能需要检查它们的文档,看看是否有内置的适配方案。比如,布局组件的断点设置,栅格系统的使用(row和col),通过调整span值来适应不同屏幕。 还需要考虑图片和表格的适配。图片可能使用max-width: 100%来防止溢出,表格则可能需要横向滚动,可以在容器上设置overflow-x: auto。 可能还要处理动态class绑定,根据屏幕尺寸的变化,添加或移除类名,从而触发不同的样式。比如在移动端隐藏某些列,或者调整字体大小。 最后,测试不同分辨率下的显示效果,使用Chrome开发者工具的设备模式来模拟各种屏幕尺寸,确保布局正确调整。如果有必要,可能还需要使用window.addEventListener(&#39;resize&#39;, ...)来监听窗口变化,但要注意防抖处理,避免频繁触发重排影响性能。 总结一下,步骤可能包括:使用响应式布局技术、媒体查询、UI框架的响应式功能、动态样式绑定、处理图片和表格的适配,以及测试和优化性能。需要将这些方法具体化,给出代码示例,比如媒体查询的CSS代码,或者Vue组件中如何结合useMediaQuery来触发状态变化。</think>在Vue后台管理系统中实现窗口缩小适配,主要通过以下技术方案(代码示例采用Vue3+ElementPlus): ```html <!-- 响应式侧边栏组件 --> <template> <el-menu :collapse="isCollapse" @select="handleSelect" class="h-screen transition-all duration-300" > <!-- 菜单项根据折叠状态显示不同内容 --> <el-menu-item index="1"> <el-icon><House /></el-icon> <template #title> <span v-show="!isCollapse">首页</span> </template> </el-menu-item> <!-- 更多菜单项... --> </el-menu> </template> <script setup> import { useMediaQuery } from &#39;@vueuse/core&#39; // 响应式断点检测(移动端优先) const isMobile = useMediaQuery(&#39;(max-width: 768px)&#39;) const isCollapse = ref(false) watch(isMobile, (val) => { isCollapse.value = val // 小于768px时自动折叠侧边栏 }) </script> ``` ### 核心适配方案: 1. **弹性布局体系** ```css /* 使用flex/grid实现自适应布局 */ .main-container { display: grid; grid-template-columns: 200px 1fr; @apply min-h-screen; /* 移动端改为纵向布局 */ @media (max-width: 768px) { grid-template-columns: 1fr; } } ``` 2. **元素响应式控制** ```html <!-- 表格列动态隐藏 --> <el-table :data="tableData"> <el-table-column prop="name" label="名称"></el-table-column> <el-table-column prop="phone" label="手机号" :class="{ &#39;hidden sm:table-cell&#39;: true }" ></el-table-column> </el-table> ``` 3. **栅格系统适配** ```html <el-row :gutter="20"> <el-col :xs="24" :sm="12" :md="8" :lg="6"> <!-- 卡片内容 --> </el-col> </el-row> ``` 4. **图片适配处理** ```css .responsive-img { max-width: 100%; height: auto; object-fit: cover; } ``` 5. **动态缩放处理** ```javascript // 使用resizeObserver监听容器变化 const container = ref(null) onMounted(() => { const observer = new ResizeObserver(entries => { entries.forEach(entry => { const { width } = entry.contentRect if(width < 600) { // 执行缩放逻辑 } }) }) observer.observe(container.value) }) ``` ### 最佳实践建议: 1. 使用`vw/vh`单位替代固定像素值 2. 关键断点设置:`375px`(手机)、`768px`(平板)、`1024px`(小屏PC)、`1280px`(大屏) 3. 复杂图表使用`echarts.resize()`方法 4. 表格添加横向滚动容器: ```css .table-wrapper { overflow-x: auto; @apply min-w-[800px]; /* 保证最小宽度 */ } ``` ### 调试技巧: 1. Chrome DevTools中切换设备模式 2. 使用`window.innerWidth`实时查看窗口尺寸 3. 添加临时边框辅助调试: ```css .debug * { border: 1px solid red !important; } ``` 完整适配方案需要结合具体业务场景,建议优先保证: - 关键信息在移动端的可读性 - 操作按钮的点击热区不小于44px - 文字字号不小于12px(移动端) - 复杂表格优先横向滚动而不是换行
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值