电子墨水屏需单独处理对比度和结构,因其无背光、无动态对比度调节、刷新存残影;CSS滤镜和Canvas filter无效,须预处理图像、约束HTML结构、禁用字体平滑并确保显式刷新。
普通响应式设计默认假设设备具备全灰阶、高刷新、背光显示能力,而电子墨水屏(如 Inky Impression、Kindle 屏)既无背光、也无动态对比度调节机制,且刷新时存在残影与波形依赖。直接套用 filter: brightness() 或 contrast() 会失效——CSS 滤镜作用于像素渲染层,但 e-ink 屏本质是“电荷翻转+双稳态保持”,浏览器无法干预底层驱动波形。真正起效的是:图像预处理后的索引色值、HTML 元素的边缘锐化控制、以及避免触发全屏重绘的 DOM 结构约束。
ctx.filter 调对比度在 e-ink 上无效的真相你在 Canvas 中写 ctx.filter = "contrast(1.5)",测试时发现没变化,不是代码错,而是硬件限制:ctx.filter 仅影响绘制结果的像素着色,但 e-ink 屏驱动芯片(如 UC8159)只接受 1-bit 或 7-color 索引帧数据,不支持浮点滤镜中间态。浏览器最终仍把滤镜后图像降采样为有限调色板,丢失所有对比度调整意图。
ctx.filter 在 e-ink 设备上实际被静默忽略(DevTools 的 Rendering 面板能看到 filter applied,但屏幕无反应)ctx.filter,连日志都不报错,容易误判为兼容性问题img.convert("1", dither=Image.NONE)),再传给 e-ink 驱动库电子墨水屏刷新慢(典型全刷 2–3 秒)、不支持亚像素渲染、对 CSS 动画完全无响应。某些看似无害的 HTML/CSS 组合,会意外触发全屏重绘或阻塞渲染队列:
<input type="text">:聚焦时浏览器尝试绘制软键盘提示、光标闪烁动画——e-ink 屏无法实现,反而卡住后续刷新;改用 <div contenteditable="true"> + 手动 focus 控制更稳妥position: fixed 或 transform: translateZ(0):强制创建合成层,在 e-ink 浏览器(如 Kindle WebView)中引发不可预测的局部重绘撕裂;所有定位应基于静态流式布局box-shadow 或 border-radius 的块级元素:e-ink 渲染引擎常将圆角/阴影退化为锯齿填充,视觉上等效于降低对比度;一律改用 border: 1px solid #000 + 直角e-ink 屏没有背光,人眼依赖反射光阅读,此时字体渲染质量比 LCD 更敏感。实测发现:font-smoothing: antialiased 反而让文字发虚,text-rendering: optimizeLegibility 在小字号下导致字间距崩塌。
立即学习“前端免费学习笔记(深入)”;
-webkit-font-smoothing: none; -moz-osx-font-smoothing: grayscale;
line-height: 1.4(不能用 1.4em 或 140%),否则不同 e-ink 浏览器对相对单位解析不一致,造成段落挤叠source-code-pro)而非衬线体,因 e-ink 像素网格对竖直笔画分辨率更高,字母“i”、“l”、“1”不易混淆最易被忽略的一点:e-ink 页面不该追求“视觉丰富”,而要追求“刷新确定性”。每次 DOM 变更都应伴随明确的 inky.show() 或等效刷新调用——没有这一步,你改了十次 innerHTML,屏幕只显示第一次的结果。