原生js写数据自动纵向滚动,鼠标移入后停止滚动可手动滚动,鼠标移出转自动

html 复制代码
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>滚动页面</title>
  <link rel="stylesheet" href="styles.css">
  <style>
    body,
    html {
      margin: 0;
      padding: 0;
      overflow: hidden;
    }

    #scrollContainer {
      width: 100%;
      height: 100vh;
      overflow: hidden;
      position: relative;
    }

    #scrollContent {
      display: flex;
      flex-direction: column;
      transition: transform 0.3s ease;
    }

    .item {
      width: 100%;
      height: 100vh;
      display: flex;
      justify-content: center;
      align-items: center;
      font-size: 5em;
      color: white;
    }

    .item:nth-child(odd) {
      background-color: #333;
    }

    .item:nth-child(even) {
      background-color: #666;
    }
  </style>
</head>

<body>
  <div id="scrollContainer">
    <div id="scrollContent">
      <div class="item">1</div>
      <div class="item">2</div>
      <div class="item">3</div>
      <div class="item">4</div>
      <div class="item">5</div>
    </div>
  </div>
</body>

<script>
  const scrollContainer = document.getElementById('scrollContainer');
  const scrollContent = document.getElementById('scrollContent');
  
  let currentPosition = 0;
  let intervalId = null;
  const scrollDistance = 2;
  const itemHeight = scrollContent.clientHeight / scrollContent.children.length;
  const maxScrollPosition = 0;
  const minScrollPosition = -itemHeight * (scrollContent.children.length - 1);

  function autoScroll() {
    if (currentPosition <= minScrollPosition) {
      currentPosition = 0;
    }
    scrollContent.style.transform = `translateY(${currentPosition}px)`;
    currentPosition -= scrollDistance;
  }

  function startAutoScroll() {
    intervalId = setInterval(autoScroll, 20);
  }

  function stopAutoScroll() {
    clearInterval(intervalId);
  }

  function handleWheel(event) {
    currentPosition -= event.deltaY;
    if (currentPosition > maxScrollPosition) {
      currentPosition = maxScrollPosition;
    } else if (currentPosition < minScrollPosition) {
      currentPosition = minScrollPosition;
    }
    scrollContent.style.transform = `translateY(${currentPosition}px)`;
  }

  scrollContainer.addEventListener('mouseenter', function () {
    stopAutoScroll();
    scrollContainer.addEventListener('wheel', handleWheel);
  });

  scrollContainer.addEventListener('mouseleave', function () {
    scrollContainer.removeEventListener('wheel', handleWheel);
    startAutoScroll();
  });

  startAutoScroll();
</script>

</html>
  • 初始化变量(currentPositionintervalIdscrollDistanceitemHeightmaxScrollPositionminScrollPosition),用于跟踪滚动状态和动画。
  • autoScroll()函数持续地将scrollContent向上移动(translateY),直到达到minScrollPosition,然后重置。
  • startAutoScroll()stopAutoScroll()函数通过setIntervalclearInterval控制自动滚动动画。
  • handleWheel(event)函数根据鼠标滚轮事件(wheel)调整currentPosition,确保滚动保持在maxScrollPositionminScrollPosition定义的范围内。
  • scrollContainer上的事件监听器(mouseentermouseleave)触发自动滚动停止/开始,并启用/禁用通过鼠标滚轮进行手动滚动。
  • mouseenter时,自动滚动停止,并且可以通过鼠标滚轮进行手动滚动。
  • mouseleave时,手动滚动停止,并且自动滚动恢复。
  • #scrollContent中的每个项目占满视口高度,页面可以通过自动或手动方式平滑滚动这些项目。
相关推荐
默默学前端17 分钟前
ES6模板语法与字符串处理详解
前端·ecmascript·es6
lxh011325 分钟前
记忆函数 II 题解
前端·javascript
我不吃饼干32 分钟前
TypeScript 类型体操练习笔记(三)
前端·typescript
华仔啊35 分钟前
除了防抖和节流,还有哪些 JS 性能优化手段?
前端·javascript·vue.js
CHU72903543 分钟前
随时随地学新知——线上网课教学小程序前端功能详解
前端·小程序
清粥油条可乐炸鸡1 小时前
motion入门教程
前端·css·react.js
这是个栗子1 小时前
【Vue3项目】电商前台项目(四)
前端·vue.js·pinia·表单校验·面包屑导航
前端Hardy1 小时前
Electrobun 正式登场:仅 12MB,JS 桌面开发迎来轻量化新方案!
前端·javascript·electron
树上有只程序猿1 小时前
新世界的入场券,不再只发给程序员
前端·人工智能
confiself1 小时前
deer-flow前端分析
前端