大版本更新
一口气全面统一博客样式,移除部分冗余导航页面,更专注内容展示。
不因虚度年华而悔恨,不因碌碌无为而羞愧
博客系列第16期。全屏壁纸模式下的两种布局:classic 壁纸随页滚动的揭幕式、hero 壁纸固定整屏的视差标题式。附首帧落位防闪烁、z-index 不能为负的原因、视差节流与记忆化写入。

全屏壁纸模式下提供 classic 与 hero 两种布局,靠 <html> 上的 dataset 切换:
1<html data-wallpaper-mode="fullscreen" data-fullscreen-layout="classic|hero">| classic | hero | |
|---|---|---|
| 壁纸定位 | absolute,随页滚动 | fixed; inset: 0,固定整屏 |
| 首页首屏 | 整屏壁纸,只留下滑箭头 | 壁纸 + 居中标题文案 |
| 滚动后 | 滚过阈值揭出水波纹/渐变 | 文案上移淡出,壁纸常驻 |
| 非首页 | 变 max(45vh, 380px) 条带 + 上下文标题 | 壁纸按 --overlay-blur 虚化铺满 |
壁纸模式与布局都支持访客切换(存 localStorage),如果等 JS 加载后再应用,访客每次进来都会先看到默认布局再「跳」到自己的偏好。解法是把读取逻辑内联进首帧:
1// Layout.astro <script is:inline>2const stored = localStorage.getItem('wallpaper-fullscreen-layout');3const fullscreenLayout = stored === 'hero' || stored === 'classic'4 ? stored5 : defaultFullscreenLayout; // 站点配置的默认值6document.documentElement.dataset.fullscreenLayout = fullscreenLayout;define:vars 把站点默认值注入内联脚本,<html> 在渲染任何内容前就带着正确的 dataset——所有布局差异都由 CSS 选择器驱动,不存在布局跳变。
首页首屏被壁纸整屏占据(#main-layout 用 top: 100lvh 推下去),首屏只看到一个下滑箭头。滚过 100px 阈值后 body[data-banner-reveal] 点亮,水波纹和底部渐变淡入、箭头淡出——「揭幕」的仪式感。
壁纸 fixed 铺满、内容滚动其上,标题文案做视差:滚动时文案 translateY(-scrollY) 上移,滚过 50% 视口完全淡出。
两个实现细节:
translate(-50%,-50%) 居中前缀),值没变的帧直接跳过,避免逐帧重复写合成层属性。clamp() 响应式:首页 clamp(2.5rem, 5rem, 5rem)(移动端 2.75rem),非首页降为 clamp(2rem, 4vw, 3rem);text-shadow: 0 2px 12px rgba(0,0,0,0.48),在任何壁纸上保证对比度;data-subtitle-state="typing" 驱动伪元素光标,速度/停顿/循环全部配置化;linear-gradient(to bottom, transparent, var(--page-bg)),高度 clamp(4rem, 12vh, 10rem),让壁纸到正文有柔和过渡。Firefly 的全屏壁纸只有一种形态;这里把 classic / hero 做成了访客可切换的布局,配套切换时的柔和淡出过渡(避免壁纸形态硬切),站点默认值则由 wallpaperMode.fullscreen.layout 配置。
全屏壁纸的两种性格:classic 靠「揭示」讲故事,hero 靠「常驻」撑氛围。实现上记住三件事:首帧内联落位防闪烁、壁纸 z-index 别用负数、视差写入要节流加记忆化。
生成精美分享图或复制链接,与更多人分享本文。
最后更新于 ,距今已过 39 天
部分内容可能已过时