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

如何实现随页面滚动的圆圈同步彩色线条沿背景线滚动效果

实现随滚动圆圈同步移动的同色线条

现有带背景线的区块,背景线上的圆圈随页面滚动移动,需添加一条与圆圈同色的线条,跟随圆圈沿背景线同步滚动。

修改后的完整代码

HTML

<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.0/css/bootstrap.min.css" integrity="sha512-t4GWSVZO1eC8BM339Xd7Uphw5s17a86tIZIj8qRxhnKub6WoyhnrxeCIMeAqBPgdZGlCcG2PrZjMc+Wr78+5Xg==" crossorigin="anonymous" referrerpolicy="no-referrer" />
<div class="block1"></div>
<div class="block2">
  <div class="circle"></div>
  <div class="case">
    <div class="row">
      <div class="col-5 text">Text 1</div>
      <div class="col-2"></div>
      <div class="col-5 text">Text 1</div>
    </div>
  </div>
  <div class="case">
    <div class="row">
      <div class="col-5 text">Text 2</div>
      <div class="col-2"></div>
      <div class="col-5 text">Text 2</div>
    </div>
  </div>
  <div class="case">
    <div class="row">
      <div class="col-5 text">Text 3</div>
      <div class="col-2"></div>
      <div class="col-5 text">Text 3</div>
    </div>
  </div>
</div>
<div class="block3"></div>

CSS

.block1 {
  height: 200px;
  background-color: gray;
}

.block3 {
  height: 600px;
  background-color: gray;
}

.block2 {
  height: 100%;
  position: relative;
  background: linear-gradient(214deg, rgba(79, 142, 255, 0) 0%, #f5e550 10%, #f5e550 90%, rgba(79, 142, 255, 0) 100%) center/3px calc(100% - 100px) no-repeat;
}

/* 新增跟随线条 */
.block2::after {
  content: "";
  position: absolute;
  left: 50%;
  transform: translateX(-50%);
  width: 3px;
  background-color: #4f8eff;
  top: 50px;
  bottom: 50px;
  clip-path: inset(0 0 calc(100% - var(--line-height, 0px)) 0);
}

.block2 .circle {
  background: #4f8eff;
  width: 17px;
  height: 17px;
  left: 50%;
  transform: translate(-50%, -50%);
  position: absolute;
  border-radius: 50%;
  z-index: 3;
}

/* 圆圈内部白色圆心 */
.block2 .circle::before {
  content: "";
  position: absolute;
  inset: 3px;
  background-color: white;
  border-radius: 50%;
}

.text {
  text-align: center;
  padding: 200px 50px;
}

JavaScript

const circle = document.querySelector(".circle");
const cases = document.querySelectorAll(".case");
const block2 = document.querySelector(".block2");

circle.style.transition = ""

const handleScroll = () => {
  const { height: blockHeight } = block2.getBoundingClientRect()
  const maxTop = cases[cases.length - 1].offsetTop + cases[cases.length - 1].offsetHeight - 200
  const minTop = cases[0].offsetTop
  let { height: startTop } = cases[0].getBoundingClientRect()
  const scrollDist = Math.min(maxTop, Math.max(startTop / 2 + window.scrollY, minTop))

  circle.style.top = `${scrollDist}px`
  
  // 计算线条显示高度,同步跟随圆圈位置
  const lineHeight = scrollDist - 50; // 50是背景线的顶部偏移量
  block2.style.setProperty('--line-height', `${lineHeight}px`)
}

const handleWindowSizeAndScroll = () => {
  window.removeEventListener("scroll", handleScroll)
  window.removeEventListener("resize", handleScroll)
  window.addEventListener("scroll", handleScroll)
  window.addEventListener("resize", handleScroll)
}

handleScroll()
handleWindowSizeAndScroll()
window.addEventListener("resize", handleWindowSizeAndScroll)

关键修改说明

  • 给.block2添加::after伪元素作为跟随线条,利用clip-path属性动态裁剪线条显示长度,通过CSS变量--line-height控制裁剪位置
  • 重构圆圈的::before伪元素样式,仅保留白色圆心,避免原有样式冲突
  • 在滚动处理函数中,计算线条需要显示的高度,通过设置CSS变量同步更新线条裁剪位置,实现和圆圈的同步移动

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 19:44:59