横向滚动画廊特效(竖向滚动驱动横向平移,含进度条)

JSCSS 许可:自研原创

横向滚动画廊:竖向滚动驱动画廊横向平移,经典「横向走廊」浏览体验,底部渐变进度条实时反馈,sticky 定位 + transform 实现,零依赖自研。

效果演示(真实可交互)

➡️ 向下滚动:画廊横向平移,形成「横向走廊」浏览体验

01极光
02星云
03沙丘
04雨林
05冰川
06熔岩
🏁 已到达终点,共 6 幅作品

演示区用内嵌滚动容器模拟页面滚动:向下滚动时画廊横向平移,滚动到一半时到达「终点页」。底部渐变进度条实时显示横向进度。

完整代码

<div class="hg-scroller">
  <div class="hg-stage">
    <div class="hg-view">
      <div class="hg-track" id="hgTrack">
        <div class="hg-card">01 极光</div>
        <!-- 更多卡片…… -->
      </div>
    </div>
  </div>
</div>
.hg-scroller { height: 460px; overflow-y: auto; }
.hg-stage { height: 920px; }          /* 视口两倍:一半平移、一半收尾 */
.hg-view { position: sticky; top: 0; height: 460px; overflow: hidden; }
.hg-track { display: flex; gap: 20px; will-change: transform; }
function update() {
  const max = scroller.scrollHeight - scroller.clientHeight;
  const p = max > 0 ? scroller.scrollTop / max : 0;
  const maxDist = track.scrollWidth - scroller.clientWidth;
  track.style.transform = `translateX(${-p * maxDist}px)`;
}
scroller.addEventListener('scroll', update, { passive: true });

实现要点:position: sticky 让画廊视口在滚动过程中「钉」在容器顶部,竖向滚动距离按比例换算成横向平移量 -p × maxDist。舞台高度设为视口两倍:前半段完成平移,后半段露出终点页。整页使用同理,把滚动容器换成 window。

参数说明

参数位置说明
卡片数量/宽度.hg-card 的 flex-basis决定平移总距离 maxDist
舞台高度.hg-stage 的 height视口 1.5-2 倍,越大平移越慢
平移换算-p * maxDist滚动进度 × 总距离,线性映射
进度条.hg-fill 宽度可选装饰,横向进度反馈
监听对象window / 容器元素整页或局部容器滚动

兼容性与性能

常见问题

Q: 为什么叫「横向走廊」? 因为视觉上像在走廊里横移浏览:竖向滚动被「翻译」成横向位移,浏览完一组作品后自动进入下一屏,叙事感强,适合作品集与案例展示。

Q: sticky 在部分安卓浏览器上失效? 极老机型存在此问题。可退化方案:用 position: fixed + JS 同步容器位置,或直接降级为普通横向滚动;现代浏览器均正常。

Q: 平移距离和滚动距离对不上? 检查 maxDist 计算是否在卡片布局完成后执行:scrollWidth 需在图片/字体加载后读取,建议在 resize 与 load 时重算。

Q: 可以商用吗? 可以。本组件为粤喵自研原创代码,免费商用无需署名,无任何协议限制。

许可与来源

  • 许可证:自研原创 —— 粤喵自研原创,可免费用于个人与商业项目,无需署名。查看来源公示与许可清单
  • 来源:粤喵团队原创自研(从效果思路到代码实现均为独立完成,未直接复制第三方代码)
  • 首次发布:2026-09-01 · 最近更新:2026-09-01
  • 修改日志:2026-09-01 首次发布;2026-09-13 补充许可证与来源标注、复制按钮说明与法务页入口
  • 纠错:联系页面 / min@cactus.asia,2 个工作日内核实处理

常见问题

这个组件可以商用吗?

可以。本组件为粤喵自研原创,可免费用于个人和商业项目,无需署名。

浏览器兼容性如何?

支持所有现代浏览器(Chrome / Firefox / Safari / Edge 最新版本)。旧版 IE 不支持 CSS 动画相关特性。

怎么修改动画参数?

直接调整 CSS 中的 animation-duration(时长)、animation-timing-function(缓动曲线)等属性即可,代码中有注释说明。

✍️ 作者与审核