当前位置:   article > 正文

vue3(实现上下无限来往滚动)_vue自动滚动,上下往复

vue自动滚动,上下往复

一、问题描述

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

二、效果

三、demo代码

  1. <template>
  2. <div class="clean-con" @mouseenter="stopAutoScroll" @mouseleave="startAutoScroll">
  3. <div class="clean-main" ref="mainRef">
  4. <div class="clean-item"></div>
  5. <div class="clean-item"></div>
  6. <div class="clean-item"></div>
  7. <div class="clean-item"></div>
  8. <div class="clean-item"></div>
  9. <div class="clean-item"></div>
  10. <div class="clean-item"></div>
  11. <div class="clean-item"></div>
  12. <div class="clean-item"></div>
  13. <div class="clean-item"></div>
  14. </div>
  15. </div>
  16. </template>
  17. <script setup>
  18. import { ref, onMounted } from 'vue';
  19. const mainRef = ref(null);
  20. let isAutoScrolling = true;
  21. const stopAutoScroll = () => {
  22. isAutoScrolling = false;
  23. }
  24. const startAutoScroll = () => {
  25. isAutoScrolling = true;
  26. autoScroll();
  27. }
  28. const autoScroll = () => {
  29. if (!isAutoScrolling) return;
  30. const mainEl = mainRef.value;
  31. mainEl.scrollTop += 1; // 每次滚动的距离
  32. if (mainEl.scrollTop >= mainEl.scrollHeight - mainEl.clientHeight) {
  33. setTimeout(() => {
  34. mainEl.scrollTo({ top: 0, behavior: 'smooth' });
  35. setTimeout(autoScroll, 2000); // 2秒后再次滚动到底部
  36. }, 1000); // 暂停1秒后开始快速滚回顶部
  37. } else {
  38. requestAnimationFrame(autoScroll);
  39. }
  40. }
  41. onMounted(() => {
  42. startAutoScroll();
  43. });
  44. </script>
  45. <style>
  46. .clean-con {
  47. overflow: hidden;
  48. padding: 20px;
  49. width: 400px;
  50. height: 700px;
  51. background-color: #000;
  52. }
  53. .clean-main {
  54. overflow-y: scroll;
  55. height: 700px;
  56. }
  57. .clean-item {
  58. height: 200px;
  59. background-color: #7c5c5c;
  60. margin-top: 20px;
  61. }
  62. .clean-item:last-child {
  63. background-color: aqua !important;
  64. }
  65. </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。这会导致主区域快速滚动到底部,形成了一个循环滚动的效果。

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

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/700504
推荐阅读
相关标签
  

闽ICP备14008679号