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

如何实现类似getrepeat.io的页面区块联动滚动效果?

实现区块联动滚动效果的方案

核心逻辑

要实现两个区块互相联动滚动,关键是监听各自的滚动事件,同步滚动位置,但要加标记避免事件循环触发。比如A滚动时同步B的位置,B滚动时同步A的位置,通过一个状态变量阻止重复触发的嵌套事件。

具体实现步骤

1. 基础HTML结构

假设两个滚动区块的结构如下:

<div class="scroll-block" id="blockA">
  <div class="block-content">
    <!-- 区块A的内容 -->
  </div>
</div>

<div class="scroll-block" id="blockB">
  <div class="block-content">
    <!-- 区块B的内容 -->
  </div>
</div>

2. CSS样式

给区块设置固定尺寸并开启滚动:

.scroll-block {
  width: 400px;
  height: 300px;
  overflow: auto;
  border: 1px solid #eee;
  margin: 1rem;
}

.block-content {
  height: 1200px; /* 足够长的内容触发滚动 */
}

3. JavaScript核心代码

用标记变量控制同步状态,避免循环触发:

const blockA = document.getElementById('blockA');
const blockB = document.getElementById('blockB');
let isSyncing = false;

// 监听A的滚动,同步到B
blockA.addEventListener('scroll', () => {
  if (!isSyncing) {
    isSyncing = true;
    // 同步纵向和横向滚动位置
    blockB.scrollTop = blockA.scrollTop;
    blockB.scrollLeft = blockA.scrollLeft;
    // 延迟重置标记,防止嵌套事件循环
    setTimeout(() => isSyncing = false, 10);
  }
});

// 监听B的滚动,同步到A
blockB.addEventListener('scroll', () => {
  if (!isSyncing) {
    isSyncing = true;
    blockA.scrollTop = blockB.scrollTop;
    blockA.scrollLeft = blockB.scrollLeft;
    setTimeout(() => isSyncing = false, 10);
  }
});

4. 适配内容比例不同的场景

如果两个区块的内容高度/宽度不一致,可以按滚动比例同步,保证滚动进度一致:

// 按比例同步纵向滚动
const scrollRatioA = blockA.scrollTop / (blockA.scrollHeight - blockA.clientHeight);
blockB.scrollTop = scrollRatioA * (blockB.scrollHeight - blockB.clientHeight);

注意事项

  • 确保两个区块的滚动方向一致(同为纵向或横向),混合方向需单独处理对应属性。
  • 延迟重置标记的时间可根据实际场景微调,平衡同步及时性和循环避免效果。
  • 若使用React、Vue等框架,可将逻辑放到组件生命周期中,用状态变量替代全局标记。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 07:15:50