为长阅读而生:我做了一个「安静」的 PDF 阅读器

为什么再造一个 PDF 阅读器

浏览器自带的 PDF 视图能用,但它是"能读",不是"想读"。刺眼的白底、冰冷的无衬线字体、突兀的工具栏------对于一份需要静下心啃两小时的论文或散文集,它像超市的日光灯,什么都照亮,却什么都留不下。

我想要的是一盏台灯:暖、稳、聚焦。于是花了一个下午,写了一个单文件 HTML 阅读器:reader.html。双击就能用,没有安装,没有账户,没有云端上传。PDF 只在你的浏览器里被翻开。

C:/Users/86182/Desktop/rainnyDay/reader.html

设计的三条准绳

一、纸感优先,屏幕退后

屏幕的默认状态是发光,而纸的默认状态是被光照。这一字之差决定了阅读体验的一切。

  • 底色#EDE4D0 的羊皮纸色,比米白更暖一点,比米黄更收敛一点;
  • 纸面 再提亮到 #F6EFDD,与底色形成极轻的层次------像书页从书桌上微微浮起;
  • 墨色#3A2E22 的深棕,而不是纯黑。纯黑压屏,深棕落纸。

对比度依然守住 WCAG 的 4.5:1,只是把"能读清楚"这条底线,抬到了"读久了不难受"。

夜间模式也没有走到纯黑。#161311 的暖暗棕配 #E7DDC8 的旧象牙,眼睛落在屏幕上像落在一张老照片上------不再是"关灯的白纸",而是"点灯的旧书"。

二、字体要有性格,但不能抢戏

标题用 Fraunces------一款可变轴衬线,字面骨架挺括,衬线尾部有细微的手工感;正文继承同一家族,行高 1.65,让字与字之间有余地喘气。控件反过来用 Inter:几何、克制、不与正文争夺注意力。

中文自动回落到 Noto Serif SC,不至于在混排时忽宋忽黑。

font-feature-settings 打开 liga calttext-rendering: optimizeLegibility 打开次像素渲染。这些开关平时看不出差别,长阅读下能省下几百次眨眼。

三、工具栏是仆人,不是主人

我把整条工具栏做成悬浮的 pill:backdrop-filter: blur(10px) 让它半透明地浮在纸面之上,只在你需要它的时候存在。翻页、缩放、主题切换全部收在里面,键盘快捷键(O / ←→ / + - / W)覆盖了 90% 的日常操作------真正读进去的时候,鼠标可以不用碰。

技术上其实简单

核心只有三块:

  1. PDF.js(jsDelivr CDN) 负责解析和渲染。用 pdfjs-dist@4.7.76 的 ES module 版本,直接 import 进来,不需要打包工具。
  2. Canvas 2D + devicePixelRatio 缩放,把每一页画到高清画布上。上限设到 2 倍------4K 屏也够用,再高就是烧显存。
  3. IntersectionObserver 监听可视区域,自动同步"当前页码"。滚动式阅读的顺畅感全靠它。

主题切换是最不起眼但最讨喜的一环:所有颜色都写在 :root 的 CSS 变量里,切换主题时只是给 <html> 换一个 data-theme 属性,浏览器自己接管过渡。选好的主题存进 localStorage,下次打开还是你昨天读到那盏灯。

一些克制的选择

  • 不做云同步 。PDF 打开在浏览器里,arrayBuffer 直接喂给 PDF.js,从头到尾没有一次网络上传。信任是一种很贵的东西,能不要就不要。
  • 不做书签、批注、高亮。这些功能我很想做,但每加一个,界面就多一层。第一版的目标只有一个:让人愿意在这里读完一本书。
  • 不做懒加载。全书一次性铺开,滚轮就是翻书。分页加载在移动端也许有必要,桌面端反而打断阅读的连贯感。

长阅读的界面,本质是减法

写完这个小工具,我最直接的感受是:设计一个"读得进去"的界面,比设计一个"看得下去"的界面难得多。

后者靠对比、动效、情绪;前者靠退让。纸色退一步,让文字站出来;工具栏退一步,让内容占满视野;动画退一步,让眼睛能停下。

好的阅读器不该让你注意到它------它该像窗外的雨声一样,只是让你更容易沉下去。


源码:reader.html,单文件,双击运行。想要它的下一版做什么?告诉我。

相关推荐
2301_764441337 小时前
智慧农业管理平台灵感
开源·html
爱昏羔8 小时前
上篇:从PDF到向量库 — 物流行业RAG系统的知识库构建全解析
python·langchain·pdf·agent·rag
a1117768 小时前
3D 建筑编辑器 Pascal Editor THreeJS 开源
前端·3d·html
勇往直前plus9 小时前
Vite :从双击 HTML 到现代前端开发
前端·html
大猫会长10 小时前
获取favicon.ico的方法
前端·javascript·html
blns_yxl10 小时前
拖拽排序列表(HTML+JS)
前端·javascript·html
AI导出鸭PC端11 小时前
手机deepseek怎么导出pdf AI导出鸭
人工智能·pdf
罗超驿1 天前
JavaEE进阶之路:从Web架构原理到HTML标签全解析
前端·html·web·javaee
蓝创工坊Blue Foundry1 天前
PaddleOCR 本地部署教程:小模型 OCR 如何完成字段提取到 Excel
pdf·自动化·ocr·excel·paddlepaddle·paddle
এ慕ོ冬℘゜1 天前
原生 select 下拉框搜索失效踩坑:文本搜索与 ID 匹配不对应问题排查
前端·javascript·html