动态 Banner 描述功能
功能概述
这个动态 Banner 描述系统为 VitePress 博客提供了实时获取一言 API 的功能,支持:
- 🚀 动态获取:页面加载时自动从一言 API 获取最新内容
- ⚡ 打字机效果:完整的打字机动画效果,包括打字、停顿、删除
- 🔄 手动刷新:支持点击按钮获取新的一言
- 🛡️ 错误容错:API 失败时自动回退到静态内容
- 📱 响应式设计:完美适配各种屏幕尺寸
- 🎨 主题集成:与现有主题样式无缝融合
技术架构
文件结构
docs/.vitepress/theme/
├── components/
│ ├── DynamicBannerDesc.vue # 核心动态组件
│ └── TeekLayoutProvider.vue # 布局集成
├── utils/
│ └── quotable.ts # API工具函数
└── style/
└── dynamic-banner.scss # 样式文件
核心组件
DynamicBannerDesc.vue
主要功能:
- 实时 API 数据获取
- 打字机效果实现
- 交互控制(刷新按钮)
- 错误处理和状态管理
quotable.ts
提供的功能:
typescript
// 同步静态值(构建时安全)
export const hitokoto: string
// 异步API获取函数
export const getHitokoto: () => Promise<string>
// 同步随机句子
export const getRandomQuote: () => string
配置选项
Banner 配置保持不变
在 teekConfig.ts
中,你仍然可以使用所有原有的 Banner 配置:
typescript
banner: {
name: 'J Blog 🎉',
descStyle: 'types', // 打字机效果
textColor: '#ffffff', // 文字颜色
descFontSize: '1.4rem', // 字体大小
typesInTime: 150, // 打字速度
typesOutTime: 80, // 删除速度
typesNextTime: 2000, // 停顿时间
// description 已移除,使用动态组件
}
组件配置选项
DynamicBannerDesc
组件支持以下 props:
属性 | 类型 | 默认值 | 说明 |
---|---|---|---|
textColor | string | '#ffffff' | 文字颜色 |
fontSize | string | '1.4rem' | 字体大小 |
enableTyping | boolean | true | 是否启用打字机效果 |
showRefreshButton | boolean | true | 是否显示刷新按钮 |
autoFetch | boolean | true | 是否自动获取 API 数据 |
typeSpeed | number | 150 | 打字速度(毫秒) |
deleteSpeed | number | 80 | 删除速度(毫秒) |
pauseTime | number | 2000 | 停顿时间(毫秒) |
使用方式
1. 当前实现(自动集成)
系统已经自动集成,无需额外配置。只需确保:
- API 能够正常访问
- 主题配置正确
2. 手动控制(可选)
如果需要手动控制,可以获取组件引用:
vue
<template>
<DynamicBannerDesc ref="bannerDesc" :auto-fetch="false" />
<button @click="refresh">手动刷新</button>
</template>
<script setup>
import { ref } from 'vue'
const bannerDesc = ref()
const refresh = () => {
bannerDesc.value?.refreshHitokoto()
}
</script>
API 接口
当前使用的 API
- 主要 API:
https://international.v1.hitokoto.cn/?c=l
- 备用方案: 静态句子列表
API 响应格式
json
{
"hitokoto": "生活不止眼前的苟且,还有诗和远方的田野。",
"from": "高晓松",
"from_who": "高晓松"
}
错误处理策略
- 网络错误:自动回退到静态句子
- API 格式错误:使用 fallback 内容
- 超时处理:设置合理的请求超时
- 重试机制:用户可手动重试
样式定制
基础样式覆盖
scss
.dynamic-banner-desc {
// 自定义容器样式
.typing-text {
// 自定义文字样式
font-family: 'Your Custom Font';
}
.refresh-btn {
// 自定义按钮样式
background: your-custom-background;
}
}
渐变效果支持
系统自动继承主题的渐变文字效果:
scss
// 已自动适配
.tk-banner-content__content__desc {
.dynamic-banner-desc .typing-text span {
background-image: inherit;
-webkit-background-clip: inherit;
background-clip: inherit;
}
}
性能优化
1. 构建时优化
- 静态 fallback 确保构建速度
- 无阻塞的模块加载
- Tree-shaking 友好的导出
2. 运行时优化
- 异步 API 调用不阻塞页面渲染
- 内存泄漏防护(自动清理定时器)
- 合理的错误处理避免崩溃
3. 用户体验优化
- 首次加载显示 fallback 内容
- 平滑的加载状态转换
- 移动端友好的交互设计
故障排除
常见问题
API 无法访问
- 检查网络连接
- 确认 API 地址正确
- 查看浏览器控制台错误
打字机效果不工作
- 确认
descStyle: 'types'
- 检查组件是否正确集成
- 验证样式文件是否加载
- 确认
刷新按钮不显示
- 检查
showRefreshButton
配置 - 在移动端需要 hover 才显示(或设置为始终显示)
- 检查
调试方法
javascript
// 在浏览器控制台中
console.log('Banner配置:', theme.value.banner)
console.log('当前一言:', currentQuote.value)
更新日志
v1.0.0 (当前版本)
- ✅ 基础动态 API 集成
- ✅ 完整的打字机效果
- ✅ 错误处理和 fallback
- ✅ 响应式设计
- ✅ 主题样式集成
计划功能
- 🔄 多 API 源支持
- 🎨 更多动画效果
- ⚙️ 可视化配置界面
- 📊 使用统计和分析
技术支持
如果遇到问题,可以:
- 查看浏览器控制台错误信息
- 检查网络请求是否成功
- 确认配置文件语法正确
- 重启开发服务器尝试
💡 提示:这个系统设计为即插即用,大部分情况下你不需要做任何配置就能正常使用。