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

实现左右并排div同步滚动功能(类似Beyond Compare滚动)

实现左右Div同步滚动(类似Beyond Compare效果)

嘿,这个需求我之前做对比类工具的时候正好实现过!Beyond Compare的同步滚动确实能极大提升内容对比的体验,用原生JavaScript就能轻松搞定,不用依赖任何框架。我给你两种方案,你可以根据自己的场景选择:

方案1:基础像素同步(内容高度一致时首选)

这种方案适合左右div内容高度差不多的情况,直接同步滚动的像素值,简单直观。

完整代码示例

<!-- 先给两个div加个容器让它们并排显示 -->
<div class="compare-container">
  <div id="leftdiv" class="scrollable-div">
    <p>Left Content Line 1</p>
    <p>Left Content Line 2</p>
    <p>Left Content Line 3</p>
    <p>Left Content Line 4</p>
    <p>Left Content Line 5</p>
    <p>Left Content Line 6</p>
    <p>Left Content Line 7</p>
    <p>Left Content Line 8</p>
    <p>Left Content Line 9</p>
    <p>Left Content Line 10</p>
    <p>Left Content Line 11</p>
    <p>Left Content Line 12</p>
  </div>
  <div id="rightdiv" class="scrollable-div">
    <p>Right Content Line 1</p>
    <p>Right Content Line 2</p>
    <p>Right Content Line 3</p>
    <p>Right Content Line 4</p>
    <p>Right Content Line 5</p>
    <p>Right Content Line 6</p>
    <p>Right Content Line 7</p>
    <p>Right Content Line 8</p>
    <p>Right Content Line 9</p>
    <p>Right Content Line 10</p>
    <p>Right Content Line 11</p>
    <p>Right Content Line 12</p>
  </div>
</div>

<style>
.compare-container {
  display: flex;
  gap: 20px; /* 两个div之间的间距,可按需调整 */
}

.scrollable-div {
  width: 300px;
  height: 300px;
  overflow-y: scroll;
  border: 1px solid #ccc;
  padding: 10px;
}
</style>

<script>
const leftDiv = document.getElementById('leftdiv');
const rightDiv = document.getElementById('rightdiv');

// 滚动左侧时同步右侧
leftDiv.addEventListener('scroll', () => {
  rightDiv.scrollTop = leftDiv.scrollTop;
});

// 可选:如果需要滚动右侧时也同步左侧,就加上这段
rightDiv.addEventListener('scroll', () => {
  leftDiv.scrollTop = rightDiv.scrollTop;
});
</script>

原理说明

核心就是利用元素的scrollTop属性——这个属性表示元素内容向上滚动的像素值。当监听其中一个div的滚动事件时,把它的scrollTop值赋值给另一个div,就能实现同步滚动了。


方案2:比例同步(内容高度不同时首选)

如果左右div的内容高度差异较大,像素同步会出现一方先滚到底、另一方还没到的情况,这时候用比例同步更贴合Beyond Compare的体验:保持两个div的滚动进度一致(比如左边滚到50%,右边也滚到50%)。

修改后的JS代码

把方案1里的JS部分换成下面这段即可:

const leftDiv = document.getElementById('leftdiv');
const rightDiv = document.getElementById('rightdiv');

// 左侧滚动时同步右侧比例
leftDiv.addEventListener('scroll', () => {
  // 计算左侧的滚动比例:已滚动高度 / 可滚动总高度
  const leftScrollRatio = leftDiv.scrollTop / (leftDiv.scrollHeight - leftDiv.clientHeight);
  // 根据比例计算右侧应该滚动的高度
  rightDiv.scrollTop = leftScrollRatio * (rightDiv.scrollHeight - rightDiv.clientHeight);
});

// 右侧滚动时同步左侧比例
rightDiv.addEventListener('scroll', () => {
  const rightScrollRatio = rightDiv.scrollTop / (rightDiv.scrollHeight - rightDiv.clientHeight);
  leftDiv.scrollTop = rightScrollRatio * (leftDiv.scrollHeight - leftDiv.clientHeight);
});

原理说明

这里用到了两个关键属性:

  • scrollHeight:元素内容的总高度(包括超出可视区域的部分)
  • clientHeight:元素的可视高度
    通过scrollTop / (scrollHeight - clientHeight)可以计算出当前的滚动进度比例(0到1之间),再用这个比例乘以另一个div的可滚动总高度,就能实现按比例同步滚动了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:16:21