Skip to content

动态 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

配置选项

teekConfig.ts 中,你仍然可以使用所有原有的 Banner 配置:

typescript
banner: {
  name: 'J Blog 🎉',
  descStyle: 'types',        // 打字机效果
  textColor: '#ffffff',      // 文字颜色
  descFontSize: '1.4rem',   // 字体大小
  typesInTime: 150,         // 打字速度
  typesOutTime: 80,         // 删除速度
  typesNextTime: 2000,      // 停顿时间
  // description 已移除,使用动态组件
}

组件配置选项

DynamicBannerDesc 组件支持以下 props:

属性类型默认值说明
textColorstring'#ffffff'文字颜色
fontSizestring'1.4rem'字体大小
enableTypingbooleantrue是否启用打字机效果
showRefreshButtonbooleantrue是否显示刷新按钮
autoFetchbooleantrue是否自动获取 API 数据
typeSpeednumber150打字速度(毫秒)
deleteSpeednumber80删除速度(毫秒)
pauseTimenumber2000停顿时间(毫秒)

使用方式

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": "高晓松"
}

错误处理策略

  1. 网络错误:自动回退到静态句子
  2. API 格式错误:使用 fallback 内容
  3. 超时处理:设置合理的请求超时
  4. 重试机制:用户可手动重试

样式定制

基础样式覆盖

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 内容
  • 平滑的加载状态转换
  • 移动端友好的交互设计

故障排除

常见问题

  1. API 无法访问

    • 检查网络连接
    • 确认 API 地址正确
    • 查看浏览器控制台错误
  2. 打字机效果不工作

    • 确认 descStyle: 'types'
    • 检查组件是否正确集成
    • 验证样式文件是否加载
  3. 刷新按钮不显示

    • 检查 showRefreshButton 配置
    • 在移动端需要 hover 才显示(或设置为始终显示)

调试方法

javascript
// 在浏览器控制台中
console.log('Banner配置:', theme.value.banner)
console.log('当前一言:', currentQuote.value)

更新日志

v1.0.0 (当前版本)

  • ✅ 基础动态 API 集成
  • ✅ 完整的打字机效果
  • ✅ 错误处理和 fallback
  • ✅ 响应式设计
  • ✅ 主题样式集成

计划功能

  • 🔄 多 API 源支持
  • 🎨 更多动画效果
  • ⚙️ 可视化配置界面
  • 📊 使用统计和分析

技术支持

如果遇到问题,可以:

  1. 查看浏览器控制台错误信息
  2. 检查网络请求是否成功
  3. 确认配置文件语法正确
  4. 重启开发服务器尝试

💡 提示:这个系统设计为即插即用,大部分情况下你不需要做任何配置就能正常使用。

最近更新