Slidev 全局图层(Global Layers):用 global-top / global-bottom / slide-top / slide-bottom 构建跨页持续组件

发布时间:2026/9/8 22:23:31

Slidev 全局图层(Global Layers):用 global-top / global-bottom / slide-top / slide-bottom 构建跨页持续组件
Slidev 全局图层Global Layers用 global-top / global-bottom / slide-top / slide-bottom 构建跨页持续组件【免费下载链接】slidevPresentation Slides for Developers项目地址: https://gitcode.com/GitHub_Trending/sl/slidev本文以 Slidev 官方文档 Global Layers 为核心系统讲解如何用global-top.vue、global-bottom.vue、slide-top.vue、slide-bottom.vue和custom-nav-controls.vue五个约定文件为演示文稿添加页脚、跨页动画、全局特效与自定义导航按钮并结合仓库中虚拟模块生成逻辑与导出命令的源码说明图层的挂载位置、z 轴层级、条件渲染以及--per-slide导出参数背后的实现原理。一、什么是全局图层Global Layers在 Slidev 中每一页幻灯片的内容是独立的翻页时上一页组件会被卸载或隐藏写在某页 Markdown 里的 DOM 无法自然地“活”到下一页。全局图层Global Layers解决了这个问题——它允许你定义**跨页持续存在persist across slides**的自定义组件典型用途包括所有页面通用的页脚署名、版权信息、页码跨越多个页面的连续动画或全局特效固定在页面上的导航状态指示器追加到内置导航栏NavControls中的自定义控制按钮。Slidev 通过“约定文件名 自动拾取pick up automatically”的机制实现这一点只要在项目根目录下创建特定名称的文件构建系统就会自动发现并挂载它们无需任何手动 import 或配置。二、五个图层文件及其作用范围根据 docs/features/global-layers.mdSlidev 提供两类图层1. 全局图层单实例在项目根目录创建以下文件即被自动拾取文件作用范围实例数global-top.vue浮在所有幻灯片之上1 个整个演示文稿global-bottom.vue位于所有幻灯片之下1 个整个演示文稿custom-nav-controls.vue渲染进 NavControls 导航栏1 个2. 每页图层Per-slide 实例文件作用范围实例数slide-top.vue浮在每一页幻灯片之上每一页一个实例slide-bottom.vue位于每一页幻灯片之下每一页一个实例每页图层的用法与全局图层相同但区别在于它们会被应用到每一页上因此同时存在多个实例。这一点在源码中可以得到印证SlideTop/SlideBottom是在单个页面的包裹组件 SlideWrapper.vue 内部渲染的——由于每个幻灯片路由对应一个SlideWrapper每页自然各持有一份实例而GlobalTop/GlobalBottom则在页面集合的容器 SlidesShow.vue 级别渲染一次整个演示文稿只有单实例。三、z 轴层级关系Layers relationship原文档明确了五层内容在 z 轴上从上到下的堆叠顺序NavControls自定义导航控件custom-nav-controls.vueGlobal Topglobal-top.vue— 单实例Slide Topslide-top.vue— 每页一个实例Slide Content幻灯片正文内容Slide Bottomslide-bottom.vue— 每页一个实例Global Bottomglobal-bottom.vue— 单实例源码层面的印证Slidev 默认不依赖显式 z-index而是靠DOM 顺序后出现者叠在上方来实现上述层级在 SlidesShow.vue 中DOM 顺序为先渲染GlobalBottom /再渲染幻灯片容器#slideshow最后渲染GlobalTop /——因此 GlobalBottom 在最底层、GlobalTop 压在所有幻灯片之上在 SlideWrapper.vue 中页面内部的 DOM 顺序为SlideBottom /→ 当前页组件component :isprops.route.component /→SlideTop /——即 SlideTop 压在本页内容上SlideBottom 位于本页内容之下NavControls.vue 在导航栏末尾渲染CustomNavControls /导航栏本身位于全局图层之上与文档描述的层级一致。理解这套层级关系后可以按“贴近内容的程度”选择图层需要压住页面内容如进度条覆盖层用slide-top.vue需要垫在内容下方如背景纹理用slide-bottom.vue需要覆盖整个演示文稿包括页面切换动画之外的固定区域则用global-top.vue/global-bottom.vue。四、完整使用示例以下示例完整继承自官方文档 docs/features/global-layers.md。1. 最简单的页脚global-bottom.vue!-- global-bottom.vue -- template footer classabsolute bottom-0 left-0 right-0 p-2Your Name/footer /template创建该文件后Your Name文本会出现在所有幻灯片上。类名absolute bottom-0 left-0 right-0 p-2是 UnoCSS 原子类效果等价于绝对定位贴底、左右拉伸、内边距 0.5rem。2. 自定义导航按钮custom-nav-controls.vue!-- custom-nav-controls -- template button classicon-btn titleNext click$nav.next div classi-carbon:arrow-right / /button /template该按钮会出现在 NavControls 导航栏中源码中渲染位置见 NavControls.vue 第 196 行。$nav是 Slidev 注入的全局导航上下文$nav.next即触发翻页图标类i-carbon:arrow-right来自 UnoCSS 图标集合。3. 基于导航状态的条件渲染若图层组件需要根据当前导航状态决定显隐可以使用 全局上下文Global Context。文档给出了三个典型例子从第 4 页隐藏页脚!-- hide the footer from Page 4 -- template footer v-if$nav.currentPage ! 4 classabsolute bottom-0 left-0 right-0 p-2 Your Name /footer /template在cover布局页隐藏页脚!-- hide the footer from cover layout -- template footer v-if$nav.currentLayout ! cover classabsolute bottom-0 left-0 right-0 p-2 Your Name /footer /template一个带页码的页脚封面页除外!-- an example footer for pages -- template footer v-if$nav.currentLayout ! cover classabsolute bottom-0 left-0 right-0 p-2 {{ $nav.currentPage }} / {{ $nav.total }} /footer /template在 Presenter 模式下隐藏自定义按钮!-- custom-nav-controls -- !-- hide the button in Presenter mode -- template button v-if!$nav.isPresenter classicon-btn titleNext click$nav.next div classi-carbon:arrow-right / /button /template$nav上下文在模板中直接可用如果在script setup中需要编程式访问可按 docs/guide/global-context.md 中的方式通过useNav()解构currentPage、currentLayout、currentFrontmatter、currentSlideRoute等响应式状态。五、底层原理虚拟模块如何自动发现图层文件上面反复强调的“自动拾取”并非魔法其实现位于 packages/slidev/node/virtual/global-layers.ts。该文件定义了一个 Vite 虚拟模块模板id 为/slidev/global-layers在启动时按如下逻辑生成真实代码文件名匹配为每个图层位置准备一组候选文件名并对每个项目根目录roots支持多入口/主题等场景生成{name}.{ts,js,vue}的 glob 导入。从源码看各位置的候选名分别为GlobalTopglobal、global-top、GlobalTopGlobalBottomglobal-bottom、GlobalBottomSlideTopslide-top、SlideTopSlideBottomslide-bottom、SlideBottom值得注意的是GlobalTop的候选名中额外包含global——从源码结构看创建根目录下的global.vue也会被识别为顶部全局图层Global.vue同理这是文档未明示、但源码确认的一个扩展写法。同时.ts/.js后缀也被支持意味着图层不局限于单文件组件。运行时渲染生成的模块对每个候选 glob 取Object.values(...)[0]即实际存在的组件过滤掉空值后导出如下组件export const GlobalTop { render: () GlobalTopComponents.map(comp h(comp)) }这种h(comp)的列表渲染方式还保留了多根目录场景下渲染多个组件的能力并以.filter(Boolean)保证文件缺失时静默降级为空渲染而不是报错。客户端消费客户端从虚拟模块路径#slidev/global-layers导入这些导出并分别在 SlidesShow.vueGlobalBottom/GlobalTop与 SlideWrapper.vueSlideBottom/SlideTop中挂载位置关系与第三节所述完全一致。custom-nav-controls.vue的发现逻辑自定义导航控件走的是另一条更直接的路径packages/slidev/node/virtual/nav-controls.ts 定义虚拟模块/slidev/custom-nav-controls它在构建期直接对每个根目录下的custom-nav-controls.vue与CustomNavControls.vue做existsSync同步存在性检查把命中的文件 import 进来并生成一个默认导出的渲染函数render: () [h(__n0), ...]。也就是说文件存在才会被引入不存在则虚拟模块渲染空列表——同样实现了“创建即生效缺失即无感”的约定式行为。六、导出Export时的--per-slide注意事项官方文档中的一条关键提示是如果global-top.vue或global-bottom.vue依赖当前导航状态如$nav.currentPage导出时应使用--per-slide选项以确保每一页被赋予正确的状态或者改用slide-top.vue/slide-bottom.vue。这条建议的背后是导出实现的具体行为。在 packages/slidev/node/commands/export.ts 中perSlide false, // ExportOptions 默认值见第 187 行 // ... height: perSlide ? height : height * pages.length, // 第 202 行viewport 高度默认模式perSlide false下Playwright 会把 viewport 高度设为height * pages.length即所有页面纵向排列在同一个超长视口里一次性渲染——此时$nav.currentPage等导航状态无法逐页切换依赖导航状态的全局图层所有页看到的都是同一状态。启用--per-slide后CLI 参数映射见 export.ts 第 589 行viewport 恢复为单页高度height逐页渲染并应用各自的导航状态从而保证状态相关的图层在每页上呈现正确。由此可以得出两条实用选型规则图层内容不依赖导航状态固定页脚、静态背景、署名用global-*即可导出无特殊要求图层依赖$nav状态页码、按页显隐要么改用每页实例的slide-top.vue/slide-bottom.vue每页天然持有各自的上下文要么保留global-*并在导出时加--per-slide。此外打印/导出路径同样会渲染全局图层PrintSlideClick.vue 中同样挂载了GlobalTop/GlobalBottom保证导出产物与播放视图的图层表现一致。七、实践建议小结结合文档与源码日常使用全局图层时建议优先最小化能用slide-*解决的每页页码、每页状态就不要用global-*天然规避--per-slide导出问题层级选择覆盖内容用 top 层垫底内容用 bottom 层需要进导航栏的控件用custom-nav-controls.vue它渲染在 NavControls.vue 内位于整个层级栈最上方定位方式图层组件根元素通常使用absolute定位配合原子类布局如示例中的absolute bottom-0 left-0 right-0避免破坏幻灯片本身的布局流命名与扩展除文档明确的global-top.vue/global-bottom.vue/slide-top.vue/slide-bottom.vue外源码确认还支持对应的 PascalCase 写法如GlobalTop.vue与.ts/.js后缀global.vue会被当作global-top.vue处理状态访问模板中用$navscript setup中用useNav()二者来源均为 docs/guide/global-context.md 描述的全局上下文。更多周边入口可参考 docs/guide/ui.md自定义 UI 总览、docs/guide/exporting.md导出指南以及仓库中面向 Agent 的技能参考 skills/slidev/references/layout-global-layers.md。【免费下载链接】slidevPresentation Slides for Developers项目地址: https://gitcode.com/GitHub_Trending/sl/slidev创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

指法生成质量如何验证?把 PianoPlayer 的 6 个测试文件跑一遍就清楚

指法生成质量如何验证?把 PianoPlayer 的 6 个测试文件跑一遍就清楚

2026/9/8 22:23:31

指法生成质量如何验证?把 PianoPlayer 的 6 个测试文件跑一遍就清楚 【免费下载链接】taipy Turns Data and AI algorithms into production-ready web applications in no time. 项目地址: https://gitcode.com/GitHub_Trending/ta/taipy 一套自动指法工具跑…

主动声纳目标检测仿真:从声纳方程到CFAR的MATLAB实现

主动声纳目标检测仿真:从声纳方程到CFAR的MATLAB实现

2026/9/8 22:13:31

简介:这是一份基于MATLAB的主动声纳水下目标检测仿真示例,面向信号处理与声纳系统方向的学习者,重点演示浅水多径环境中目标回波的建模与检测流程。压缩包内共6个文件,其中4个.m脚本分别实现主程序、多径信道构造、路径绘制和球形…

Maven构建遭遇IndexOutOfBoundsException?资源过滤阶段排查全解析

Maven构建遭遇IndexOutOfBoundsException?资源过滤阶段排查全解析

2026/9/8 22:13:31

如果你在IDEA里点开Build按钮,看到控制台刷出这样一行: [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources) on project ruoyi-modules-wkzyMicro-driver: maven-resources-produc…

基于YOLOv8与ONNX的直肠息肉检测系统:从训练到GUI部署全解析

基于YOLOv8与ONNX的直肠息肉检测系统:从训练到GUI部署全解析

2026/9/8 23:13:34

简介:面向医学影像与目标检测开发者的直肠息肉检测系统完整实现,基于YOLOv8与PyQt5搭建,提供Python源码、ONNX推理模型和可视化GUI界面,适合希望快速掌握检测模型落地流程的初中级学习者。压缩包共32个文件,约10.38MB&…

智能体系统架构三座山:隔离、集成与治理的落地实践

智能体系统架构三座山:隔离、集成与治理的落地实践

2026/9/8 23:13:34

1. 智能体架构里的三座山:隔离、集成与治理到底卡在哪 聊智能体系统架构之前,先讲个我亲眼见过的场景。有个团队做了一个面向企业内部的智能体平台,一开始只接了个大模型API,业务方提需求,开发写Prompt,跑通…

4步跑通视频号下载:res-downloader 本地代理资源抓取工具快速上手

4步跑通视频号下载:res-downloader 本地代理资源抓取工具快速上手

2026/9/8 23:13:34

4步跑通视频号下载:res-downloader 本地代理资源抓取工具快速上手 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader …

Postman与Rest-Assured实战:从API调试到自动化接口测试

Postman与Rest-Assured实战:从API调试到自动化接口测试

2026/9/8 23:13:34

先说一个我上周真实遇到的场景。同事跑过来,一脸笃定:我在Postman里调GitLab接口,一直报 login failed. check api token or gitlab version,是不是服务端把接口改了?我把他的环境变量和请求头翻出来一看,A…

Ghost 主题兼容性机制全解析:从 GScan 校验规则到 Handlebars 主题契约维护

Ghost 主题兼容性机制全解析:从 GScan 校验规则到 Handlebars 主题契约维护

2026/9/8 23:13:34

Ghost 主题兼容性机制全解析:从 GScan 校验规则到 Handlebars 主题契约维护 【免费下载链接】Ghost Independent technology for modern publishing, memberships, subscriptions and newsletters. 项目地址: https://gitcode.com/GitHub_Trending/gh/Ghost …

如何5分钟搞定微信视频号无水印视频下载:res-downloader新手实操指南

如何5分钟搞定微信视频号无水印视频下载:res-downloader新手实操指南

2026/9/8 23:03:33

如何5分钟搞定微信视频号无水印视频下载:res-downloader新手实操指南 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader …

中国人民大学杨琳团队《Nature Communications》 | 全球潮汐湿地土壤有机碳时空格局与环境驱动:一项2009-2020年的全球评估

中国人民大学杨琳团队《Nature Communications》 | 全球潮汐湿地土壤有机碳时空格局与环境驱动:一项2009-2020年的全球评估

2026/9/7 20:21:46

本文首发于“生态学者”!从“湿地面积”到“土壤碳密度”:为什么需要重新认识潮汐湿地蓝碳变化?潮汐湿地位于陆地与海洋的交汇地带,包括红树林、盐沼和潮滩,是全球重要的蓝碳生态系统。其土壤能够长期储存大量有机碳&a…

adb抓包

adb抓包

2026/9/8 4:55:53

前言 本文介绍如何通过 tcpdump 在 Android 手机上抓取网络数据包,并在电脑端使用 Wireshark 进行分析。适用于需要排查 App 网络请求、分析接口调用或调试网络问题的开发与测试场景。1. 手机要有 root 权限2. 下载 tcpdump3. adb push C:\Users\zhangkuixun\Downlo…

大模型推理镜像极简瘦身:从 25GB 巨无霸到 3GB 精简镜像实战

大模型推理镜像极简瘦身:从 25GB 巨无霸到 3GB 精简镜像实战

2026/9/8 22:37:26

大模型推理镜像极简瘦身:从 25GB 巨无霸到 3GB 精简镜像实战 在云原生基础设施中,容器镜像体积直接决定了服务的部署速度与弹性扩容敏捷度。对于传统的 Go / Java 微服务,镜像体积通常被严格控制在 50MB 到 200MB 以内,拉取镜像只…

芯片良率波动可视化:动画拆解工艺因果,重建客户信任

芯片良率波动可视化:动画拆解工艺因果,重建客户信任

2026/9/8 0:02:30

芯片这个行业有个不太被人摆到台面上、但几乎每天都在发生的场景:客户拿着一条良率曲线截图问你,这批货的良率怎么掉了三个点,是不是工艺出问题了,产生的不良会不会流到他们产线上去。你解释了半天,客户似懂非懂&#…

PyTorch DataLoader参数冲突:sampler与shuffle互斥的根源与正确写法

PyTorch DataLoader参数冲突:sampler与shuffle互斥的根源与正确写法

2026/9/8 0:02:30

ValueError: sampler option is mutually exclusive with shuffle,这个报错我在 PyTorch 的 DataLoader 上至少见过几十次了,而且很有意思的是,它经常不是新手专属——很多写了好几年模型的老手,在从单机改成自定义采样器&#xf…

中国车企再破谣言,GAC吉利零跑获欧盟安全五星

中国车企再破谣言,GAC吉利零跑获欧盟安全五星

2026/9/8 0:02:30

有人可能在网上开着皮卡拍视频,声称中国电动车不仅性能不如美国大排量车型,安全性也堪忧。然而事实恰恰相反,GAC、吉利和零跑最新推出的电动车型在极为严苛的欧盟新车安全评鉴(Euro NCAP)测试中全部斩获满分。就在特斯…

远程协作的工作台整理

远程协作的工作台整理

2026/9/8 4:23:39

远程协作的工作台整理远程协作的核心不是再加一个工具,而是让交接信息足够完整。异步任务要写明目标、输入位置、完成标准和需要决策的人。 工作台的最小配置 将日程、待办、代码和沟通入口收拢到少数固定位置;通知按紧急程度分层。工作台不需要模仿办公…

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

2026/9/8 3:19:39

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

2026/9/8 4:00:23

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…