
右侧悬浮导航使用教程 饺子美化
这是一个功能丰富的WordPress右侧悬浮导航栏,提供快捷的页面操作和营销推广功能。
### ✨ 主要特性
- 🎯 固定在页面右侧,不随页面滚动消失
- 🎨 精美的渐变设计和动画效果
- ⚙️ 管理员可自定义各项参数
- 💾 设置自动保存到浏览器本地存储
- 📱 已移除手机端显示(桌面端专用)
---
## 安装使用
### 方法一: 直接集成到WordPress主题
1. **打开主题文件**
- 找到主题的 `footer.php` 文件
- 在 `</body>` 标签之前插入代码
导航按钮功能
### 1️⃣ 管理员设置按钮 🛠️
**位置**: 最上方(橙色按钮)
**功能**: 打开设置弹窗,自定义导航栏各项参数
**显示条件**:
- 仅管理员可见
- 仅在文章页和页面页显示
- 需要 `current_user_can('manage_options')` 权限
**图标**: `fa-cog` (齿轮图标)
---
### 2️⃣ VIP会员按钮 💎
**位置**: 第二个(蓝色渐变按钮)
**功能**: 展示VIP会员信息和购买入口
**特效**:
- 脉冲动画效果(三个同心圆扩散)
- 悬停显示VIP信息面板
**面板内容**:
- VIP价格: ¥118 (原价 ¥298)
- 会员权益:
- 微信QQ客服一对一
- 源码永久免费升级
- 大量专属精品源码
- 免费下载全站资源
- 购买按钮跳转链接
**可自定义项**:
- 图标样式
- VIP价格
- 原价
- 开通链接
---
### 3️⃣ 每日签到按钮 📅
**位置**: 第三个(白色按钮)
**功能**: 用户每日签到获取积分
**交互**: 点击触发签到功能
**可自定义项**:
- 图标样式
- 签到链接
- 提示文字
---
### 4️⃣ 在线客服按钮 💬
**位置**: 第四个(白色按钮)
**功能**: 打开在线客服对话窗口
**特效**: 右上角显示"在线"状态徽章(绿色脉冲动画)
**可自定义项**:
- 图标样式
- 状态文字(在线/离线)
- 提示文字
---
### 5️⃣ 打赏按钮 🎁
**位置**: 第五个(白色按钮)
**功能**: 跳转到打赏页面
**交互**: 点击在新窗口打开打赏页面
**可自定义项**:
- 图标样式
- 打赏页面链接
- 提示文字
---
### 6️⃣ 公众号二维码 📱
**位置**: 第六个(白色按钮)
**功能**: 展示公众号二维码
**交互**: 鼠标悬停显示二维码面板
**可自定义项**:
- 图标样式
- 二维码图片URL
- 标题文字
- 描述文字
- 提示文字
---
### 7️⃣ 全屏按钮 🔳
**位置**: 第七个(白色按钮)
**功能**: 切换浏览器全屏模式
**交互**:
- 点击进入/退出全屏
- 图标动态切换(展开/压缩)
- 提示文字动态更新
**自动检测**:
- 进入全屏: 图标变为 `fa-compress`,提示"退出全屏"
- 退出全屏: 图标变为 `fa-expand`,提示"展开全屏"
---
### 8️⃣ 返回顶部 ⬆️
**位置**: 最下方(蓝色渐变按钮)
**功能**: 平滑滚动到页面顶部
**显示逻辑**:
- 页面滚动超过300px时显示
- 页面在顶部时自动隐藏
**动画效果**: 淡入淡出 + 平滑滚动
---
## 设置弹窗教程
### 打开设置弹窗
1. 以管理员身份登录WordPress
2. 访问任意文章页或页面
3. 点击右侧导航最上方的橙色"页面设置"按钮
### 设置界面说明
#### 📅 签到按钮设置
```
┌─────────────────────────────────┐
│ 图标类名: fa-calendar-check-o │
│ 链接地址: javascript:; │
│ 提示文字: 每日签到 │
└─────────────────────────────────┘
```
#### 💬 在线客服设置
```
┌─────────────────────────────────┐
│ 图标类名: fa-comments-o │
│ 状态文字: 在线 │
│ 提示文字: 在线客服 │
└─────────────────────────────────┘
```
#### 🎁 打赏按钮设置
```
┌─────────────────────────────────┐
│ 图标类名: fa-gift │
│ 链接地址: /dashang │
│ 提示文字: 打赏我们 │
└─────────────────────────────────┘
```
#### 📱 二维码设置
```
┌─────────────────────────────────┐
│ 图标类名: fa-qrcode │
│ 二维码图片URL: [图片地址] │
│ 二维码标题: 扫码关注公众号 │
│ 二维码描述: 获取更多最新源码 │
│ 提示文字: 公众号二维码 │
└─────────────────────────────────┘
```
#### 💎 VIP按钮设置
```
┌─────────────────────────────────┐
│ 图标类名: fa-diamond │
│ VIP价格: ¥118 │
│ 原价: ¥298 │
│ 开通链接: /vip-2 │
└─────────────────────────────────┘
```
### 保存设置
1. 修改完参数后,点击右上角"保存设置"按钮
2. 系统会自动:
- 更新页面显示
- 保存到浏览器 localStorage
- 显示"设置保存成功"提示
### 取消设置
- 点击"取消"按钮或弹窗外部区域
- 按 `ESC` 键关闭弹窗
- 关闭后不保存任何修改
---
## 常用图标类名参考
### Font Awesome 图标库
导航使用 Font Awesome 图标,常用图标类名:
| 图标 | 类名 | 说明 |
|------|------|------|
| 🏠 | `fa-home` | 首页 |
| 💎 | `fa-diamond` | VIP/钻石 |
| 📅 | `fa-calendar` | 日历 |
| ✅ | `fa-check-circle` | 签到 |
| 💬 | `fa-comments` | 评论/客服 |
| 🎁 | `fa-gift` | 礼物/打赏 |
| 📱 | `fa-qrcode` | 二维码 |
| ⚙️ | `fa-cog` | 设置 |
| ⬆️ | `fa-arrow-up` | 返回顶部 |
| 🔳 | `fa-expand` | 全屏展开 |
| 🔲 | `fa-compress` | 全屏退出 |
| 🎨 | `fa-paint-brush` | 主题 |
| 👤 | `fa-user` | 用户 |
| ❤️ | `fa-heart` | 收藏 |
| ⭐ | `fa-star` | 星标 |
| 📧 | `fa-envelope` | 邮件 |
| 📞 | `fa-phone` | 电话 |
查找更多图标
访问 [Font Awesome 官网](https://fontawesome.com/icons) 查找更多图标
<!-- 右侧悬浮导航 - 完全修复版(已删除手机端功能) -->
<style>
:root {
--primary-color: #3b82f6;
--primary-hover: #2563eb;
--text-primary: #334155;
--text-secondary: #64748b;
--bg-light: #f8fafc;
--shadow-sm: 0 2px 8px rgba(0,0,0,.05);
--shadow-md: 0 5px 15px rgba(0,0,0,.08);
--btn-gradient: linear-gradient(145deg, #ffffff, #f5f5f5);
--btn-hover-gradient: linear-gradient(145deg, #f8fafc, #eff6ff);
}
.comfortable-nav{
position:fixed;
right:20px;
top:50%;
transform:translateY(-50%);
z-index:9999;
display:none;
flex-direction:column;
gap:12px;
padding:10px 0;
will-change: opacity;
}
/* 桌面端显示导航栏 */
@media (min-width: 768px) {
.comfortable-nav {
display: flex !important;
}
}
.nav-item{
width:52px;
height:52px;
border-radius:18px;
background: var(--btn-gradient);
box-shadow:var(--shadow-sm);
display:flex;
align-items:center;
justify-content:center;
cursor:pointer;
position:relative;
transition:transform .2s ease, box-shadow .2s ease;
border: 1px solid #f0f0f0;
background-image: radial-gradient(circle at 10% 10%, rgba(255,255,255,0.8) 0%, rgba(245,245,245,0.1) 100%);
will-change: transform;
}
.nav-item:hover{
background: var(--btn-hover-gradient);
transform:translateX(-6px) translateY(-2px);
box-shadow:0 6px 16px rgba(0,0,0,.1);
border-color: rgba(59, 130, 246, 0.2);
}
.comfortable-nav .nav-item.service-item {
width:52px !important;
height:52px !important;
border-radius:18px !important;
background: linear-gradient(145deg, #ffffff, #f5f5f5) !important;
background-image: radial-gradient(circle at 10% 10%, rgba(255,255,255,0.8) 0%, rgba(245,245,245,0.1) 100%) !important;
border: 1px solid #f0f0f0 !important;
box-shadow:0 2px 8px rgba(0,0,0,.05) !important;
margin: 0 !important;
padding: 0 !important;
}
.comfortable-nav .nav-item.service-item:hover {
background: var(--btn-hover-gradient) !important;
transform:translateX(-6px) translateY(-2px) !important;
box-shadow:0 6px 16px rgba(0,0,0,.1) !important;
border-color: rgba(59, 130, 246, 0.2) !important;
}
.nav-icon{
font-size:22px;
color:var(--text-secondary);
transition:color .15s ease;
}
.nav-item:hover .nav-icon{
color:var(--primary-color);
}
.nav-tooltip{
position:absolute;
right:60px;
top:50%;
transform:translateY(-50%);
background-color:var(--text-primary);
color:#fff;
padding:8px 16px;
border-radius:10px;
font-size:13px;
white-space:nowrap;
opacity:0;
pointer-events:none;
transition:opacity .15s ease;
box-shadow:0 4px 12px rgba(0,0,0,.12);
}
.nav-tooltip::after{
content:'';
position:absolute;
top:50%;
right:-4px;
transform:translateY(-50%);
width:8px;
height:8px;
background-color:var(--text-primary);
transform: translateY(-50%) rotate(45deg);
}
.nav-item:hover .nav-tooltip{
opacity:1;
right:58px;
}
.vip-item-right{
width:56px;
height:56px;
border-radius:18px;
background: linear-gradient(135deg, var(--primary-color), #60a5fa);
position:relative;
box-shadow:0 8px 20px rgba(59,130,246,.35);
z-index:2;
border:none;
background-image: none;
}
.vip-item-right .nav-icon{
color:#fff;
font-size:24px;
position:relative;
z-index:2;
}
.vip-pulse{
position:absolute;
width:100%;
height:100%;
border-radius:18px;
background-color:rgba(59,130,246,.4);
animation:pulse 2s infinite ease-in-out;
z-index:1;
will-change: transform, opacity;
}
@keyframes pulse{
0%{transform:scale(1);opacity:1}
100%{transform:scale(2);opacity:0}
}
.vip-panel{
position:absolute;
right:75px;
top:50%;
transform:translateY(-50%);
background-color:#fff;
border-radius:14px;
box-shadow:var(--shadow-md);
width:290px;
padding:22px;
opacity:0;
pointer-events:none;
transition:opacity .15s ease, transform .15s ease;
}
.vip-panel::after{
content:'';
position:absolute;
top:50%;
right:-8px;
transform:translateY(-50%) rotate(45deg);
width:16px;
height:16px;
background-color:#fff;
box-shadow:3px -3px 8px rgba(0,0,0,.08);
z-index:-1;
}
.vip-item-right:hover .vip-panel{
opacity:1;
pointer-events:all;
transform: translateY(-50%) translateX(-8px);
}
.vip-panel h4{
color:var(--text-primary);
font-size:17px;
margin-bottom:14px;
font-weight:600;
display:flex;
align-items:center;
gap:8px;
}
.vip-benefits{margin-bottom:20px}
.vip-benefit{
display:flex;
align-items:center;
gap:10px;
font-size:14px;
color:var(--text-secondary);
margin-bottom:10px;
padding:4px 0;
}
.vip-benefit i{
color:var(--primary-color);
font-size:16px;
}
.vip-pricing{
background-color:var(--bg-light);
border-radius:12px;
padding:16px;
margin-bottom:20px;
border:1px solid rgba(59,130,246,0.1);
}
.vip-price .current{
font-size:24px;
font-weight:700;
color:var(--primary-color);
}
.vip-price .original{
font-size:14px;
color:var(--text-secondary);
text-decoration:line-through;
margin-left:8px;
}
.vip-period{
font-size:13px;
color:var(--text-secondary);
margin-top:4px;
}
.vip-cta{
width:100%;
padding:12px 0;
background: linear-gradient(135deg, var(--primary-color), var(--primary-hover));
color:#fff;
border:none;
border-radius:10px;
font-size:15px;
font-weight:600;
cursor:pointer;
transition:transform .15s ease, box-shadow .15s ease;
display:flex;
align-items:center;
justify-content:center;
gap:8px;
text-decoration:none;
box-shadow:0 4px 12px rgba(59,130,246,.2);
}
.vip-cta:hover{
transform:translateY(-2px);
box-shadow:0 6px 16px rgba(59,130,246,.3);
color:#fff;
}
.qrcode-panel{
position:absolute;
right:70px;
top:50%;
transform:translateY(-50%);
background-color:#fff;
border-radius:14px;
box-shadow:var(--shadow-md);
width:230px;
padding:22px;
text-align:center;
opacity:0;
pointer-events:none;
transition:opacity .15s ease, transform .15s ease;
}
.qrcode-panel::after{
content:'';
position:absolute;
top:50%;
right:-8px;
transform:translateY(-50%) rotate(45deg);
width:16px;
height:16px;
background-color:#fff;
box-shadow:3px -3px 8px rgba(0,0,0,.08);
z-index:-1;
}
.nav-item:hover .qrcode-panel{
opacity:1;
pointer-events:all;
transform: translateY(-50%) translateX(-8px);
}
.qrcode-container{
background-color:#fff;
border-radius:12px;
padding:14px;
display:inline-block;
box-shadow:var(--shadow-sm);
margin-bottom:16px;
border:1px solid rgba(0,0,0,0.05);
}
.qrcode-img{
width:140px;
height:140px;
border-radius:8px;
}
.qrcode-title{
color:var(--text-primary);
font-size:15px;
font-weight:600;
margin-bottom:8px;
}
.qrcode-desc{
color:var(--text-secondary);
font-size:13px;
}
.service-item{position:relative}
.service-status{
position:absolute;
top:-4px !important;
right:-4px !important;
background-color:#10b981;
color:#fff;
font-size:11px;
padding:2px 6px !important;
border-radius:14px;
font-weight:600;
white-space:nowrap;
z-index:2;
animation:pulseOnline 2s infinite;
box-shadow:0 2px 6px rgba(16,185,129,.2);
}
@keyframes pulseOnline{
0%{box-shadow:0 0 0 0 rgba(16,185,129,.5)}
70%{box-shadow:0 0 0 8px rgba(16,185,129,0)}
100%{box-shadow:0 0 0 0 rgba(16,185,129,0)}
}
.backtop-item{
border-radius:18px;
background: linear-gradient(135deg, var(--primary-color), var(--primary-hover));
opacity:0;
visibility:hidden;
transition:opacity .15s ease;
border-color:transparent;
background-image: none;
}
.backtop-item .nav-icon{color:#fff}
.backtop-item:hover{
background: linear-gradient(135deg, var(--primary-hover), #1d4ed8);
border-color:transparent;
}
.backtop-item.visible{
opacity:1;
visibility:visible;
}
.checkin-link,.service-button{
display:flex;
align-items:center;
justify-content:center;
width:100%;
height:100%;
position:relative;
text-decoration:none;
border-radius: inherit;
border: none !important;
background: transparent !important;
padding: 0 !important;
margin: 0 !important;
}
.fullscreen-item.active{
background: var(--btn-hover-gradient);
border-color: rgba(59, 130, 246, 0.3);
}
/* 管理员设置按钮 */
.admin-settings-item {
background: linear-gradient(145deg, #f59e0b, #f97316) !important;
border-color: rgba(249, 115, 22, 0.2) !important;
display: none !important;
}
.admin-settings-item .nav-icon {
color: #fff !important;
}
.admin-settings-item:hover {
background: linear-gradient(145deg, #f97316, #ea580c) !important;
border-color: rgba(234, 88, 12, 0.3) !important;
}
.admin-settings-item.show-admin {
display: flex !important;
}
/* 弹窗样式 */
.settings-modal {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.15);
display: flex;
align-items: center;
justify-content: center;
z-index: 99999;
opacity: 0;
pointer-events: none;
transition: opacity .2s ease;
}
.settings-modal.active {
opacity: 1;
pointer-events: all;
}
.settings-modal-content {
background: linear-gradient(135deg, #ffffff 0%, #f1f5f9 100%);
border-radius: 28px;
width: 95%;
max-width: 960px;
max-height: 90vh;
overflow-y: auto;
overflow-x: hidden;
padding: 0;
box-shadow: 0 30px 80px rgba(0, 0, 0, 0.4), 0 0 100px rgba(59, 130, 246, 0.15);
transform: translateY(40px) scale(0.95);
transition: transform .2s ease;
position: relative;
}
.settings-modal.active .settings-modal-content {
transform: translateY(0) scale(1);
}
.settings-modal-content::-webkit-scrollbar {
width: 10px;
position: absolute;
right: 0;
}
.settings-modal-content::-webkit-scrollbar-track {
background: linear-gradient(180deg, #f1f5f9 0%, #e2e8f0 100%);
border-radius: 10px;
margin: 8px 0;
}
.settings-modal-content::-webkit-scrollbar-thumb {
background: linear-gradient(180deg,
#ff6b6b 0%,
#ffa500 16%,
#ffd700 32%,
#4ecdc4 48%,
#45b7d1 64%,
#9b59b6 80%,
#ff6b9d 100%
);
border-radius: 10px;
border: 2px solid #f1f5f9;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
}
.settings-modal-content::-webkit-scrollbar-thumb:hover {
background: linear-gradient(180deg,
#ff5252 0%,
#ff9800 16%,
#ffc107 32%,
#26a69a 48%,
#2196f3 64%,
#8e24aa 80%,
#e91e63 100%
);
box-shadow: 0 0 15px rgba(0, 0, 0, 0.15);
}
.settings-modal-header {
background: linear-gradient(135deg, #667eea 0%, #764ba2 50%, #f093fb 100%);
padding: 16px 28px;
border-radius: 28px 28px 0 0;
position: relative;
overflow: hidden;
display: flex;
align-items: center;
justify-content: space-between;
}
.settings-modal-header::before {
content: '';
position: absolute;
top: -100%;
right: -100%;
width: 200%;
height: 200%;
background: radial-gradient(circle, rgba(255,255,255,0.2) 0%, transparent 60%);
animation: shimmer 3s ease-in-out infinite;
}
@keyframes shimmer {
0%, 100% { transform: translate(0, 0); }
50% { transform: translate(-20%, -20%); }
}
.settings-modal-title {
font-size: 20px;
font-weight: 800;
color: #fff;
display: flex;
align-items: center;
gap: 10px;
text-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
position: relative;
z-index: 1;
}
.settings-modal-title i {
font-size: 22px;
animation: spin 4s linear infinite;
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
.settings-modal-close {
position: absolute;
top: 12px;
right: 20px;
background: rgba(255, 255, 255, 0.25);
border: 2px solid rgba(255, 255, 255, 0.4);
font-size: 18px;
color: #fff;
cursor: pointer;
width: 36px;
height: 36px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.2s ease;
}
.settings-modal-close:hover {
background: rgba(255, 255, 255, 0.4);
border-color: rgba(255, 255, 255, 0.6);
transform: translateY(-50%) rotate(90deg) scale(1.15);
}
/* 头部按钮容器 */
.settings-modal-actions {
display: flex;
align-items: center;
gap: 12px;
position: relative;
z-index: 1;
margin-right: 60px;
}
.settings-modal-body {
padding: 20px 28px;
background: linear-gradient(to bottom, #f8fafc 0%, #ffffff 100%);
overflow: hidden;
}
.settings-card {
background: linear-gradient(135deg, #ffffff 0%, #fafbfc 100%);
border-radius: 20px;
padding: 20px;
border: 2px solid transparent;
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.06);
position: relative;
overflow: hidden;
}
.settings-card::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 4px;
background: linear-gradient(90deg, #667eea, #764ba2, #f093fb);
opacity: 0.8;
}
/* 设置项分组容器 */
.settings-section {
margin-bottom: 16px;
padding-bottom: 12px;
border-bottom: 2px solid #f1f5f9;
}
.settings-section:last-child {
margin-bottom: 0;
padding-bottom: 0;
border-bottom: none;
}
.settings-section-title {
font-size: 16px;
font-weight: 700;
color: #1e293b;
margin-bottom: 12px;
display: flex;
align-items: center;
gap: 8px;
}
.settings-section-title i {
width: 32px;
height: 32px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 8px;
font-size: 16px;
}
.settings-section:nth-child(1) .settings-section-title i {
background: linear-gradient(135deg, #10b981, #34d399);
color: #fff;
}
.settings-section:nth-child(2) .settings-section-title i {
background: linear-gradient(135deg, #3b82f6, #60a5fa);
color: #fff;
}
.settings-section:nth-child(3) .settings-section-title i {
background: linear-gradient(135deg, #f59e0b, #fbbf24);
color: #fff;
}
.settings-section:nth-child(4) .settings-section-title i {
background: linear-gradient(135deg, #8b5cf6, #a78bfa);
color: #fff;
}
.settings-section:nth-child(5) .settings-section-title i {
background: linear-gradient(135deg, #ec4899, #f472b6);
color: #fff;
}
/* 设置项网格布局 */
.settings-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 12px;
}
/* VIP单行横排布局 */
.settings-grid.vip-grid {
display: flex;
gap: 12px;
flex-wrap: nowrap;
overflow: visible;
}
.settings-grid.vip-grid .settings-form-group {
flex: 1;
min-width: 0;
}
.settings-form-group {
margin-bottom: 0;
}
.settings-form-label {
display: block;
font-size: 12px;
color: #475569;
margin-bottom: 6px;
font-weight: 600;
}
.settings-form-input {
width: 100%;
padding: 8px 12px;
border: 2px solid #e2e8f0;
border-radius: 10px;
font-size: 13px;
color: #334155;
transition: border-color .15s ease;
background: #fff;
}
.settings-form-input:focus {
outline: none;
border-color: #667eea;
}
.settings-btn {
padding: 10px 20px;
border-radius: 12px;
font-size: 14px;
font-weight: 600;
cursor: pointer;
transition: all 0.2s ease;
border: 2px solid transparent;
display: flex;
align-items: center;
gap: 8px;
white-space: nowrap;
}
.settings-btn-cancel {
background: rgba(255, 255, 255, 0.15);
color: #fff;
border: 2px solid rgba(255, 255, 255, 0.3);
backdrop-filter: blur(10px);
}
.settings-btn-cancel:hover {
background: rgba(255, 255, 255, 0.25);
border-color: rgba(255, 255, 255, 0.5);
transform: translateY(-2px);
}
.settings-btn-save {
background: rgba(255, 255, 255, 0.95);
color: #667eea;
border: 2px solid rgba(255, 255, 255, 0.5);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
}
.settings-btn-save:hover {
transform: translateY(-2px);
box-shadow: 0 6px 16px rgba(0, 0, 0, 0.2);
background: #fff;
}
@media (max-width: 768px) {
.settings-modal-body {
padding: 16px;
}
.settings-modal-header {
padding: 16px 20px;
flex-wrap: wrap;
}
.settings-modal-actions {
margin-right: 50px;
gap: 8px;
}
.settings-card {
padding: 16px;
}
.settings-grid {
grid-template-columns: 1fr;
gap: 10px;
}
.settings-grid.vip-grid {
flex-wrap: nowrap;
overflow-x: auto;
-webkit-overflow-scrolling: touch;
}
.settings-grid.vip-grid .settings-form-group {
min-width: 140px;
}
.settings-form-input {
padding: 10px 12px;
font-size: 12px;
}
.settings-btn {
padding: 8px 16px;
font-size: 13px;
}
}
</style>
<!-- 导航HTML -->
<div class="comfortable-nav">
<!-- 管理员设置按钮 - 通过PHP控制显示 -->
<?php if (current_user_can('manage_options') && (is_single() || is_page())): ?>
<div class="nav-item admin-settings-item show-admin" id="adminSettingsBtn">
<i class="fa fa-cog nav-icon"></i>
<span class="nav-tooltip">页面设置</span>
</div>
<?php endif; ?>
<!-- VIP按钮 -->
<div class="nav-item vip-item-right">
<div class="vip-pulse"></div>
<div class="vip-pulse"></div>
<div class="vip-pulse"></div>
<i class="fa fa-diamond nav-icon"></i>
<div class="vip-panel">
<h4><i class="fa fa-diamond"></i> 永久会员新春钜惠</h4>
<div class="vip-benefits">
<div class="vip-benefit"><i class="fa fa-check-circle"></i><span>微信QQ客服一对一</span></div>
<div class="vip-benefit"><i class="fa fa-check-circle"></i><span>源码永久免费升级</span></div>
<div class="vip-benefit"><i class="fa fa-check-circle"></i><span>大量专属精品源码</span></div>
<div class="vip-benefit"><i class="fa fa-check-circle"></i><span>免费下载全站资源</span></div>
</div>
<div class="vip-pricing">
<div class="vip-price">
<span class="current">¥118</span>
<span class="original">¥298</span>
</div>
<div class="vip-period">永久会员 · 立省180元</div>
</div>
<a href="/vip-2" class="vip-cta"><i class="fa fa-rocket"></i> 立即开通</a>
</div>
</div>
<!-- 签到按钮 -->
<div class="nav-item">
<a class="initiate-checkin my-custom-checkin checkin-link" href="javascript:;" form-action="user_checkin" id="checkinLink">
<i class="fa fa-calendar-check-o nav-icon" id="checkinIcon"></i>
<span class="nav-tooltip" id="checkinTooltip">每日签到</span>
</a>
</div>
<!-- 在线客服 -->
<div class="nav-item service-item">
<button data-height="550" data-remote="/wp-admin/admin-ajax.php?action=private_window_modal&receive_user=1" class="service-button" data-toggle="RefreshModal" id="serviceButton">
<i class="fa fa-comments-o nav-icon" id="serviceIcon"></i>
<span class="service-status" id="serviceStatus">在线</span>
<span class="nav-tooltip" id="serviceTooltip">在线客服</span>
</button>
</div>
<!-- 打赏 -->
<div class="nav-item">
<a href="/dashang" class="service-button" target="_blank" rel="noopener noreferrer" id="rewardLink">
<i class="fa fa-gift nav-icon" id="rewardIcon"></i>
<span class="nav-tooltip" id="rewardTooltip">打赏我们</span>
</a>
</div>
<!-- 二维码 -->
<div class="nav-item">
<i class="fa fa-qrcode nav-icon" id="qrcodeIcon"></i>
<div class="qrcode-panel">
<div class="qrcode-container">
<img src="https://cs.yykbk.com/wp-content/uploads/2025/03/35.jpg" alt="公众号二维码" class="qrcode-img" id="qrcodeImage">
</div>
<div class="qrcode-title" id="qrcodeTitle">扫码关注公众号</div>
<div class="qrcode-desc" id="qrcodeDesc">获取更多最新源码或模板</div>
</div>
<span class="nav-tooltip" id="qrcodeTooltip">公众号二维码</span>
</div>
<!-- 全屏 -->
<div class="nav-item fullscreen-item">
<i class="fa fa-expand nav-icon" id="fullscreen-icon"></i>
<span class="nav-tooltip" id="fullscreen-tooltip">展开全屏</span>
</div>
<!-- 返回顶部 -->
<div class="nav-item backtop-item">
<i class="fa fa-arrow-up nav-icon"></i>
<span class="nav-tooltip">返回顶部</span>
</div>
</div>
<!-- 设置弹窗 -->
<div class="settings-modal" id="settingsModal">
<div class="settings-modal-content">
<div class="settings-modal-header">
<h3 class="settings-modal-title"><i class="fa fa-cog"></i> 右侧导航设置</h3>
<div class="settings-modal-actions">
<button class="settings-btn settings-btn-cancel" id="cancelSettingsBtn"><i class="fa fa-times"></i> 取消</button>
<button class="settings-btn settings-btn-save" id="saveSettingsBtn"><i class="fa fa-check"></i> 保存设置</button>
</div>
<button class="settings-modal-close" id="closeSettingsModal"><i class="fa fa-times"></i></button>
</div>
<div class="settings-modal-body">
<div class="settings-card">
<!-- 签到按钮设置 -->
<div class="settings-section">
<h4 class="settings-section-title"><i class="fa fa-calendar-check-o"></i> 签到按钮</h4>
<div class="settings-grid">
<div class="settings-form-group">
<label class="settings-form-label">图标类名</label>
<input type="text" class="settings-form-input" id="inputCheckinIcon" value="fa-calendar-check-o">
</div>
<div class="settings-form-group">
<label class="settings-form-label">链接地址</label>
<input type="text" class="settings-form-input" id="inputCheckinLink" value="javascript:;">
</div>
<div class="settings-form-group">
<label class="settings-form-label">提示文字</label>
<input type="text" class="settings-form-input" id="inputCheckinTooltip" value="每日签到">
</div>
</div>
</div>
<!-- 在线客服设置 -->
<div class="settings-section">
<h4 class="settings-section-title"><i class="fa fa-comments-o"></i> 在线客服</h4>
<div class="settings-grid">
<div class="settings-form-group">
<label class="settings-form-label">图标类名</label>
<input type="text" class="settings-form-input" id="inputServiceIcon" value="fa-comments-o">
</div>
<div class="settings-form-group">
<label class="settings-form-label">状态文字</label>
<input type="text" class="settings-form-input" id="inputServiceStatus" value="在线">
</div>
<div class="settings-form-group">
<label class="settings-form-label">提示文字</label>
<input type="text" class="settings-form-input" id="inputServiceTooltip" value="在线客服">
</div>
</div>
</div>
<!-- 打赏按钮设置 -->
<div class="settings-section">
<h4 class="settings-section-title"><i class="fa fa-gift"></i> 打赏按钮</h4>
<div class="settings-grid">
<div class="settings-form-group">
<label class="settings-form-label">图标类名</label>
<input type="text" class="settings-form-input" id="inputRewardIcon" value="fa-gift">
</div>
<div class="settings-form-group">
<label class="settings-form-label">链接地址</label>
<input type="text" class="settings-form-input" id="inputRewardLink" value="/dashang">
</div>
<div class="settings-form-group">
<label class="settings-form-label">提示文字</label>
<input type="text" class="settings-form-input" id="inputRewardTooltip" value="打赏我们">
</div>
</div>
</div>
<!-- 二维码设置 -->
<div class="settings-section">
<h4 class="settings-section-title"><i class="fa fa-qrcode"></i> 二维码</h4>
<div class="settings-grid">
<div class="settings-form-group">
<label class="settings-form-label">图标类名</label>
<input type="text" class="settings-form-input" id="inputQrcodeIcon" value="fa-qrcode">
</div>
<div class="settings-form-group">
<label class="settings-form-label">二维码图片URL</label>
<input type="text" class="settings-form-input" id="inputQrcodeImage" value="https://cs.yykbk.com/wp-content/uploads/2025/03/35.jpg">
</div>
<div class="settings-form-group">
<label class="settings-form-label">二维码标题</label>
<input type="text" class="settings-form-input" id="inputQrcodeTitle" value="扫码关注公众号">
</div>
<div class="settings-form-group">
<label class="settings-form-label">二维码描述</label>
<input type="text" class="settings-form-input" id="inputQrcodeDesc" value="获取更多最新源码或模板">
</div>
<div class="settings-form-group">
<label class="settings-form-label">提示文字</label>
<input type="text" class="settings-form-input" id="inputQrcodeTooltip" value="公众号二维码">
</div>
</div>
</div>
<!-- VIP按钮设置 -->
<div class="settings-section">
<h4 class="settings-section-title"><i class="fa fa-diamond"></i> VIP按钮</h4>
<div class="settings-grid vip-grid">
<div class="settings-form-group">
<label class="settings-form-label">图标类名</label>
<input type="text" class="settings-form-input" id="inputVipIcon" value="fa-diamond">
</div>
<div class="settings-form-group">
<label class="settings-form-label">VIP价格</label>
<input type="text" class="settings-form-input" id="inputVipPrice" value="¥118">
</div>
<div class="settings-form-group">
<label class="settings-form-label">原价</label>
<input type="text" class="settings-form-input" id="inputVipOriginalPrice" value="¥298">
</div>
<div class="settings-form-group">
<label class="settings-form-label">开通链接</label>
<input type="text" class="settings-form-input" id="inputVipLink" value="/vip-2">
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<script>
(function() {
'use strict';
// 缓存DOM元素
const adminSettingsBtn = document.getElementById('adminSettingsBtn');
const settingsModal = document.getElementById('settingsModal');
const closeSettingsModalBtn = document.getElementById('closeSettingsModal');
const cancelSettingsBtn = document.getElementById('cancelSettingsBtn');
const saveSettingsBtn = document.getElementById('saveSettingsBtn');
// 打开设置弹窗
if (adminSettingsBtn) {
adminSettingsBtn.addEventListener('click', function() {
settingsModal.classList.add('active');
document.body.style.overflow = 'hidden';
});
}
// 关闭弹窗
function closeModal() {
settingsModal.classList.remove('active');
document.body.style.overflow = '';
}
if (closeSettingsModalBtn) closeSettingsModalBtn.addEventListener('click', closeModal);
if (cancelSettingsBtn) cancelSettingsBtn.addEventListener('click', closeModal);
settingsModal.addEventListener('click', function(e) {
if (e.target === settingsModal) closeModal();
});
document.addEventListener('keydown', function(e) {
if (e.key === 'Escape' && settingsModal.classList.contains('active')) closeModal();
});
// 保存设置
if (saveSettingsBtn) {
saveSettingsBtn.addEventListener('click', function() {
// 批量更新DOM
const updates = {
checkinIcon: { el: document.getElementById('checkinIcon'), prop: 'className', format: v => 'fa ' + v + ' nav-icon' },
checkinLink: { el: document.getElementById('checkinLink'), prop: 'href' },
checkinTooltip: { el: document.getElementById('checkinTooltip'), prop: 'textContent' },
serviceIcon: { el: document.getElementById('serviceIcon'), prop: 'className', format: v => 'fa ' + v + ' nav-icon' },
serviceStatus: { el: document.getElementById('serviceStatus'), prop: 'textContent' },
serviceTooltip: { el: document.getElementById('serviceTooltip'), prop: 'textContent' },
rewardIcon: { el: document.getElementById('rewardIcon'), prop: 'className', format: v => 'fa ' + v + ' nav-icon' },
rewardLink: { el: document.getElementById('rewardLink'), prop: 'href' },
rewardTooltip: { el: document.getElementById('rewardTooltip'), prop: 'textContent' },
qrcodeIcon: { el: document.getElementById('qrcodeIcon'), prop: 'className', format: v => 'fa ' + v + ' nav-icon' },
qrcodeImage: { el: document.getElementById('qrcodeImage'), prop: 'src' },
qrcodeTitle: { el: document.getElementById('qrcodeTitle'), prop: 'textContent' },
qrcodeDesc: { el: document.getElementById('qrcodeDesc'), prop: 'textContent' },
qrcodeTooltip: { el: document.getElementById('qrcodeTooltip'), prop: 'textContent' }
};
// 执行更新
for (const [key, config] of Object.entries(updates)) {
const inputId = 'input' + key.charAt(0).toUpperCase() + key.slice(1);
const input = document.getElementById(inputId);
if (input && config.el) {
const value = input.value;
config.el[config.prop] = config.format ? config.format(value) : value;
}
}
// VIP特殊处理
const vipIconInput = document.getElementById('inputVipIcon');
const vipIcon = document.querySelector('.vip-item-right .nav-icon');
if (vipIconInput && vipIcon) vipIcon.className = 'fa ' + vipIconInput.value + ' nav-icon';
const vipPriceInput = document.getElementById('inputVipPrice');
const vipPrice = document.querySelector('.vip-price .current');
if (vipPriceInput && vipPrice) vipPrice.textContent = vipPriceInput.value;
const vipOriginalPriceInput = document.getElementById('inputVipOriginalPrice');
const vipOriginalPrice = document.querySelector('.vip-price .original');
if (vipOriginalPriceInput && vipOriginalPrice) vipOriginalPrice.textContent = vipOriginalPriceInput.value;
const vipLinkInput = document.getElementById('inputVipLink');
const vipCta = document.querySelector('.vip-cta');
if (vipLinkInput && vipCta) vipCta.href = vipLinkInput.value;
// 保存设置到localStorage
saveSettingsToLocalStorage();
// 显示成功提示
const toast = document.createElement('div');
toast.style.cssText = 'position:fixed;top:24px;left:50%;transform:translateX(-50%);background:linear-gradient(135deg,#10b981,#34d399);color:#fff;padding:16px 32px;border-radius:14px;font-size:15px;font-weight:700;box-shadow:0 8px 28px rgba(16,185,129,0.4);z-index:999999;';
toast.innerHTML = '<i class="fa fa-check-circle" style="margin-right:8px;"></i>设置保存成功!';
document.body.appendChild(toast);
setTimeout(function() { toast.remove(); }, 2000);
setTimeout(closeModal, 200);
});
}
function saveSettingsToLocalStorage() {
const settings = {
checkinIcon: document.getElementById('inputCheckinIcon').value,
checkinLink: document.getElementById('inputCheckinLink').value,
checkinTooltip: document.getElementById('inputCheckinTooltip').value,
serviceIcon: document.getElementById('inputServiceIcon').value,
serviceStatus: document.getElementById('inputServiceStatus').value,
serviceTooltip: document.getElementById('inputServiceTooltip').value,
rewardIcon: document.getElementById('inputRewardIcon').value,
rewardLink: document.getElementById('inputRewardLink').value,
rewardTooltip: document.getElementById('inputRewardTooltip').value,
qrcodeIcon: document.getElementById('inputQrcodeIcon').value,
qrcodeImage: document.getElementById('inputQrcodeImage').value,
qrcodeTitle: document.getElementById('inputQrcodeTitle').value,
qrcodeDesc: document.getElementById('inputQrcodeDesc').value,
qrcodeTooltip: document.getElementById('inputQrcodeTooltip').value,
vipIcon: document.getElementById('inputVipIcon').value,
vipPrice: document.getElementById('inputVipPrice').value,
vipOriginalPrice: document.getElementById('inputVipOriginalPrice').value,
vipLink: document.getElementById('inputVipLink').value
};
try {
localStorage.setItem('navSettings', JSON.stringify(settings));
} catch (e) {
console.warn('无法保存设置:', e);
}
}
function loadSettingsFromLocalStorage() {
try {
const savedSettings = localStorage.getItem('navSettings');
if (!savedSettings) return;
const settings = JSON.parse(savedSettings);
// 批量设置输入框值
const inputFields = [
'inputCheckinIcon', 'inputCheckinLink', 'inputCheckinTooltip',
'inputServiceIcon', 'inputServiceStatus', 'inputServiceTooltip',
'inputRewardIcon', 'inputRewardLink', 'inputRewardTooltip',
'inputQrcodeIcon', 'inputQrcodeImage', 'inputQrcodeTitle',
'inputQrcodeDesc', 'inputQrcodeTooltip',
'inputVipIcon', 'inputVipPrice', 'inputVipOriginalPrice', 'inputVipLink'
];
inputFields.forEach(id => {
const el = document.getElementById(id);
if (el) {
const key = id.replace('input', '').replace(/^./, str => str.toLowerCase());
el.value = settings[key] || '';
}
});
// 批量更新显示元素
const displayUpdates = [
{ key: 'checkinIcon', el: document.getElementById('checkinIcon'), prop: 'className', format: v => 'fa ' + v + ' nav-icon' },
{ key: 'checkinLink', el: document.getElementById('checkinLink'), prop: 'href' },
{ key: 'checkinTooltip', el: document.getElementById('checkinTooltip'), prop: 'textContent' },
{ key: 'serviceIcon', el: document.getElementById('serviceIcon'), prop: 'className', format: v => 'fa ' + v + ' nav-icon' },
{ key: 'serviceStatus', el: document.getElementById('serviceStatus'), prop: 'textContent' },
{ key: 'serviceTooltip', el: document.getElementById('serviceTooltip'), prop: 'textContent' },
{ key: 'rewardIcon', el: document.getElementById('rewardIcon'), prop: 'className', format: v => 'fa ' + v + ' nav-icon' },
{ key: 'rewardLink', el: document.getElementById('rewardLink'), prop: 'href' },
{ key: 'rewardTooltip', el: document.getElementById('rewardTooltip'), prop: 'textContent' },
{ key: 'qrcodeIcon', el: document.getElementById('qrcodeIcon'), prop: 'className', format: v => 'fa ' + v + ' nav-icon' },
{ key: 'qrcodeImage', el: document.getElementById('qrcodeImage'), prop: 'src' },
{ key: 'qrcodeTitle', el: document.getElementById('qrcodeTitle'), prop: 'textContent' },
{ key: 'qrcodeDesc', el: document.getElementById('qrcodeDesc'), prop: 'textContent' },
{ key: 'qrcodeTooltip', el: document.getElementById('qrcodeTooltip'), prop: 'textContent' }
];
displayUpdates.forEach(config => {
if (config.el && settings[config.key]) {
config.el[config.prop] = config.format ? config.format(settings[config.key]) : settings[config.key];
}
});
// VIP特殊处理
if (settings.vipIcon) {
const vipIcon = document.querySelector('.vip-item-right .nav-icon');
if (vipIcon) vipIcon.className = 'fa ' + settings.vipIcon + ' nav-icon';
}
if (settings.vipPrice) {
const vipPrice = document.querySelector('.vip-price .current');
if (vipPrice) vipPrice.textContent = settings.vipPrice;
}
if (settings.vipOriginalPrice) {
const vipOriginalPrice = document.querySelector('.vip-price .original');
if (vipOriginalPrice) vipOriginalPrice.textContent = settings.vipOriginalPrice;
}
if (settings.vipLink) {
const vipCta = document.querySelector('.vip-cta');
if (vipCta) vipCta.href = settings.vipLink;
}
} catch (e) {
console.warn('加载设置失败:', e);
}
}
// 加载设置
loadSettingsFromLocalStorage();
// 返回顶部 - 使用防抖优化
const backtopBtn = document.querySelector('.backtop-item');
let scrollRAF = null;
function checkScroll() {
if (window.scrollY > 300) {
backtopBtn.classList.add('visible');
} else {
backtopBtn.classList.remove('visible');
}
}
window.addEventListener('scroll', function() {
if (scrollRAF) cancelAnimationFrame(scrollRAF);
scrollRAF = requestAnimationFrame(checkScroll);
}, { passive: true });
checkScroll();
backtopBtn.addEventListener('click', function() {
window.scrollTo({ top: 0, behavior: 'smooth' });
});
// VIP跳转
const vipItem = document.querySelector('.vip-item-right');
if (vipItem) {
vipItem.addEventListener('click', function() {
window.location.href = '/svip';
});
}
// 全屏
const fullscreenBtn = document.querySelector('.fullscreen-item');
const fullscreenIcon = document.getElementById('fullscreen-icon');
const fullscreenTooltip = document.getElementById('fullscreen-tooltip');
function requestFullscreen(element) {
if (element.requestFullscreen) return element.requestFullscreen();
if (element.webkitRequestFullscreen) return element.webkitRequestFullscreen();
if (element.msRequestFullscreen) return element.msRequestFullscreen();
}
function exitFullscreen() {
if (document.exitFullscreen) return document.exitFullscreen();
if (document.webkitExitFullscreen) return document.webkitExitFullscreen();
if (document.msExitFullscreen) return document.msExitFullscreen();
}
function getFullscreenElement() {
return document.fullscreenElement || document.webkitFullscreenElement || document.msFullscreenElement;
}
function updateFullscreenState() {
if (getFullscreenElement()) {
fullscreenIcon.className = 'fa fa-compress nav-icon';
fullscreenTooltip.textContent = '退出全屏';
} else {
fullscreenIcon.className = 'fa fa-expand nav-icon';
fullscreenTooltip.textContent = '展开全屏';
}
}
updateFullscreenState();
fullscreenBtn.addEventListener('click', function() {
if (!getFullscreenElement()) requestFullscreen(document.documentElement);
else exitFullscreen();
});
document.addEventListener('fullscreenchange', updateFullscreenState);
document.addEventListener('webkitfullscreenchange', updateFullscreenState);
document.addEventListener('MSFullscreenChange', updateFullscreenState);
})();
</script>
<!-- 右侧悬浮导航结束 -->
[/hidecontent]

