68
0
0
Openlist美化
为了美化
专门使用:
制作了美化包
制作中参考了:
(非插件 设置修改源码)
教程下载:
广告(未收钱)
Openlist推荐挂载
#账号密码挂载 无需获取id#免费10GB不限速
教程:
OpenList 液态玻璃 + 高斯模糊美化源码 v2.5.2
基于 candywind(https://candywind.com)液态玻璃方案核心 CSS 改写,全部内联,零外部依赖 适用于 OpenList v4.x
一、使用方法(入口与粘贴位置)
OpenList 不支持插件,通过后台注入 CSS/JS:
- 登录管理后台:在站点地址栏加
/@manage(或/manage)进入后台 - 进入全局设置:左侧菜单 → 设置 → 全局(Global)
- 粘贴代码:按所选版本将下方对应代码块完整复制,分别粘贴到下表两个字段
- 保存:点击保存后刷新页面生效
| 字段 | 用途 |
|---|---|
| Customize head / 自定义头部 | 粘贴 CSS + 雪花 JS 代码(插入到 <head>) |
| Customize body / 自定义内容 | 粘贴底部文字 HTML(插入到 <body> 末尾) |
设置主题色(推荐)
在后台 → 设置 → 样式(Style)中:
| 设置项 | 推荐值 | 说明 |
|---|---|---|
| Main color / 主颜色 | #00BCD4 |
主品牌色,青色,对应 rgb(0, 188, 212),与 --theme-primary 一致 |
| Logo / 图标 | 你的 PNG 图标 | 建议使用透明背景 PNG |
调节效果参数
| 参数 | 作用 | 推荐值 |
|---|---|---|
--lg-blur |
玻璃模糊强度(统一) | 桌面 6px(建议 4-8px),移动端 4px |
--lg-saturate |
饱和度 | 140%(建议 140%-180%) |
--lg-border |
边框颜色 | rgba(200, 200, 210, 0.20) |
--lg-radius |
圆角 | 14px(建议 10-18px) |
--theme-primary |
主题色(青色) | rgb(0, 188, 212) |
| 玻璃底色 | 容器 0.05 / 0.02 / 0.01,hover 0.07 / 0.04 |
统一档位,整体变深/变浅直接改这些值即可 |
更换背景图片
背景图在 Customize head 的 /* ====== 背景图片 ====== */ 部分,找到下面这一行:
body {
background-image: url('https://pan.1n34.top/d/ilanzou/1n34/other/vid&img/背景%204.jpeg?sign=EsFHiOJzM33fPSRad71FV1rxssn4_xT-LIVb8ePlCuU=:0') !important;
}
- 换成自己的图片:把
url('...')里的整段地址替换为你的图片直链即可,其余四行(background-size等)不用动 - 注意:地址中的
%20是空格的编码写法,不要改成空格;sign=...是网盘签名参数,换图时直接去掉也无妨 - 要求:图片必须通过 HTTPS 加载,否则会被浏览器拦截
更换字体
当前默认字体为钉钉进步体,在 Customize head 的 /* ====== 钉钉进步体(外链字体) ====== */ 部分:
@font-face {
font-family: 'DingTalk JinBuTi';
src: url('https://pan.1n34.top/d/ilanzou/1n34/other/font/DingTalk%20JinBuTi.ttf?sign=...') format('truetype');
font-display: swap;
}
- 换用其他外链字体:把
src: url('...')里面的地址换成你的字体直链(支持.ttf/.woff/.woff2,引用外部字体同样需要 HTTPS) - 改用系统字体(不加载外部字体):直接删除整个
@font-face块,并把下方font-family: 'DingTalk JinBuTi', 'PingFang SC', ...里的 'DingTalk JinBuTi' 去掉,页面就会自动使用系统默认字体 - 换成自己喜欢的中文字体:修改
font-family中除 DingTalk 外的字体名即可(如 'PingFang SC' 苹方、'Microsoft YaHei' 微软雅黑),或改成你已知的任意合法字体名
回滚
清空 Customize head 和 Customize body 的内容,保存即可恢复默认。
二、版本 A:含底部文字版
Customize head(全部复制粘贴)
<style>
/* ============================================================
* OpenList 液态玻璃 + 高斯模糊美化 v2.5
* 全部内联,零外部依赖
* ============================================================ */
/* ====== 钉钉进步体(外链字体) ====== */
@font-face {
font-family: 'DingTalk JinBuTi';
src: url('https://pan.1n34.top/d/ilanzou/1n34/other/font/DingTalk%20JinBuTi.ttf?sign=_ib-br6lFaS62HoCW-FNF8CkWD54DcQSYc7lJc5XEkY=:0') format('truetype');
font-display: swap;
}
body, .hope-app-root,
button, input, select, textarea,
.hope-table, .hope-nav, .hope-toolbar {
font-family: 'DingTalk JinBuTi', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif !important;
}
/* 站点公告等独立容器:统一字体(图标与 SVG 除外) */
body :not(svg):not([class*="icon"]):not([class*="Icon"]),
.hope-alert, .hope-toast, .hope-notice, .hope-banner,
.hope-modal, .hope-modal__content, .hope-dialog,
[role="dialog"], [role="alert"], [class*="notice"], [class*="banner"] {
font-family: 'DingTalk JinBuTi', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif !important;
}
/* ---------- 可调参数 ---------- */
:root {
/* 玻璃模糊强度(降低,不要太模糊) */
--lg-blur: 6px;
/* 饱和度 */
--lg-saturate: 160%;
/* 边框颜色 - 浅灰 */
--lg-border: rgba(200, 200, 210, 0.20);
/* 圆角大小 */
--lg-radius: 14px;
/* 主题色:青色(RGB 0, 188, 212) */
--theme-primary: rgb(0, 188, 212);
}
/* ====== 背景图片 ====== */
body {
background-image: url('https://pan.1n34.top/d/ilanzou/1n34/other/vid&img/背景%204.jpeg?sign=EsFHiOJzM33fPSRad71FV1rxssn4_xT-LIVb8ePlCuU=:0') !important;
background-size: cover !important;
background-position: center center !important;
background-attachment: fixed !important;
background-repeat: no-repeat !important;
}
/* ====== 标题栏图标 PNG 透明部分 ====== */
header, .header, .header-left, .header-right,
nav, nav[class*="hope-"],
[class*="hope-c-iHfQeT"],
[class*="hope-c-PJLV"] {
background: transparent !important;
}
header img, header svg,
.header img, .header svg,
.header-left img, .header-left svg,
.header-right img, .header-right svg,
nav img, nav svg,
[class*="hope-c-iHfQeT"] img,
[class*="hope-c-iHfQeT"] svg,
[class*="hope-c-PJLV"] img,
[class*="hope-c-PJLV"] svg {
background: transparent !important;
mix-blend-mode: normal !important;
}
/* ============================================================
* A 档 · 容器级玻璃(带 backdrop-filter 高斯模糊)
* ============================================================ */
.header, .header-left, .header-right,
.nav,
.left-toolbar, .left-toolbar-box, .left-toolbar-in,
.center-toolbar, .toolbar-toggle,
.footer,
.hope-modal, .hope-modal__content, .hope-dialog,
[role="dialog"] {
background:
linear-gradient(180deg, rgba(200, 200, 210, 0.05), rgba(240, 240, 245, 0) 1px),
linear-gradient(135deg, rgba(200, 200, 210, 0.02), rgba(200, 200, 210, 0.01)) !important;
-webkit-backdrop-filter: blur(6px) saturate(140%) !important;
backdrop-filter: blur(6px) saturate(140%) !important;
border: 1px solid rgba(200, 200, 210, 0.20) !important;
border-radius: var(--lg-radius) !important;
box-shadow:
inset 0 1px 0 rgba(255, 255, 255, 0.20),
0 8px 32px rgba(0, 0, 0, 0.06),
0 0 16px 2px rgba(200, 200, 210, 0.05) !important;
}
.hope-select__trigger {
background: linear-gradient(135deg, rgba(200, 200, 210, 0.02), rgba(200, 200, 210, 0.01)) !important;
-webkit-backdrop-filter: blur(6px) saturate(140%) !important;
backdrop-filter: blur(6px) saturate(140%) !important;
border: 1px solid rgba(200, 200, 210, 0.20) !important;
border-radius: var(--lg-radius) !important;
box-shadow:
inset 0 1px 0 rgba(255, 255, 255, 0.20),
0 8px 32px rgba(0, 0, 0, 0.06) !important;
}
/* 按钮 */
.hope-button, .hope-icon-button {
background: linear-gradient(135deg, rgba(200, 200, 210, 0.05), rgba(200, 200, 210, 0.04)) !important;
-webkit-backdrop-filter: blur(6px) saturate(140%) !important;
backdrop-filter: blur(6px) saturate(140%) !important;
border: 1px solid rgba(200, 200, 210, 0.20) !important;
border-radius: 10px !important;
box-shadow:
inset 0 1px 0 rgba(255, 255, 255, 0.20),
0 2px 8px rgba(0, 0, 0, 0.05) !important;
transition: all 0.2s ease;
}
.hope-button:hover, .hope-icon-button:hover {
background: linear-gradient(135deg, rgba(200, 200, 210, 0.07), rgba(200, 200, 210, 0.04)) !important;
box-shadow:
inset 0 1px 0 rgba(255, 255, 255, 0.20),
0 4px 16px rgba(0, 0, 0, 0.05) !important;
transform: translateY(-1px);
}
/* 主按钮 - 青色主题 */
.hope-button[class*="hope-button--solid"],
.hope-app-root button[class*="hope-button--solid"] {
background: linear-gradient(135deg, rgba(0, 188, 212, 0.35), rgba(0, 160, 180, 0.20)) !important;
color: white !important;
border-color: rgba(255, 255, 255, 0.25) !important;
}
/* select 下拉列表 */
.hope-select__listbox,
.hope-select__listbox > * {
background: linear-gradient(135deg, rgba(200, 200, 210, 0.05), rgba(200, 200, 210, 0.02)) !important;
-webkit-backdrop-filter: blur(6px) saturate(140%) !important;
backdrop-filter: blur(6px) saturate(140%) !important;
border: 1px solid rgba(200, 200, 210, 0.20) !important;
border-radius: 12px !important;
}
.hope-select__listbox > *:hover {
background: rgba(200, 200, 210, 0.05) !important;
}
/* ====== 复选框 ====== */
.hope-checkbox__control,
[class*="hope-c-mHASU"] {
background: linear-gradient(135deg, rgba(200, 200, 210, 0.05), rgba(200, 200, 210, 0.02)) !important;
-webkit-backdrop-filter: blur(6px) saturate(140%) !important;
backdrop-filter: blur(6px) saturate(140%) !important;
border: 1px solid rgba(200, 200, 210, 0.20) !important;
border-radius: 6px !important;
box-shadow:
inset 0 1px 0 rgba(255, 255, 255, 0.20),
0 0 0 1px rgba(0, 0, 0, 0.02) !important;
transition: all 0.2s ease;
}
.hope-checkbox__control:hover,
[class*="hope-c-mHASU"]:hover {
box-shadow:
inset 0 1px 0 rgba(255, 255, 255, 0.20),
0 0 0 2px rgba(0, 0, 0, 0.03) !important;
border-color: rgba(200, 200, 210, 0.20) !important;
}
/* 复选框选中态 - 青色 */
.hope-checkbox__control[data-checked="true"],
[class*="hope-c-mHASU"][data-checked="true"] {
background: linear-gradient(135deg, rgba(0, 188, 212, 0.35), rgba(0, 160, 180, 0.20)) !important;
border-color: rgba(0, 188, 212, 0.55) !important;
}
/* 复选框勾选标记 - 青色 */
.hope-checkbox__control svg,
[class*="hope-c-mHASU"] svg,
.hope-checkbox__control [class*="icon"],
[class*="hope-c-mHASU"] [class*="icon"] {
color: var(--theme-primary) !important;
stroke: var(--theme-primary) !important;
filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.25)) !important;
}
/* 快捷键提示键 */
.hope-kbd,
[class*="hope-c-iDYHca"] {
background: linear-gradient(135deg, rgba(200, 200, 210, 0.07), rgba(200, 200, 210, 0.04)) !important;
-webkit-backdrop-filter: blur(6px) saturate(140%) !important;
backdrop-filter: blur(6px) saturate(140%) !important;
border: 1px solid var(--lg-border) !important;
border-radius: 6px !important;
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.20) !important;
}
/* ============================================================
* B 档 · 轻量半透明
* ============================================================ */
.nav-item, .nav-link,
.search, .search_index, .input, .textfield,
.list, .list-item,
aside, .drawer, [role="menu"] {
background:
linear-gradient(180deg, rgba(200, 200, 210, 0.05), rgba(240, 240, 245, 0) 1px),
linear-gradient(135deg, rgba(200, 200, 210, 0.02), rgba(200, 200, 210, 0.01)) !important;
border: 1px solid var(--lg-border) !important;
border-radius: 10px !important;
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.20) !important;
}
.list-item {
transition: background 0.2s ease, box-shadow 0.2s ease;
}
.list-item:hover {
background:
linear-gradient(180deg, rgba(200, 200, 210, 0.07), rgba(240, 240, 245, 0) 1px),
linear-gradient(135deg, rgba(200, 200, 210, 0.07), rgba(200, 200, 210, 0.04)) !important;
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.20), 0 4px 16px rgba(0, 0, 0, 0.06) !important;
}
/* 登录弹窗 - 透明玻璃,边框明显 */
[role="dialog"], .hope-modal, .hope-modal__content, .hope-dialog {
background:
linear-gradient(180deg, rgba(200, 200, 210, 0.05), rgba(240, 240, 245, 0) 1px),
linear-gradient(135deg, rgba(200, 200, 210, 0.05), rgba(200, 200, 210, 0.02)) !important;
-webkit-backdrop-filter: blur(6px) saturate(140%) !important;
backdrop-filter: blur(6px) saturate(140%) !important;
border: 1px solid rgba(200, 200, 210, 0.20) !important;
box-shadow: 0 12px 40px rgba(0, 0, 0, 0.06), inset 0 1px 0 rgba(255, 255, 255, 0.20) !important;
}
/* 菜单栏横线/分隔线 - 淡青色 */
.hope-divider,
[class*="hope-c-"][class*="divider"],
hr {
background-color: rgba(0, 188, 212, 0.06) !important;
border-color: rgba(0, 188, 212, 0.06) !important;
}
/* 面包屑分隔符 - 不使用青色背景,避免长方形bug */
.hope-breadcrumb__separator {
color: #00BCD4 !important;
background: transparent !important;
}
/* 面包屑导航 - 无液态玻璃边框 */
.hope-breadcrumb,
.hope-breadcrumb__list,
.hope-breadcrumb__item {
background: transparent !important;
border: none !important;
box-shadow: none !important;
backdrop-filter: none !important;
-webkit-backdrop-filter: none !important;
}
/* ============================================================
* 登录页 - 隐藏明暗切换与语言选项
* ============================================================ */
/* 暗色/明暗模式切换按钮 */
.hope-dark-mode-toggle,
.hope-theme-toggle,
.hope-appearance-toggle,
[class*="dark-mode"],
[class*="theme-toggle"],
[class*="color-mode"],
[class*="appearance"],
[aria-label*="theme" i],
[aria-label*="dark" i],
[aria-label*="light" i],
svg[class*="moon"],
svg[class*="sun"],
svg[class*="Moon"],
svg[class*="Sun"],
button[class*="theme"],
button[title*="theme" i],
button[title*="dark" i],
button[title*="light" i] {
display: none !important;
}
/* 语言切换按钮 */
.hope-locale-switch,
.hope-lang-switch,
.hope-i18n-switch,
[class*="locale"],
[class*="lang-switch"],
[class*="language-switch"],
[class*="i18n"],
[aria-label*="language" i],
[aria-label*="lang" i],
button[class*="lang"],
button[title*="language" i],
button[title*="lang" i] {
display: none !important;
}
/* 链接颜色 - 青色 */
.hope-app-root a,
.hope-app-root [class*="link"] {
color: var(--theme-primary) !important;
}
.hope-app-root a:hover,
.hope-app-root [class*="link"]:hover {
color: rgb(0, 210, 230) !important;
}
/* 图标颜色 - 青色(仅 stroke/color,不动 fill 避免空心图标变实心) */
.hope-icon,
[class*="hope-icon"],
[class*="hope-c-iDYHca"] svg,
.toolbar-toggle svg,
.left-toolbar svg,
.center-toolbar svg {
color: var(--theme-primary) !important;
}
/* 首页文件列表表头文字 - 确保可见度 */
.hope-table th,
.hope-table__th,
[class*="hope-table"] th,
[class*="hope-c-"][class*="th"] {
color: #555555 !important;
font-weight: 600 !important;
text-shadow: 0 1px 0 rgba(255, 255, 255, 0.20) !important;
}
/* 首页文件列表单元格文字 */
.hope-table td,
.hope-table__td,
[class*="hope-table"] td,
[class*="hope-c-"][class*="td"] {
color: #444444 !important;
}
/* ============================================================
* 隐藏原 footer
* ============================================================ */
footer, footer.hope-stack,
[class*="hope-c-PJLV-ihQbspH-css"] {
display: none !important;
}
/* 右下角浮动菜单/工具栏 - 更透明 */
.center-toolbar, .toolbar-toggle,
.left-toolbar, .left-toolbar-box, .left-toolbar-in {
background:
linear-gradient(135deg, rgba(200, 200, 210, 0.05), rgba(200, 200, 210, 0.01)) !important;
-webkit-backdrop-filter: blur(6px) saturate(140%) !important;
backdrop-filter: blur(6px) saturate(140%) !important;
border: 1px solid rgba(200, 200, 210, 0.20) !important;
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.20), 0 4px 16px rgba(0, 0, 0, 0.06) !important;
}
/* 文件列表容器 - 更透明 */
.obj-box,
.hope-stack[class*="obj"] {
background:
linear-gradient(135deg, rgba(200, 200, 210, 0.10), rgba(200, 200, 210, 0.05)) !important;
-webkit-backdrop-filter: blur(6px) saturate(140%) !important;
backdrop-filter: blur(6px) saturate(140%) !important;
border: 1px solid rgba(200, 200, 210, 0.20) !important;
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.20), 0 6px 24px rgba(0, 0, 0, 0.06) !important;
}
/* 文件视图菜单(右上角/右下角视图切换菜单) */
.hope-menu,
.hope-menu__content {
background:
linear-gradient(135deg, rgba(200, 200, 210, 0.05), rgba(200, 200, 210, 0.04)) !important;
-webkit-backdrop-filter: blur(6px) saturate(140%) !important;
backdrop-filter: blur(6px) saturate(140%) !important;
border: 1px solid rgba(200, 200, 210, 0.20) !important;
border-radius: 12px !important;
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.20), 0 8px 32px rgba(0, 0, 0, 0.06), 0 0 12px 1px rgba(200, 200, 210, 0.05) !important;
}
/* 菜单项本身无额外框,文字干净 */
.hope-menu__item,
.hope-menu__option,
.hope-menu [role="menuitem"] {
background: transparent !important;
border: none !important;
box-shadow: none !important;
backdrop-filter: none !important;
-webkit-backdrop-filter: none !important;
}
/* 表格容器 */
.hope-table,
table[class*="hope-"] {
background:
linear-gradient(135deg, rgba(200, 200, 210, 0.10), rgba(200, 200, 210, 0.05)) !important;
-webkit-backdrop-filter: blur(6px) saturate(140%) !important;
backdrop-filter: blur(6px) saturate(140%) !important;
border: 1px solid rgba(200, 200, 210, 0.20) !important;
border-radius: 12px !important;
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.20), 0 4px 20px rgba(0, 0, 0, 0.05) !important;
}
/* ============================================================
* 底部信息区域 - 正常文档流,不遮挡任何元素
* 登录按钮和文字框同一行
* ============================================================ */
.liquid-bottom-area {
position: relative;
z-index: auto;
display: flex;
flex-direction: row;
justify-content: center;
align-items: center;
flex-wrap: wrap;
gap: 8px;
padding: 10px 0;
pointer-events: none;
}
/* 左下角登录按钮 - 窄,边框更明显 */
.liquid-login-btn {
display: inline-block;
padding: 4px 16px;
font-size: 12px;
font-weight: 700;
color: #ffffff;
background:
linear-gradient(135deg, rgba(0, 188, 212, 0.42), rgba(0, 160, 180, 0.30)) !important;
border: 1px solid rgba(0, 188, 212, 0.55) !important;
border-radius: 8px !important;
box-shadow:
inset 0 1px 0 rgba(255, 255, 255, 0.20),
0 3px 10px rgba(0, 0, 0, 0.06) !important;
cursor: pointer;
text-decoration: none;
transition: all 0.2s ease;
pointer-events: auto;
text-shadow: 0 1px 3px rgba(0, 0, 0, 0.30);
white-space: nowrap;
}
.liquid-login-btn:hover {
background: linear-gradient(135deg, rgba(0, 188, 212, 0.55), rgba(0, 160, 180, 0.42)) !important;
box-shadow:
inset 0 1px 0 rgba(255, 255, 255, 0.20),
0 4px 12px rgba(0, 0, 0, 0.06) !important;
transform: translateY(-1px);
color: #ffffff;
}
/* 底部文字栏 - 宽 */
.liquid-footer-bar {
width: calc(100% - 32px);
max-width: 800px;
padding: 8px 16px;
margin: 0;
text-align: center;
font-size: 12px;
line-height: 1.4;
white-space: nowrap;
color: #ffffff;
text-shadow: 0 1px 6px rgba(0, 0, 0, 0.45), 0 0 14px rgba(0, 0, 0, 0.35);
background:
linear-gradient(180deg, rgba(200, 200, 210, 0.08), rgba(240, 240, 245, 0) 1px),
linear-gradient(135deg, rgba(200, 200, 210, 0.05), rgba(200, 200, 210, 0.03)) !important;
-webkit-backdrop-filter: blur(6px) saturate(140%) !important;
backdrop-filter: blur(6px) saturate(140%) !important;
border: 1px solid var(--lg-border) !important;
border-radius: 10px !important;
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.20), 0 2px 12px rgba(0, 0, 0, 0.05) !important;
pointer-events: auto;
}
.liquid-footer-bar a {
color: #a8dff0;
text-decoration: none;
transition: color 0.3s ease;
text-shadow: 0 1px 4px rgba(0, 0, 0, 0.35);
pointer-events: auto;
}
.liquid-footer-bar a:hover {
color: #ffffff;
text-decoration: underline;
}
.liquid-footer-bar .divider {
margin: 0 8px;
color: #ffffff;
}
/* ============================================================
* 移动端适配
* ============================================================ */
@media (max-width: 768px) {
.liquid-bottom-area {
flex-direction: row !important;
flex-wrap: wrap !important;
gap: 6px !important;
padding: 8px 0 !important;
}
.liquid-login-btn {
padding: 3px 10px !important;
font-size: 11px !important;
}
.liquid-footer-bar {
width: calc(100% - 16px) !important;
padding: 6px 8px !important;
font-size: 11px !important;
}
.liquid-footer-bar .divider {
margin: 0 4px !important;
}
/* 移动端降低模糊以提升性能 */
:root {
--lg-blur: 6px;
}
}
</style>
<script>
/* ============================================================
* 雪花特效(snowfall-canvas.global.js 内联版)
* ============================================================ */
const defaultConfig={amount:1500,maxParticles:2500,size:[1,1],swingSpeed:[0.01,0.03],fallSpeed:[15,30],amplitude:[2,5],color:"rgb(225,225,225)",dprCap:2};
const rand=(min,max)=>Math.random()*(max-min)+min;
const SIZE_LAMBDA=0.0408;
const SIZE_C=100;
const SIZE_AMAX=SIZE_C*(1-Math.exp(-SIZE_LAMBDA*79))/SIZE_LAMBDA;
const sampleSize=()=>{const u=Math.random()*SIZE_AMAX;return 1-Math.log(1-(u*SIZE_LAMBDA)/SIZE_C)/SIZE_LAMBDA};
const BASE_WIDTH=1920;
const BASE_HEIGHT=1080;
const TWO_PI=Math.PI*2;
const SIN_TABLE_SIZE=2048;
const SIN_TABLE=new Float32Array(SIN_TABLE_SIZE);
for(let i=0;i<SIN_TABLE_SIZE;i+=1)SIN_TABLE[i]=Math.sin(i/SIN_TABLE_SIZE*TWO_PI);
const resolveElementById=(id,kind)=>{const el=document.getElementById(id);if(!el)throw new Error(`${kind} not found: ${id}`);return el};
const resolveElement=(elOrId,kind)=>{if(typeof elOrId==="string")return resolveElementById(elOrId,kind);return elOrId};
var SnowfallCanvas=class{canvas;ctx;container;running=false;rafId=null;lastTime=0;width=0;height=0;dpr=1;resizeObserver=null;resizeQueued=false;fallbackResizeAttached=false;particleCount=0;posX=new Float32Array(0);posY=new Float32Array(0);originX=new Float32Array(0);dx=new Float32Array(0);size=new Float32Array(0);amplitude=new Float32Array(0);velX=new Float32Array(0);velY=new Float32Array(0);visibilityHandlerAttached=false;autoPausedByVisibility=false;frameTimeAvg=16;perfCooldownFrames=0;dprOverride=null;config;constructor(options){this.canvas=resolveElement(options.canvas,"Canvas");this.container=resolveElement(options.container,"Container");const ctx=this.canvas.getContext("2d");if(!ctx)throw new Error("2D context is not supported");this.ctx=ctx;this.config={...defaultConfig,...options.config??{}};const sizeScale=this.config.size[0]??1;this.config.size=[sizeScale,sizeScale];this.resize();this.initParticles();this.start()}resize(){const rect=this.container.getBoundingClientRect();const dpr=Math.min(this.dprOverride??Math.min(window.devicePixelRatio||1,this.config.dprCap),this.config.dprCap);this.dpr=dpr;this.width=rect.width;this.height=rect.height;this.canvas.width=this.width*dpr;this.canvas.height=this.height*dpr;this.canvas.style.width=`${this.width}px`;this.canvas.style.height=`${this.height}px`;this.ctx.setTransform(dpr,0,0,dpr,0,0)}initParticles(){const count=Math.min(this.config.amount,this.config.maxParticles);this.particleCount=count;this.posX=new Float32Array(count);this.posY=new Float32Array(count);this.originX=new Float32Array(count);this.dx=new Float32Array(count);this.size=new Float32Array(count);this.amplitude=new Float32Array(count);this.velX=new Float32Array(count);this.velY=new Float32Array(count);const w=this.width;const h=this.height;const sizeScale=this.config.size[0];for(let i=0;i<count;i++){this.posX[i]=rand(0,w);this.posY[i]=rand(-h,0);this.originX[i]=this.posX[i];this.dx[i]=0;this.size[i]=Math.min(Math.max(sampleSize()*sizeScale,1),80);this.amplitude[i]=rand(this.config.amplitude[0],this.config.amplitude[1]);this.velX[i]=rand(this.config.swingSpeed[0],this.config.swingSpeed[1]);this.velY[i]=rand(this.config.fallSpeed[0],this.config.fallSpeed[1])}}update(dt){const w=this.width;const h=this.height;const count=this.particleCount;for(let i=0;i<count;i++){this.dx[i]+=this.velX[i]*dt;this.posX[i]=this.originX[i]+Math.sin(this.dx[i])*this.amplitude[i];this.posY[i]+=this.velY[i]*dt*0.06;if(this.posY[i]-this.size[i]>h){this.posY[i]=-this.size[i];this.originX[i]=rand(0,w);this.posX[i]=this.originX[i];this.dx[i]=0;this.size[i]=Math.min(Math.max(sampleSize()*this.config.size[0],1),80)}}}draw(){const ctx=this.ctx;const w=this.width;const h=this.height;ctx.clearRect(0,0,w,h);const count=this.particleCount;const color=this.config.color;ctx.fillStyle=color;for(let i=0;i<count;i++){const x=this.posX[i];const y=this.posY[i];const s=this.size[i];ctx.beginPath();ctx.arc(x,y,s/2,0,TWO_PI);ctx.fill()}}start(){if(this.running)return;this.running=true;this.lastTime=performance.now();this.loop()};loop=()=>{if(!this.running)return;const now=performance.now();const dt=Math.min((now-this.lastTime)/16.67,3);this.lastTime=now;this.update(dt);this.draw();this.rafId=requestAnimationFrame(this.loop)};stop(){this.running=false;if(this.rafId){cancelAnimationFrame(this.rafId);this.rafId=null}}destroy(){this.stop();if(this.resizeObserver){this.resizeObserver.disconnect();this.resizeObserver=null}}};window.SnowfallCanvas=SnowfallCanvas;
/* 初始化雪花 */
(function(){
function initSnow() {
var container=document.createElement('div');
container.id='snowfall-container';
container.style.cssText='position:fixed;top:0;left:0;width:100%;height:100%;z-index:9999;pointer-events:none;overflow:hidden;';
document.body.appendChild(container);
var canvas=document.createElement('canvas');
canvas.id='snowfall-canvas';
container.appendChild(canvas);
try {
new SnowfallCanvas({canvas:canvas,container:container,config:{amount:100,maxParticles:200,color:'rgba(255, 255, 255, 0.20)',size:[0.2,0.2],amplitude:[2,5],swingSpeed:[0.01,0.03]}});
} catch(e) { console.log('Snowfall init error:', e); }
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', initSnow);
} else {
initSnow();
}
setTimeout(initSnow, 500);
})();
</script>
Customize body(全部复制粘贴)
<div class="liquid-bottom-area">
<a href="/@login" class="liquid-login-btn">登录</a>
<div class="liquid-footer-bar">
由<a href="https://cloud.1n34.top" target="_blank" rel="noopener noreferrer">1n34云</a>提供运营与维护并同时与<a href="https://ilanzou.com" target="_blank" rel="noopener noreferrer">ilanzou</a>提供存储服务
<span class="divider">丨</span>
<a href="https://1n34.top/Terms-of-Service-and-Disclaimer" target="_blank" rel="noopener noreferrer">服务条款</a>
</div>
</div>
A 版底部文字如何修改
底部文字位于 Customize body 的 .liquid-footer-bar 中,直接编辑 HTML 即可,无需改动 head:
- 改纯文字:直接修改
<div class="liquid-footer-bar">里的文字内容。 - 改可点击的链接:修改
<a href="链接地址" target="_blank" rel="noopener noreferrer">显示文字</a>中的href与显示文字。 - 新增 / 删除链接:复制一行
<a>…</a>即可新增;整行删除即可移除对应链接。 - 竖线分隔符:
<span class="divider">丨</span>负责「丨」,需要多少条就保留多少条。 - 改字号 / 颜色 / 圆角 / 宽度:由 Customize head 中
.liquid-footer-bar样式块控制(如font-size: 12px、color: rgba(255, 255, 255, 0.70)),按需修改该样式块即可。
保存后刷新页面即生效。
三、版本 B:无底部文字版
Customize head(全部复制粘贴)
<style>
/* ============================================================
* OpenList 液态玻璃 + 高斯模糊美化 v2.5(无底部文字版)
* 全部内联,零外部依赖
* ============================================================ */
/* ====== 钉钉进步体(外链字体) ====== */
@font-face {
font-family: 'DingTalk JinBuTi';
src: url('https://pan.1n34.top/d/ilanzou/1n34/other/font/DingTalk%20JinBuTi.ttf?sign=_ib-br6lFaS62HoCW-FNF8CkWD54DcQSYc7lJc5XEkY=:0') format('truetype');
font-display: swap;
}
body, .hope-app-root,
button, input, select, textarea,
.hope-table, .hope-nav, .hope-toolbar {
font-family: 'DingTalk JinBuTi', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif !important;
}
/* 站点公告等独立容器:统一字体(图标与 SVG 除外) */
body :not(svg):not([class*="icon"]):not([class*="Icon"]),
.hope-alert, .hope-toast, .hope-notice, .hope-banner,
.hope-modal, .hope-modal__content, .hope-dialog,
[role="dialog"], [role="alert"], [class*="notice"], [class*="banner"] {
font-family: 'DingTalk JinBuTi', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif !important;
}
:root {
--lg-blur: 6px;
--lg-saturate: 160%;
--lg-border: rgba(200, 200, 210, 0.20);
--lg-radius: 14px;
--theme-primary: rgb(0, 188, 212);
}
/* ====== 背景图片 ====== */
body {
background-image: url('https://pan.1n34.top/d/ilanzou/1n34/other/vid&img/背景%204.jpeg?sign=EsFHiOJzM33fPSRad71FV1rxssn4_xT-LIVb8ePlCuU=:0') !important;
background-size: cover !important;
background-position: center center !important;
background-attachment: fixed !important;
background-repeat: no-repeat !important;
}
header, .header, .header-left, .header-right,
nav, nav[class*="hope-"],
[class*="hope-c-iHfQeT"],
[class*="hope-c-PJLV"] {
background: transparent !important;
}
header img, header svg,
.header img, .header svg,
.header-left img, .header-left svg,
.header-right img, .header-right svg,
nav img, nav svg,
[class*="hope-c-iHfQeT"] img,
[class*="hope-c-iHfQeT"] svg,
[class*="hope-c-PJLV"] img,
[class*="hope-c-PJLV"] svg {
background: transparent !important;
mix-blend-mode: normal !important;
}
.header, .header-left, .header-right,
.nav,
.left-toolbar, .left-toolbar-box, .left-toolbar-in,
.center-toolbar, .toolbar-toggle,
.footer,
.hope-modal, .hope-modal__content, .hope-dialog,
[role="dialog"] {
background:
linear-gradient(180deg, rgba(200, 200, 210, 0.05), rgba(240, 240, 245, 0) 1px),
linear-gradient(135deg, rgba(200, 200, 210, 0.02), rgba(200, 200, 210, 0.01)) !important;
-webkit-backdrop-filter: blur(6px) saturate(140%) !important;
backdrop-filter: blur(6px) saturate(140%) !important;
border: 1px solid rgba(200, 200, 210, 0.20) !important;
border-radius: var(--lg-radius) !important;
box-shadow:
inset 0 1px 0 rgba(255, 255, 255, 0.20),
0 8px 32px rgba(0, 0, 0, 0.06),
0 0 16px 2px rgba(200, 200, 210, 0.05) !important;
}
.hope-select__trigger {
background: linear-gradient(135deg, rgba(200, 200, 210, 0.02), rgba(200, 200, 210, 0.01)) !important;
-webkit-backdrop-filter: blur(6px) saturate(140%) !important;
backdrop-filter: blur(6px) saturate(140%) !important;
border: 1px solid rgba(200, 200, 210, 0.20) !important;
border-radius: var(--lg-radius) !important;
box-shadow:
inset 0 1px 0 rgba(255, 255, 255, 0.20),
0 8px 32px rgba(0, 0, 0, 0.06) !important;
}
.hope-button, .hope-icon-button {
background: linear-gradient(135deg, rgba(200, 200, 210, 0.05), rgba(200, 200, 210, 0.04)) !important;
-webkit-backdrop-filter: blur(6px) saturate(140%) !important;
backdrop-filter: blur(6px) saturate(140%) !important;
border: 1px solid rgba(200, 200, 210, 0.20) !important;
border-radius: 10px !important;
box-shadow:
inset 0 1px 0 rgba(255, 255, 255, 0.20),
0 2px 8px rgba(0, 0, 0, 0.05) !important;
transition: all 0.2s ease;
}
.hope-button:hover, .hope-icon-button:hover {
background: linear-gradient(135deg, rgba(200, 200, 210, 0.07), rgba(200, 200, 210, 0.04)) !important;
box-shadow:
inset 0 1px 0 rgba(255, 255, 255, 0.20),
0 4px 16px rgba(0, 0, 0, 0.05) !important;
transform: translateY(-1px);
}
.hope-button[class*="hope-button--solid"],
.hope-app-root button[class*="hope-button--solid"] {
background: linear-gradient(135deg, rgba(0, 188, 212, 0.35), rgba(0, 160, 180, 0.20)) !important;
color: white !important;
border-color: rgba(255, 255, 255, 0.25) !important;
}
.hope-select__listbox,
.hope-select__listbox > * {
background: linear-gradient(135deg, rgba(200, 200, 210, 0.05), rgba(200, 200, 210, 0.02)) !important;
-webkit-backdrop-filter: blur(6px) saturate(140%) !important;
backdrop-filter: blur(6px) saturate(140%) !important;
border: 1px solid rgba(200, 200, 210, 0.20) !important;
border-radius: 12px !important;
}
.hope-select__listbox > *:hover {
background: rgba(200, 200, 210, 0.05) !important;
}
.hope-checkbox__control,
[class*="hope-c-mHASU"] {
background: linear-gradient(135deg, rgba(200, 200, 210, 0.05), rgba(200, 200, 210, 0.02)) !important;
-webkit-backdrop-filter: blur(6px) saturate(140%) !important;
backdrop-filter: blur(6px) saturate(140%) !important;
border: 1px solid rgba(200, 200, 210, 0.20) !important;
border-radius: 6px !important;
box-shadow:
inset 0 1px 0 rgba(255, 255, 255, 0.20),
0 0 0 1px rgba(0, 0, 0, 0.02) !important;
transition: all 0.2s ease;
}
.hope-checkbox__control:hover,
[class*="hope-c-mHASU"]:hover {
box-shadow:
inset 0 1px 0 rgba(255, 255, 255, 0.20),
0 0 0 2px rgba(0, 0, 0, 0.03) !important;
border-color: rgba(200, 200, 210, 0.20) !important;
}
.hope-checkbox__control[data-checked="true"],
[class*="hope-c-mHASU"][data-checked="true"] {
background: linear-gradient(135deg, rgba(0, 188, 212, 0.35), rgba(0, 160, 180, 0.20)) !important;
border-color: rgba(0, 188, 212, 0.55) !important;
}
.hope-checkbox__control svg,
[class*="hope-c-mHASU"] svg,
.hope-checkbox__control [class*="icon"],
[class*="hope-c-mHASU"] [class*="icon"] {
color: var(--theme-primary) !important;
stroke: var(--theme-primary) !important;
filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.25)) !important;
}
.hope-kbd,
[class*="hope-c-iDYHca"] {
background: linear-gradient(135deg, rgba(200, 200, 210, 0.07), rgba(200, 200, 210, 0.04)) !important;
-webkit-backdrop-filter: blur(6px) saturate(140%) !important;
backdrop-filter: blur(6px) saturate(140%) !important;
border: 1px solid var(--lg-border) !important;
border-radius: 6px !important;
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.20) !important;
}
.nav-item, .nav-link,
.search, .search_index, .input, .textfield,
.list, .list-item,
aside, .drawer, [role="menu"] {
background:
linear-gradient(180deg, rgba(200, 200, 210, 0.05), rgba(240, 240, 245, 0) 1px),
linear-gradient(135deg, rgba(200, 200, 210, 0.02), rgba(200, 200, 210, 0.01)) !important;
border: 1px solid var(--lg-border) !important;
border-radius: 10px !important;
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.20) !important;
}
.list-item {
transition: background 0.2s ease, box-shadow 0.2s ease;
}
.list-item:hover {
background:
linear-gradient(180deg, rgba(200, 200, 210, 0.07), rgba(240, 240, 245, 0) 1px),
linear-gradient(135deg, rgba(200, 200, 210, 0.07), rgba(200, 200, 210, 0.04)) !important;
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.20), 0 4px 16px rgba(0, 0, 0, 0.06) !important;
}
/* 登录弹窗 - 透明玻璃,边框明显 */
[role="dialog"], .hope-modal, .hope-modal__content, .hope-dialog {
background:
linear-gradient(180deg, rgba(200, 200, 210, 0.05), rgba(240, 240, 245, 0) 1px),
linear-gradient(135deg, rgba(200, 200, 210, 0.05), rgba(200, 200, 210, 0.02)) !important;
-webkit-backdrop-filter: blur(6px) saturate(140%) !important;
backdrop-filter: blur(6px) saturate(140%) !important;
border: 1px solid rgba(200, 200, 210, 0.20) !important;
box-shadow: 0 12px 40px rgba(0, 0, 0, 0.06), inset 0 1px 0 rgba(255, 255, 255, 0.20) !important;
}
.hope-divider,
[class*="hope-c-"][class*="divider"],
hr {
background-color: rgba(0, 188, 212, 0.06) !important;
border-color: rgba(0, 188, 212, 0.06) !important;
}
.hope-breadcrumb__separator {
color: #00BCD4 !important;
background: transparent !important;
}
.hope-breadcrumb,
.hope-breadcrumb__list,
.hope-breadcrumb__item {
background: transparent !important;
border: none !important;
box-shadow: none !important;
backdrop-filter: none !important;
-webkit-backdrop-filter: none !important;
}
/* ============================================================
* 登录页 - 隐藏明暗切换与语言选项
* ============================================================ */
/* 暗色/明暗模式切换按钮 */
.hope-dark-mode-toggle,
.hope-theme-toggle,
.hope-appearance-toggle,
[class*="dark-mode"],
[class*="theme-toggle"],
[class*="color-mode"],
[class*="appearance"],
[aria-label*="theme" i],
[aria-label*="dark" i],
[aria-label*="light" i],
svg[class*="moon"],
svg[class*="sun"],
svg[class*="Moon"],
svg[class*="Sun"],
button[class*="theme"],
button[title*="theme" i],
button[title*="dark" i],
button[title*="light" i] {
display: none !important;
}
/* 语言切换按钮 */
.hope-locale-switch,
.hope-lang-switch,
.hope-i18n-switch,
[class*="locale"],
[class*="lang-switch"],
[class*="language-switch"],
[class*="i18n"],
[aria-label*="language" i],
[aria-label*="lang" i],
button[class*="lang"],
button[title*="language" i],
button[title*="lang" i] {
display: none !important;
}
.hope-app-root a,
.hope-app-root [class*="link"] {
color: var(--theme-primary) !important;
}
.hope-app-root a:hover,
.hope-app-root [class*="link"]:hover {
color: rgb(0, 210, 230) !important;
}
.hope-icon,
[class*="hope-icon"],
[class*="hope-c-iDYHca"] svg,
.toolbar-toggle svg,
.left-toolbar svg,
.center-toolbar svg {
color: var(--theme-primary) !important;
}
.hope-table th,
.hope-table__th,
[class*="hope-table"] th,
[class*="hope-c-"][class*="th"] {
color: #555555 !important;
font-weight: 600 !important;
text-shadow: 0 1px 0 rgba(255, 255, 255, 0.20) !important;
}
.hope-table td,
.hope-table__td,
[class*="hope-table"] td,
[class*="hope-c-"][class*="td"] {
color: #444444 !important;
}
footer, footer.hope-stack,
[class*="hope-c-PJLV-ihQbspH-css"] {
display: none !important;
}
/* 右下角浮动菜单/工具栏 - 更透明 */
.center-toolbar, .toolbar-toggle,
.left-toolbar, .left-toolbar-box, .left-toolbar-in {
background:
linear-gradient(135deg, rgba(200, 200, 210, 0.05), rgba(200, 200, 210, 0.01)) !important;
-webkit-backdrop-filter: blur(6px) saturate(140%) !important;
backdrop-filter: blur(6px) saturate(140%) !important;
border: 1px solid rgba(200, 200, 210, 0.20) !important;
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.20), 0 4px 16px rgba(0, 0, 0, 0.06) !important;
}
/* 文件列表容器 - 更透明 */
.obj-box,
.hope-stack[class*="obj"] {
background:
linear-gradient(135deg, rgba(200, 200, 210, 0.10), rgba(200, 200, 210, 0.05)) !important;
-webkit-backdrop-filter: blur(6px) saturate(140%) !important;
backdrop-filter: blur(6px) saturate(140%) !important;
border: 1px solid rgba(200, 200, 210, 0.20) !important;
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.20), 0 6px 24px rgba(0, 0, 0, 0.06) !important;
}
/* 文件视图菜单 */
.hope-menu,
.hope-menu__content {
background:
linear-gradient(135deg, rgba(200, 200, 210, 0.05), rgba(200, 200, 210, 0.04)) !important;
-webkit-backdrop-filter: blur(6px) saturate(140%) !important;
backdrop-filter: blur(6px) saturate(140%) !important;
border: 1px solid rgba(200, 200, 210, 0.20) !important;
border-radius: 12px !important;
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.20), 0 8px 32px rgba(0, 0, 0, 0.06), 0 0 12px 1px rgba(200, 200, 210, 0.05) !important;
}
/* 菜单项本身无额外框,文字干净 */
.hope-menu__item,
.hope-menu__option,
.hope-menu [role="menuitem"] {
background: transparent !important;
border: none !important;
box-shadow: none !important;
backdrop-filter: none !important;
-webkit-backdrop-filter: none !important;
}
/* 表格容器 */
.hope-table,
table[class*="hope-"] {
background:
linear-gradient(135deg, rgba(200, 200, 210, 0.10), rgba(200, 200, 210, 0.05)) !important;
-webkit-backdrop-filter: blur(6px) saturate(140%) !important;
backdrop-filter: blur(6px) saturate(140%) !important;
border: 1px solid rgba(200, 200, 210, 0.20) !important;
border-radius: 12px !important;
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.20), 0 4px 20px rgba(0, 0, 0, 0.05) !important;
}
.liquid-bottom-area {
position: relative;
z-index: auto;
display: flex;
flex-direction: row;
justify-content: center;
align-items: center;
flex-wrap: wrap;
gap: 8px;
padding: 10px 0;
pointer-events: none;
}
.liquid-login-btn {
display: inline-block;
padding: 4px 16px;
font-size: 12px;
font-weight: 700;
color: #ffffff;
background:
linear-gradient(135deg, rgba(0, 188, 212, 0.42), rgba(0, 160, 180, 0.30)) !important;
border: 1px solid rgba(0, 188, 212, 0.55) !important;
border-radius: 8px !important;
box-shadow:
inset 0 1px 0 rgba(255, 255, 255, 0.20),
0 3px 10px rgba(0, 0, 0, 0.06) !important;
cursor: pointer;
text-decoration: none;
transition: all 0.2s ease;
pointer-events: auto;
text-shadow: 0 1px 3px rgba(0, 0, 0, 0.30);
white-space: nowrap;
}
.liquid-login-btn:hover {
background: linear-gradient(135deg, rgba(0, 188, 212, 0.55), rgba(0, 160, 180, 0.42)) !important;
box-shadow:
inset 0 1px 0 rgba(255, 255, 255, 0.20),
0 4px 12px rgba(0, 0, 0, 0.06) !important;
transform: translateY(-1px);
color: #ffffff;
}
/* 移动端适配 */
@media (max-width: 768px) {
.liquid-bottom-area {
flex-direction: row !important;
flex-wrap: wrap !important;
gap: 6px !important;
padding: 8px 0 !important;
}
.liquid-login-btn {
padding: 3px 10px !important;
font-size: 11px !important;
}
:root {
--lg-blur: 6px;
}
}
</style>
<script>
const defaultConfig={amount:1500,maxParticles:2500,size:[1,1],swingSpeed:[0.01,0.03],fallSpeed:[15,30],amplitude:[2,5],color:"rgb(225,225,225)",dprCap:2};
const rand=(min,max)=>Math.random()*(max-min)+min;
const SIZE_LAMBDA=0.0408;
const SIZE_C=100;
const SIZE_AMAX=SIZE_C*(1-Math.exp(-SIZE_LAMBDA*79))/SIZE_LAMBDA;
const sampleSize=()=>{const u=Math.random()*SIZE_AMAX;return 1-Math.log(1-(u*SIZE_LAMBDA)/SIZE_C)/SIZE_LAMBDA};
const BASE_WIDTH=1920;
const BASE_HEIGHT=1080;
const TWO_PI=Math.PI*2;
const SIN_TABLE_SIZE=2048;
const SIN_TABLE=new Float32Array(SIN_TABLE_SIZE);
for(let i=0;i<SIN_TABLE_SIZE;i+=1)SIN_TABLE[i]=Math.sin(i/SIN_TABLE_SIZE*TWO_PI);
const resolveElementById=(id,kind)=>{const el=document.getElementById(id);if(!el)throw new Error(`${kind} not found: ${id}`);return el};
const resolveElement=(elOrId,kind)=>{if(typeof elOrId==="string")return resolveElementById(elOrId,kind);return elOrId};
var SnowfallCanvas=class{canvas;ctx;container;running=false;rafId=null;lastTime=0;width=0;height=0;dpr=1;resizeObserver=null;resizeQueued=false;fallbackResizeAttached=false;particleCount=0;posX=new Float32Array(0);posY=new Float32Array(0);originX=new Float32Array(0);dx=new Float32Array(0);size=new Float32Array(0);amplitude=new Float32Array(0);velX=new Float32Array(0);velY=new Float32Array(0);visibilityHandlerAttached=false;autoPausedByVisibility=false;frameTimeAvg=16;perfCooldownFrames=0;dprOverride=null;config;constructor(options){this.canvas=resolveElement(options.canvas,"Canvas");this.container=resolveElement(options.container,"Container");const ctx=this.canvas.getContext("2d");if(!ctx)throw new Error("2D context is not supported");this.ctx=ctx;this.config={...defaultConfig,...options.config??{}};const sizeScale=this.config.size[0]??1;this.config.size=[sizeScale,sizeScale];this.resize();this.initParticles();this.start()}resize(){const rect=this.container.getBoundingClientRect();const dpr=Math.min(this.dprOverride??Math.min(window.devicePixelRatio||1,this.config.dprCap),this.config.dprCap);this.dpr=dpr;this.width=rect.width;this.height=rect.height;this.canvas.width=this.width*dpr;this.canvas.height=this.height*dpr;this.canvas.style.width=`${this.width}px`;this.canvas.style.height=`${this.height}px`;this.ctx.setTransform(dpr,0,0,dpr,0,0)}initParticles(){const count=Math.min(this.config.amount,this.config.maxParticles);this.particleCount=count;this.posX=new Float32Array(count);this.posY=new Float32Array(count);this.originX=new Float32Array(count);this.dx=new Float32Array(count);this.size=new Float32Array(count);this.amplitude=new Float32Array(count);this.velX=new Float32Array(count);this.velY=new Float32Array(count);const w=this.width;const h=this.height;const sizeScale=this.config.size[0];for(let i=0;i<count;i++){this.posX[i]=rand(0,w);this.posY[i]=rand(-h,0);this.originX[i]=this.posX[i];this.dx[i]=0;this.size[i]=Math.min(Math.max(sampleSize()*sizeScale,1),80);this.amplitude[i]=rand(this.config.amplitude[0],this.config.amplitude[1]);this.velX[i]=rand(this.config.swingSpeed[0],this.config.swingSpeed[1]);this.velY[i]=rand(this.config.fallSpeed[0],this.config.fallSpeed[1])}}update(dt){const w=this.width;const h=this.height;const count=this.particleCount;for(let i=0;i<count;i++){this.dx[i]+=this.velX[i]*dt;this.posX[i]=this.originX[i]+Math.sin(this.dx[i])*this.amplitude[i];this.posY[i]+=this.velY[i]*dt*0.06;if(this.posY[i]-this.size[i]>h){this.posY[i]=-this.size[i];this.originX[i]=rand(0,w);this.posX[i]=this.originX[i];this.dx[i]=0;this.size[i]=Math.min(Math.max(sampleSize()*this.config.size[0],1),80)}}}draw(){const ctx=this.ctx;const w=this.width;const h=this.height;ctx.clearRect(0,0,w,h);const count=this.particleCount;const color=this.config.color;ctx.fillStyle=color;for(let i=0;i<count;i++){const x=this.posX[i];const y=this.posY[i];const s=this.size[i];ctx.beginPath();ctx.arc(x,y,s/2,0,TWO_PI);ctx.fill()}}start(){if(this.running)return;this.running=true;this.lastTime=performance.now();this.loop()};loop=()=>{if(!this.running)return;const now=performance.now();const dt=Math.min((now-this.lastTime)/16.67,3);this.lastTime=now;this.update(dt);this.draw();this.rafId=requestAnimationFrame(this.loop)};stop(){this.running=false;if(this.rafId){cancelAnimationFrame(this.rafId);this.rafId=null}}destroy(){this.stop();if(this.resizeObserver){this.resizeObserver.disconnect();this.resizeObserver=null}}};window.SnowfallCanvas=SnowfallCanvas;
(function(){
function initSnow() {
var container=document.createElement('div');
container.id='snowfall-container';
container.style.cssText='position:fixed;top:0;left:0;width:100%;height:100%;z-index:9999;pointer-events:none;overflow:hidden;';
document.body.appendChild(container);
var canvas=document.createElement('canvas');
canvas.id='snowfall-canvas';
container.appendChild(canvas);
try {
new SnowfallCanvas({canvas:canvas,container:container,config:{amount:100,maxParticles:200,color:'rgba(255, 255, 255, 0.20)',size:[0.2,0.2],amplitude:[2,5],swingSpeed:[0.01,0.03]}});
} catch(e) { console.log('Snowfall init error:', e); }
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', initSnow);
} else {
initSnow();
}
setTimeout(initSnow, 500);
})();
</script>
Customize body
<div class="liquid-bottom-area">
<a href="/@login" class="liquid-login-btn">登录</a>
</div>
四、版本对比
| 项目 | 版本 A(含底部文字) | 版本 B(无底部文字) |
|---|---|---|
| head 内容 | CSS + 雪花 JS | CSS + 雪花 JS |
| body 内容 | 登录按钮 + 底部文字 | 登录按钮 |
| 底部文字 | 1n34云 / ilanzou / 服务条款 | 无 |
| 登录按钮 | 底部上方,窄,青色底,白色字 | 底部上方,窄,青色底,白色字 |
| 背景 | 图片 | 图片 |
| 雪花 | 有 | 有 |
| 全浅色 | 是 | 是 |
五、更新日志
v2.5.2(当前版本)
- 修复叠加问题:将
.obj-box从 A 档群组选择器中独立出来,避免与容器级玻璃底色双重叠加 - 全局降低模糊度:所有
blur(8px)→blur(6px),更轻量 - 全局降低不透明度:玻璃底色 alpha 整体下调一档(0.20→0.10, 0.14→0.07, 0.10→0.05, 0.04→0.02 等),预览区/表格更通透
- 边框/高光/阴影同步降低:边框 0.35→0.20,内高光 0.30→0.20,外阴影 0.12→0.06
v2.5
- 统一玻璃不透明度:容器底色
rgba(200, 200, 210, 0.10 / 0.04 / 0.02),hover0.14 / 0.07,边框0.35,内高光0.30,外阴影0.12(均统一为一个档位) - 统一模糊度:所有
backdrop-filter统一为blur(6px) saturate(140%)(移动端 6px,由--lg-blur控制) - 更换背景图片地址(pan.1n34.top)
- 合并「修改位置」与「使用教程」为「使用方法」,删除重复章节
v2.4.1(字体与透明度更新)
- 内置钉钉进步体(DingTalk JinBuTi)外链字体,全站文字改用该字体
- 全局降低不透明度(所有
rgba透明通道降至原来的约 70%),玻璃感更通透 - 新增「A 版底部文字如何修改」说明
v2.4
- 隐藏登录页明暗模式切换与语言切换选项
- 背景改为图片(删除所有视频相关代码)
- 降低玻璃模糊度(
--lg-blur: 12px) - 恢复雪花特效(内联 snowfall-canvas JS)
- 透明部分及边框改为很浅灰色
rgba(240, 240, 245, ...)(非白色) - 登录按钮移到左下角,窄宽度
- 底部文字框宽(
calc(100% - 32px),max-width 800px) - 登录按钮与文字框上下不等宽排列
- 底部栏
relative正常文档流,不遮挡任何内容 - 所有彩色元素保持青色主题
- 面包屑导航无液态玻璃边框,修复青色长方形 bug
- 表头文字增强可见度
- PNG 图标透明部分处理
六、注意事项
- 雪花性能:雪花特效使用 Canvas 渲染,在低端设备上可能占用一定 GPU 资源。如遇卡顿,可降低
amount值(如从 100 改为 50)。 - 浏览器兼容:
backdrop-filter在 Chrome 76+、Firefox 103+、Safari 9+ 支持。 - HTTPS:背景图片 URL 需通过 HTTPS 加载。
- 更新保留:OpenList 升级后自定义设置不会丢失(存于数据库)。
