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

如何基于视口实现单次滚动自动定位到下一个section(共10个section)

视口滚动停靠效果实现方案

方案1:纯CSS原生滚动捕捉(优先推荐,无额外依赖)

原生CSS的滚动捕捉属性可以直接实现需求,不需要写JS,兼容性覆盖绝大多数主流浏览器。
首先调整你的HTML结构:你目前所有内容都包裹在同一个<section>标签内,需要将每个需要独立停靠的模块拆分为单独的<section>,示例结构如下:

<!-- 第1个停靠单元 -->
<section>
  <div class="fluid-container">
    <div class="row">
      <div class="ttd-banner">
        <img src="images/image-1.jpg">
        <div class="title">
          <h4>Heading</h4>
        </div>
      </div>
      <div class="container mt-20">
        <p>Lorem ipsum dolor sit amet</p>
      </div>
    </div>
  </div>
</section>

<!-- 第2个停靠单元 -->
<section>
  <div class="fluid-container">
    <div class="row">
      <div class="ttd-banner">
        <img src="images/image-1.jpg">
        <div class="title">
          <h4>Heading</h4>
        </div>
      </div>
      <div class="container mt-20">
        <p>Lorem ipsum dolor sit amet</p>
      </div>
    </div>
  </div>
</section>

<!-- 剩余8个停靠单元按照上述格式补充即可 -->

然后修改CSS样式:

/* 给滚动根容器配置滚动捕捉规则 */
html, body {
  height: 100%;
  overflow-y: auto;
  /* 纵向滚动,强制停靠到最近的捕捉点 */
  scroll-snap-type: y mandatory;
  /* 平滑滚动效果,可根据需求删除 */
  scroll-behavior: smooth;
  /* 去掉默认滚动边距 */
  margin: 0;
  padding: 0;
}

/* 每个停靠单元配置对齐规则 */
section {
  /* 可根据需求调整为固定高度,比如你原有内容高度总和,这里默认占满整个视口 */
  min-height: 100vh;
  /* 停靠时单元顶部和视口顶部对齐 */
  scroll-snap-align: start;
}

/* 原有样式保留 */
.ttd-banner{
  height:600px;
}

如果想要停靠更宽松,可以把scroll-snap-type: y mandatory改为scroll-snap-type: y proximity,只有滚动位置接近捕捉点时才会触发停靠。

方案2:JS实现(适配低版本浏览器场景)

如果需要兼容不支持CSS滚动捕捉的老旧浏览器,可以用JS监听滚动事件实现,代码如下:

// 锁定滚动状态,防止连续触发滚动
let isScrollLock = false;
// 获取所有停靠单元,如果你没有调整HTML结构,也可以把选择器改为'.row'
const sections = document.querySelectorAll('section');
const totalSection = sections.length;
// 当前停留的单元索引
let currentIndex = 0;

window.addEventListener('wheel', (e) => {
  // 滚动锁定状态下不触发逻辑
  if (isScrollLock) return;
  isScrollLock = true;

  // 向下滚动,索引+1,不超过最大数量
  if (e.deltaY > 0 && currentIndex < totalSection - 1) {
    currentIndex++;
  }
  // 向上滚动,索引-1,不小于0
  else if (e.deltaY < 0 && currentIndex > 0) {
    currentIndex--;
  }

  // 滚动到对应单元
  sections[currentIndex].scrollIntoView({
    behavior: 'smooth'
  });

  // 滚动动画结束后解锁,时长可根据实际动画效果调整
  setTimeout(() => {
    isScrollLock = false;
  }, 800);
}, { passive: false });

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 08:18:04