用 SVG 写出 GQ 和奈雪都爱的「错层滑动」效果
本文介绍了一种纯SVG+CSS实现的「错层滑动/层叠视差」交互效果,无需JavaScript即可创建杂志风格的专题页。核心技术包括:1) 使用零高容器(Zero-height Container)实现悬浮图层效果;2) 通过固定高度的滚动容器和纵向长图制造视觉错层;3) 统一viewBox确保各元素适配性。相比传统div+img方案,SVG方案具有单标签打包能力强、天然支持自适应等优势。文章还展示
做运营长图或者专题页的时候,你大概见过这种效果:
-
滑动屏幕的时候,有一个主体物在背景和前景层中穿梭。
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 编辑器的「纵向滑动 / 错层滑动」组件),这里做了适当精简,方便阅读和二次改造。
下面按技术点拆一下。
一、视觉结构:为什么它会有“错层”的感觉?
从视觉上看,这种效果一般有这几个特征:
-
背景是连续的、纵向的长图(类似海报 / 杂志页的拼接);
-
中间有几张“内容卡片”,像贴在长图上的海报;
-
滑动时,背景在滚动,前景的卡片看起来像是延迟、错位滑动,甚至短暂“停在”画面中间。
在这份 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>
这里有几个关键细节:
-
height: 0+overflow: visible
父容器本身在文档流中高度为 0,但里面的<svg>仍然可以“溢出”显示,
相当于在当前滚动进度上“插一张悬浮的大图”。 -
line-height: 0+text-align: center-
line-height: 0防止富文本环境里出现额外空白; -
text-align: center可以让<svg>在大多数富文本容器内保持居中。
-
-
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"
这背后有几个考虑:
-
统一坐标系
所有错层卡片使用相同的 viewBox,方便在视觉设计阶段对齐。
设计稿上哪一块是 900×1737,就直接按这个比例导出。 -
适配逻辑简单
在前端层面只需width:100%+background-size:100%即可。
只要保证素材本身分辨率够用,就能在高清屏上保持锐利感。 -
富文本平台友好
不依赖 JS,也不用复杂的object-fit/picture,
在公众号 / CSDN / 掘金这类平台中也能比较稳定地渲染。
五、为什么用 SVG 而不是纯 div + img?
同样的效果当然可以用 div + img + position 搞定,
但在很多“内容平台 / 富文本场景”里,SVG 有几个非常实际的优势:
-
单标签打包能力强
很多平台对<script>和复杂 CSS 有限制,
但对<svg>却相对宽松,允许你在一个标签里塞下比较复杂的渲染结构。 -
天然支持 viewBox 自适应
不用写媒体查询;
素材只要按照一个坐标体系输出即可。 -
适合复杂组件导出
像这类“错层滑动”通常由编辑器 / 设计工具导出,
输出成 SVG 之后,迁移到不同平台的成本会小很多。
六、这个动效在 E2 编辑器里的工程化封装(客观介绍)
上面的代码片段,最初是从 SVG 编辑器导出来再精简的。
如果你更习惯“所见即所得”的配置方式,可以顺带了解一下它在工具里的形态。
以 E2 编辑器为例,这类效果通常被封装为类似:
「纵向滑动 · 自定义 / 错层滑动」组件

从工程视角看,它大概做了这些事情:
-
封装滚动容器
-
自动生成一个带
overflow-y:auto的外层 section; -
高度可以按“多少屏”配置(比如 140vw、160vw 等),而不是手写 CSS。
-
-
图层管理
-
背景长图 / 置顶卡片 / 上下收尾,
都在 UI 面板里以图层形式呈现; -
设计侧只管排版和上传图片,不需要手写
<section>/<svg>。
-
-
自动处理 viewBox 和比例
-
通过读取图片分辨率自动设置 viewBox;
-
解决新手常见的“拉伸 / 错位 / 留边”等问题。
-
-
导出为“可贴在内容平台”的 SVG 代码
-
无需 JS;
-
只包含
<section> + <svg>结构; -
直接贴到支持 HTML 的内容编辑器里即可使用(如部分博客平台、低代码平台等)。
-
-
组件级复用
-
设计师或运营可以把“错层滑动”作为一个模板反复使用;
-
前端如果要深度定制,也可以在导出的 SVG 上再做二次开发。
-
这类组件一般属于编辑器里的“进阶动效 / 专业功能”,
适合经常需要做运营活动页、品牌专题页、杂志型图文的团队。
七、总结:错层滑动的本质,是内容编排 + 少量技术支撑
如果把这一整套效果抽象出来,其实就是四件事:
-
把内容拆成背景长图 + 多张卡片图;
-
用一个高度有限、可内部滚动的容器承载它们;
-
把部分图层放进“零高容器”,制造“悬浮 / 错层”感;
-
用 SVG 当统一画布,解决适配与迁移问题。
你可以:
-
直接照着上面的结构自己写一版;
-
或者用类似 E2 这类 SVG 编辑器,把“错层滑动”当成一个现成组件,用图形界面拖一拖就能导出代码。
如果你对 SVG 交互感兴趣,
错层滑动是一个非常适合作为练手 / 拆解对象的案例:
既有实际业务价值,又能把“滚动 + 图层 + 适配”这三个关键点一次练明白。
更多推荐


所有评论(0)