68
0
0

Openlist美化

2026-09-05
2026-09-25

为了美化

https://doc.oplist.org

专门使用:

https://dumate.cn

制作了美化包

制作中参考了:

(非插件 设置修改源码)

教程下载:

https://pan.1n34.top/ilanzou/code/openlist-liquid-glass-v2.5.2.md

广告(未收钱)

Openlist推荐挂载https://www.ilanzou.com

#账号密码挂载 无需获取id#免费10GB不限速

教程:

OpenList 液态玻璃 + 高斯模糊美化源码 v2.5.2

基于 candywind(https://candywind.com)液态玻璃方案核心 CSS 改写,全部内联,零外部依赖 适用于 OpenList v4.x


一、使用方法(入口与粘贴位置)

OpenList 不支持插件,通过后台注入 CSS/JS:

  1. 登录管理后台:在站点地址栏加 /@manage(或 /manage)进入后台
  2. 进入全局设置:左侧菜单 → 设置 → 全局(Global)
  3. 粘贴代码:按所选版本将下方对应代码块完整复制,分别粘贴到下表两个字段
  4. 保存:点击保存后刷新页面生效
字段 用途
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),hover 0.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 图标透明部分处理

六、注意事项

  1. 雪花性能:雪花特效使用 Canvas 渲染,在低端设备上可能占用一定 GPU 资源。如遇卡顿,可降低 amount 值(如从 100 改为 50)。
  2. 浏览器兼容:backdrop-filter 在 Chrome 76+、Firefox 103+、Safari 9+ 支持。
  3. HTTPS:背景图片 URL 需通过 HTTPS 加载。
  4. 更新保留:OpenList 升级后自定义设置不会丢失(存于数据库)。

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或者给予支持!

评论

欢迎来到我的博客!