做运营长图或者专题页的时候,你大概见过这种效果:

  • 滑动屏幕的时候,有一个主体物在背景和前景层中穿梭。

GQ Lab、奈雪、一些品牌专题页都非常爱这种「错层滑动 / 层叠视差」的交互:
不炫技,但一看就有“杂志感”。

这篇就拆一段实际的 SVG 代码,看看——

不写一行 JS,
怎么用 纯 SVG + 少量 CSS 写出类似的错层滑动效果。

代码结构大致如下(节选精简版):


<section style="overflow:hidden;text-align:center;line-height:0;"> <!-- 1. 顶部无缝背景 --> <svg style='background-image:url("bg-top.png");background-size:100%;display:block;' viewBox="0 0 900 419"> </svg> <!-- 2. 顶部一张“置顶大图” --> <section style="height:0;line-height:0;overflow:visible;"> <svg style='background-image:url("top-cover.png");background-size:100%;display:inline;' viewBox="0 0 900 1737"> </svg> </section> <!-- 3. 中间可滚动区域:真正的“错层滑动”主体 --> <section style="width:100%;height:160vw;overflow-y:auto;overflow-x:hidden;margin-top:-1px;pointer-events:visible;"> <section style="overflow:hidden;max-width:100%;"> <!-- 背景长图 --> <section style="height:0;line-height:0;margin-top:-1px;"> <svg style='background-image:url("middle-bg.png");background-size:100%;display:block;' viewBox="0 0 900 1737"> </svg> </section> <!-- 多张“置顶卡片图”,叠在背景上 --> <svg style='background-image:url("card-1.png");background-size:100%;display:inline;' viewBox="0 0 900 1737"> </svg> <svg style='background-image:url("card-2.png");background-size:100%;display:inline;' viewBox="0 0 900 1737"> </svg> <!-- 结尾背景收尾 --> <section style="height:0;line-height:0;margin-top:-1px;"> <svg style='background-image:url("middle-end.png");background-size:100%;display:block;' viewBox="0 0 900 1737"> </svg> </section> <!-- 底部再叠几张“卡片图” --> <svg style='background-image:url("card-3.png");background-size:100%;display:inline;' viewBox="0 0 900 1737"> </svg> <svg style='background-image:url("card-4.png");background-size:100%;display:inline;' viewBox="0 0 900 1737"> </svg> </section> </section> </section>

原始代码来自 SVG 编辑器导出(比如 E2 编辑器的「纵向滑动 / 错层滑动」组件),这里做了适当精简,方便阅读和二次改造。

下面按技术点拆一下。


一、视觉结构:为什么它会有“错层”的感觉?

从视觉上看,这种效果一般有这几个特征:

  1. 背景是连续的、纵向的长图(类似海报 / 杂志页的拼接);

  2. 中间有几张“内容卡片”,像贴在长图上的海报;

  3. 滑动时,背景在滚动,前景的卡片看起来像是延迟、错位滑动,甚至短暂“停在”画面中间。

在这份 SVG 里,这种体验对应到三个图层:

  • 图层 A:无缝顶部背景
    用一个 viewBox="0 0 900 419" 的 <svg> 作为头图,构建开场氛围。

  • 图层 B:顶部“置顶大图”
    用一个零高容器 + 背景图 SVG 的组合,让这张大图看起来“贴在”顶部,而不是占正常文档流高度。

  • 图层 C:中间滚动区 + 多张叠层卡片
    整块区域有固定高度(height:160vw),内部可以滚动:

    • 背景是一张竖向长图;

    • 上面叠了多张 background-image 卡片;

    • 通过切图和排版,让这些卡片在视觉上形成“错层”。

没有任何 <animate>,完全靠滚动容器 + 图层叠加制造出“错层滑动”的幻觉。


二、关键技术点 01:零高容器(Zero-height Container)

你会看到很多这样的结构:


<section style="text-align:center;height:0;line-height:0;width:100%;margin:0 auto;overflow:visible;"> <svg style='background-image:url("xxx.png");background-size:100%;display:block;' viewBox="0 0 900 1737"> </svg> </section>

这里有几个关键细节:

  1. height: 0 + overflow: visible
    父容器本身在文档流中高度为 0,但里面的 <svg> 仍然可以“溢出”显示,
    相当于在当前滚动进度上“插一张悬浮的大图”。

  2. line-height: 0 + text-align: center

    • line-height: 0 防止富文本环境里出现额外空白;

    • text-align: center 可以让 <svg> 在大多数富文本容器内保持居中。

  3. background-image 驱动视觉,而不是 <img>
    SVG 本身当成“画布”,真实图片通过 background-image:url(...) 贴上去。
    这样做有几个好处:

    • 不受 <img> 默认行内元素的影响;

    • 可以以 viewBox 为基准做适配;

    • 配合 background-size:100% 可以快速撑满宽度。

这个“零高容器 + 溢出 SVG”是很多富文本平台做 SVG 交互时常用的技巧:
既不破坏原有排版,又能插入多个“错层图层”。


三、关键技术点 02:滚动容器 + 纵向长图

真正的“错层滑动”主体是这一段:


<section style="width:100%;height:160vw;overflow-y:auto;overflow-x:hidden;margin-top:-1px;pointer-events:visible;"> ... </section>

这里可以简单理解为:

  • height:160vw
    用视口宽度来控制高度,保证在不同屏幕比例下有接近的“可视区域高度”体验(特别是手机端);

  • overflow-y:auto
    只在这个容器内部滚动,外面看起来就像一块“可滚动的画布”嵌在页面里;

  • 内部的结构是:

    • 若干“零高背景图”;

    • 若干“卡片式置顶 SVG”。

通过切图与排版的配合,就能让用户在同一个滚动操作中看到:

  • 背景在连续滚;

  • 卡片在不同位置出现 / 错位叠出;

  • 有的卡片看起来像段落起始,有的像中途插图。

这个方案的重点其实不在“滚动算法”,而在切图+排版
SVG 只是一个性能还不错、适配力还不错的容器。


四、关键技术点 03:viewBox、背景图与像素密度

所有大图的 viewBox 都是:


viewBox="0 0 900 1737"

这背后有几个考虑:

  1. 统一坐标系
    所有错层卡片使用相同的 viewBox,方便在视觉设计阶段对齐。
    设计稿上哪一块是 900×1737,就直接按这个比例导出。

  2. 适配逻辑简单
    在前端层面只需 width:100% + background-size:100% 即可。
    只要保证素材本身分辨率够用,就能在高清屏上保持锐利感。

  3. 富文本平台友好
    不依赖 JS,也不用复杂的 object-fit / picture
    在公众号 / CSDN / 掘金这类平台中也能比较稳定地渲染。


五、为什么用 SVG 而不是纯 div + img?

同样的效果当然可以用 div + img + position 搞定,
但在很多“内容平台 / 富文本场景”里,SVG 有几个非常实际的优势:

  1. 单标签打包能力强
    很多平台对 <script> 和复杂 CSS 有限制,
    但对 <svg> 却相对宽松,允许你在一个标签里塞下比较复杂的渲染结构。

  2. 天然支持 viewBox 自适应
    不用写媒体查询;
    素材只要按照一个坐标体系输出即可。

  3. 适合复杂组件导出
    像这类“错层滑动”通常由编辑器 / 设计工具导出,
    输出成 SVG 之后,迁移到不同平台的成本会小很多。


六、这个动效在 E2 编辑器里的工程化封装(客观介绍)

上面的代码片段,最初是从 SVG 编辑器导出来再精简的。
如果你更习惯“所见即所得”的配置方式,可以顺带了解一下它在工具里的形态。

以 E2 编辑器为例,这类效果通常被封装为类似:

「纵向滑动 · 自定义 / 错层滑动」组件

从工程视角看,它大概做了这些事情:

  1. 封装滚动容器

    • 自动生成一个带 overflow-y:auto 的外层 section;

    • 高度可以按“多少屏”配置(比如 140vw、160vw 等),而不是手写 CSS。

  2. 图层管理

    • 背景长图 / 置顶卡片 / 上下收尾,
      都在 UI 面板里以图层形式呈现;

    • 设计侧只管排版和上传图片,不需要手写 <section> / <svg>

  3. 自动处理 viewBox 和比例

    • 通过读取图片分辨率自动设置 viewBox;

    • 解决新手常见的“拉伸 / 错位 / 留边”等问题。

  4. 导出为“可贴在内容平台”的 SVG 代码

    • 无需 JS;

    • 只包含 <section> + <svg> 结构;

    • 直接贴到支持 HTML 的内容编辑器里即可使用(如部分博客平台、低代码平台等)。

  5. 组件级复用

    • 设计师或运营可以把“错层滑动”作为一个模板反复使用;

    • 前端如果要深度定制,也可以在导出的 SVG 上再做二次开发。

这类组件一般属于编辑器里的“进阶动效 / 专业功能”,
适合经常需要做运营活动页、品牌专题页、杂志型图文的团队。


七、总结:错层滑动的本质,是内容编排 + 少量技术支撑

如果把这一整套效果抽象出来,其实就是四件事:

  1. 把内容拆成背景长图 + 多张卡片图

  2. 用一个高度有限、可内部滚动的容器承载它们;

  3. 把部分图层放进“零高容器”,制造“悬浮 / 错层”感;

  4. 用 SVG 当统一画布,解决适配与迁移问题。

你可以:

  • 直接照着上面的结构自己写一版;

  • 或者用类似 E2 这类 SVG 编辑器,把“错层滑动”当成一个现成组件,用图形界面拖一拖就能导出代码。

如果你对 SVG 交互感兴趣
错层滑动是一个非常适合作为练手 / 拆解对象的案例:
既有实际业务价值,又能把“滚动 + 图层 + 适配”这三个关键点一次练明白。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐