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

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

 

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在Vue 3中实现点击上下滚动,你可以使用`ref`来绑定滚动容器,并通过`scrollTo`方法来实现滚动效果。以下是一个简单的示例代码: 1. 首先,在你的Vue组件中,使用`ref`创建一个滚动容器的引用: ```javascript import { ref } from 'vue'; export default { setup() { const scrollContainer = ref(null); // 点击上按钮滚动到上方 const scrollUp = () => { scrollContainer.value.scrollTop -= 100; // 根据需要调整滚动距离 }; // 点击下按钮滚动到下方 const scrollDown = () => { scrollContainer.value.scrollTop += 100; // 根据需要调整滚动距离 }; return { scrollContainer, scrollUp, scrollDown }; } } ``` 2. 在Vue组件的模板中,绑定滚动容器和点击事件: ```html <template> <div> <button @click="scrollUp">上</button> <button @click="scrollDown">下</button> <div ref="scrollContainer" class="scroll-container"> <!-- 滚动内容 --> </div> </div> </template> ``` 3. 最后,确保给滚动容器添加样式,以便显示滚动条并限制容器高度: ```css .scroll-container { overflow-y: scroll; max-height: 300px; /* 根据需要调整容器高度 */ } ``` 在上面的代码中,我们使用`ref`来创建了一个名为`scrollContainer`的引用,并在模板中使用`ref`指令将其绑定到滚动容器元素上。然后,我们定义了`scrollUp`和`scrollDown`方法来处理点击事件,并通过修改滚动容器的`scrollTop`属性来实现滚动效果。 请注意,你可以根据实际需要调整滚动距离和容器高度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值