You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现页面滚动时初始100%宽度的div逐渐缩小的效果

滚动缩小Div宽度实现方案

问题根源

你现有代码的宽度计算逻辑为「滚动距离越大,宽度取值越大」,和你需要的「初始满宽、滚动缩小」的需求逻辑完全反向,同时缺少初始宽度设置,导致页面加载时状态不符合预期。

修正后完整代码

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>Scroll Shrink Div Demo</title>
    <style>
      * {
        margin: 0;
        padding: 0;
      }
      #animatedDiv {
        background: #dc143c;
        min-height: 9000px;
        width: 100%;
        min-width: 20%;
        position: absolute;
        top: 0;
        left: 0;
      }
    </style>
  </head>
  <body>
    <div id="animatedDiv"></div>
    <script>
      const aDiv = document.getElementById("animatedDiv");
      // 缩小速度系数,值越大缩小速度越慢
      const SHRINK_RATE = 4;
      // 最小宽度阈值,单位%
      const MIN_WIDTH = 20;

      function updateDivWidth() {
        const scrollTop = window.pageYOffset;
        const shrinkOffset = scrollTop / SHRINK_RATE;
        // 宽度值限制在20%~100%区间,滚动距离越大宽度越小
        const targetWidth = Math.min(Math.max(100 - shrinkOffset, MIN_WIDTH), 100);
        aDiv.style.width = `${targetWidth}%`;
      }

      window.addEventListener("scroll", () => {
        requestAnimationFrame(updateDivWidth);
      }, false);

      // 初始化执行一次,适配刷新后页面不在顶部的场景
      updateDivWidth();
    </script>
  </body>
</html>

关键修改点

  • 初始样式给目标div设置width: 100%,保证页面加载时默认是满宽状态
  • 反转宽度计算逻辑:用100%减去滚动距离换算的偏移值,实现滚动距离越大、宽度越小的效果
  • 保留宽度区间限制:确保宽度始终在20%~100%之间,不会出现超出范围的异常值
  • 新增初始化执行逻辑:如果用户刷新页面时停留在非顶部位置,也能正确显示对应宽度
  • 增加默认边距重置和div定位修正,避免默认浏览器边距导致的横向滚动条问题
  • 你可以自行修改SHRINK_RATE调整缩小速度,修改MIN_WIDTH调整最小宽度阈值

内容的提问来源于stack exchange,提问作者TechDev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 14:27:34