Deviantart
677 字
3 分鐘
博客搜索功能开发记录
功能概述
博客搜索功能是一个重要的内容导航工具,它可以帮助读者快速找到感兴趣的文章。主要特点包括:
- 实时搜索:输入即搜索,无需等待
- 毛玻璃效果:现代化的 UI 设计
- 响应式布局:同时支持桌面端和移动端
- 离线支持:使用 pagefind 实现静态搜索
技术实现
1. 组件结构
使用 Svelte 开发,主要包含以下部分:
- 桌面端搜索栏
- 移动端搜索按钮
- 搜索结果面板
- 搜索结果列表
2. 搜索面板设计
使用 dialog 元素实现模态框效果:
<dialog id="search-panel"
class="float-panel float-panel-closed absolute md:w-[30rem]
top-20 left-4 md:left-[unset] right-4 p-2">
<!-- 搜索内容 -->
</dialog>
3. 搜索逻辑
集成 pagefind 实现静态搜索:
search = async (keyword: string, isDesktop: boolean) => {
if (!keyword) {
result = []
return
}
try {
const ret = await pagefind.search(keyword)
const arr = []
for (const item of ret.results) {
arr.push(await item.data())
}
result = arr
} catch (e) {
console.warn('Search failed:', e)
result = []
}
}
4. UI 交互
实现了多种交互方式:
- 点击外部区域关闭
- ESC 键关闭
- 自动聚焦搜索框
- 平滑的动画效果
开发难点
1. 毛玻璃效果
遇到的问题:
- 背景透明度处理
- 跨浏览器兼容性
- 暗色模式适配
解决方案:
.search-panel {
background: rgba(255, 255, 255, 0.1);
backdrop-filter: blur(16px);
-webkit-backdrop-filter: blur(16px);
border: 1px solid rgba(255, 255, 255, 0.2);
}
/* 暗色模式 */
@media (prefers-color-scheme: dark) {
.search-panel {
background: rgba(28, 28, 28, 0.5);
border-color: rgba(255, 255, 255, 0.1);
}
}
/* 降级方案 */
@supports not ((-webkit-backdrop-filter: none) or (backdrop-filter: none)) {
.search-panel {
background: rgba(255, 255, 255, 0.95);
}
}
2. 搜索体验
主要问题:
- 搜索响应速度
- 结果展示方式
- 移动端适配
- 键盘操作支持
改进措施:
- 优化搜索触发时机
- 改进结果展示布局
- 添加加载状态提示
- 支持键盘导航
3. 开发环境支持
开发时的问题:
- pagefind 索引生成
- 实时预览支持
- 构建过程集成
解决方案:
- 使用 npm scripts 自动化构建
- 开发环境提供模拟数据
- 优化构建配置
未来计划
功能增强:
- 搜索结果高亮
- 搜索历史记录
- 搜索建议功能
- 分类过滤支持
性能优化:
- 搜索索引优化
- 结果缓存机制
- 懒加载优化
用户体验:
- 更好的错误提示
- 更多键盘快捷键
- 搜索统计功能
总结
搜索功能的开发过程中,我们重点关注:
- 用户体验的流畅性
- 界面设计的现代感
- 搜索功能的实用性
- 代码的可维护性
通过这些努力,我们实现了一个既美观又实用的博客搜索功能。