当前位置: 首页 > news >正文

Talebook 移动端适配:5 分钟把个人书库装进手机

Talebook 移动端适配:5 分钟把个人书库装进手机

【免费下载链接】talebook一个简单好用的个人书库项目地址: https://gitcode.com/gh_mirrors/ta/talebook

通勤路上想确认昨晚读到一半的那本书在不在库里,而书库文件都放在家里的 NAS 上。Talebook 的移动适配就是为这种场景准备的:前端基于 Nuxt 4 + Vuetify 构建,同一套页面在 6 英寸手机和桌面显示器上会切换成不同的列数、导航形态和对话框宽度,不需要单独维护一个"手机版"。

📐 同一书架,三种排布

手机上看书库列表,最直观的感受是卡片从横向一行一本,变成大屏上三列网格。这个行为写在书籍卡片的栅格属性里,位于 app/components/BookCards.vue,重点看xs/sm/md三行断点值:

<v-col v-for="(book,idx) in render_books" cols="12" xs="12" <!-- 手机:一行一本 --> sm="6" <!-- 小屏:一行两本 --> md="4" <!-- 中屏及以上:一行三本 --> class="book-list-card" >

Vuetify 的断点是按屏幕宽度自动匹配的,所以改列数不需要任何 JavaScript 判断,写死在模板属性里即可。封面图固定11/15的宽高比,保证不同尺寸的封面在小屏上不会把卡片撑变形。

🔍 手机上的搜索框去哪了

在桌面端,搜索框常驻顶栏右侧;到了手机宽度,它被移进顶栏的扩展行(#extension插槽),点"搜索"按钮时执行一段很短的逻辑:

function do_mobile_search() { if (search.value.trim() != '') { router.push('/search?name=' + search.value.trim()); } else { mobile_search.value?.focus(); } }

有内容就跳/search?name=...,没内容则只是把光标聚焦回输入框——这是个细节:手机上误点按钮不会白跳一次页面。侧边导航在AppHeader.vue里设置了mobile-breakpoint="md",低于中屏宽度时它变成覆盖式抽屉,由左上角汉堡按钮开关,不占内容区空间。

📱 三条命令,手机上能打开

部署本身和端无关,按 docker-compose.yml 的默认配置跑起来,8080 端口同时服务桌面和手机:

git clone https://gitcode.com/gh_mirrors/ta/talebook cd talebook docker compose up -d

第一次访问会进入网页安装向导,配置书库目录和管理员账号。书库数据挂在./data卷里,之后在手机上访问的都是这一份数据,不需要做任何移动端单独的初始化。

⚙️ 两个值得注意的细节

一是最外层视口配置:app/nuxt.config.ts里写了user-scalable=no,即禁止用户手动双指缩放页面。代价是文字小的时候无法捏大,收益是阅读器、抽屉这类自带滚动的组件不会被系统缩放打断。如果觉得字小,更合理的做法是在阅读器内调字号,而不是依赖页面缩放。

二是小屏下对话框会放宽到 80% 屏宽(桌面是 50%),确认删除、填写表单一类弹窗在手机上不至于窄到换行错乱。

另外一个小技巧:如果手机里主要用来读 EPUB,可以装一个 OPDS 客户端对接 Talebook 的 OPDS 接口,阅读体验比浏览器内嵌阅读器更接近原生;网页端则负责管理、检索和推送这类重操作,各干各的。

Talebook 的移动适配本质是把"一套代码、按断点换挡"做到位,没有为手机单独开一个维护分支。想体验的话,装完 Docker 后在浏览器里把窗口压到 390px 宽,效果就等价于一部手机。

【免费下载链接】talebook一个简单好用的个人书库项目地址: https://gitcode.com/gh_mirrors/ta/talebook

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

http://www.cnnetsun.cn/news/4165024.html

相关文章:

  • 工程化:配置驱动、导出格式与可扩展设计
  • AI率过高难通过查重?2026年高效将论文AIGC率压至10%内|知网/维普降AI实用教程(附工具)
  • mt7601u 驱动完整教程:如何点亮 MT7601U 无线网卡,在 Linux 下装好连上网络
  • QQ空间历史说说如何完整找回?GetQzonehistory 一次导出 6 份 Excel 加网页版
  • 模块3 WIFI物联网通信-项目1 WIFI连接平台-任务2 OneNET云端配置与MQTT 模拟数据上传
  • 新手品牌必看:化妆品ODM流程关键节点与避坑建议
  • 丙午年七月初九向心观
  • Path of Building 完整指南:离线 Build 规划与伤害计算,10 分钟跑通第一个 Build
  • rapid-upload-userscript-rinsp:百度网盘秒传链接一键转存,手机也能存
  • 电子合同存档合规吗?HR 别让归档年限坑了企业
  • 历史数据断层与REST请求慢到崩溃?QuantDash高性能量化数据API终极解决方案
  • 2026年有哪些高性价比的E-learning课件制作公司推荐?
  • C语言/数据结构数组题解:寻找数组中第三大的不同数字——O(n)时间O(1)空间
  • AI合规入门:我国AI合规政策的核心导向与要求
  • 炉石传说插件 HsMod:32 倍速开包、一键领奖、对手段位全暴露
  • Java大厂面试核心知识点与实战技巧全解析
  • Rust 实现可以被 Python 调用的包
  • 简繁互转怎么一键搞定?Calibre 插件 TradSimpChinese 快速上手指南
  • OpenCore Legacy Patcher 完整指南:3 步给老 Mac 装上最新 macOS(可逆、免费)
  • UDP与TCP协议深度解析:从核心原理到网络编程实战
  • 3步导出QQ空间历史说说:GetQzonehistory 完整操作指南
  • AI模型部署实战:FDE工程师的核心技能与工作流解析
  • AI翻译模型本地部署指南:用Sakura启动器从下载到起服务只要5分钟
  • SpringBoot集成Lettuce连接Redis:从基础配置到生产实践
  • 团队招聘误区与高效人才管理策略
  • C++面试核心要点与内存管理深度解析
  • LLaMA-Factory 微调提速:3 个开关压缩 7B 模型训练时间与显存
  • LLM Agent域外工具推理能力评估:AgentEscapeBench基准设计与实践
  • 大厂Java面试核心:Java基础、Spring Boot与Redis深度解析
  • C++模板参数获取:从基础使用到编译期反射的完整指南