Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 

Repository files navigation

无限白板 · Infinite Board

纯静态 HTML + CSS + JavaScript 实现的高性能无限画布白板。无构建、无依赖、无服务器——打开 index.html 即可使用。 在线体验:https://xiaomu18.github.io/InfiniteBoard/


特征

  1. 高性能、高颜值。丝滑切换明亮和暗黑模式(玻璃拟态)。
  2. 7 种手绘笔刷(铅笔、记号笔、钢笔、毛笔、刷子、颜料刷、喷枪)+ 直线工具,粗细各自记忆。
  3. 圆形调色盘 + HEX 输入 + 3 种世界渐变(彩虹 / 星空 / 海洋)。
  4. 插入对象:图片、文本、SVG 矢量图都能直接放到画布上,与笔迹一样参与选择、移动、缩放、旋转、擦除、存档。
  5. 光标工具:不改变视角,直接拖屏幕上的单个对象;双击文本即可编辑;右键弹出完整上下文菜单。
  6. 等比缩放与旋转:选区四角手柄或在选区上右键横拖可等比缩放;旋转工具以目标中心为原点旋转(Shift 吸附 15°)。
  7. 画布无限大,支持移动工具、Alt + 左键拖动平移、Alt + 右键横拖缩放。
  8. 三层自适应网格,无论缩到多小多大密度都舌适。
  9. 橡皮擦像素级抹除,大小可调;Ctrl + 左键临时当橡皮擦,Ctrl + 右键横拖调大小。
  10. 自动保存:笔迹、对象、视口与偏好实时节流写入 localStorage,图片/SVG 资源存入 IndexedDB,下次打开自动恢复。
  11. .wbd 二进制存档(v3):无损保存笔迹 + 插入对象 + 内嵌资源 + 变换与视口,CRC32 校验 + gzip 压缩,可直接拖入窗口打开(兼容 v1 / v2 旧档)。
  12. 导出 PNG:全图、仅选区、或右键菜单里导出单个对象。

工具栏布局

三行五列,共 15 格(紧凑模式下变为两列):

内容
1 光标 · 旋转 · 铅笔 · 记号笔 · 钢笔
2 毛笔 · 刷子 · 颜料刷 · 喷枪 · 直线
3 矩形选择 · 自由选择 · 移动视角 · 橡皮擦 · 插入(+)

功能

笔刷(7 种,均可调粗细)

快捷键 笔刷 特征
1 铅笔 石墨颅粒、纸纹磨损感
2 记号笔 扁头、均匀半透、叠写变深
3 钢笔 丰盈、边缘锐利
4 毛笔 提按改变笔锋、起收笔开叉
5 刷子 多束硬毛、干刷拖痕
6 颜料刷 堆叠质感、厚色边缘
7 喷枪 软边缘喷雾、叠加渐浓

老版本的“水彩笔刷”与“蜡笔”已移除;旧存档里这两种笔迹在打开时会自动回退为钢笔。

笔触宽度由压感 + 运笔速度共同模拟,每种笔刷各自记忆粗细。

直线(L)

笔直、实心、粗细均匀,两端半圆收口;拖动中按 Shift 吸附到 15° 的整数倍;它单独记忆自己的粗细。

插入(I)

工具栏最后一格的“+”,点击弹出三项子菜单:

  • 添加图片:PNG / JPEG / WebP / GIF(静帧)。
  • 添加文本:新建后直接进入编辑,颜色默认跟随调色盘。
  • 添加 SVG 矢量图:按当前缩放清晰光光栅格化,缩放后会重新清晰。

也可以直接把图片 / SVG 文件拖入窗口,或用 Ctrl+V 从系统剪贴板粘贴图片与文本。 插入的对象会自动保存(资源存 IndexedDB),并无损写入 .wbd 存档。

文本

  • 双击(光标工具)或右键菜单的“编辑文本”进入编辑,文本旁会浮现样式控件条:字体、字号、加粗 / 斜体 / 下划线、对齐、行高。
  • 只选中部分字符时,样式与颜色只作用于那一段。
  • 编辑中操作调色盘可改颜色;三种渐变色同样可用于文本。
  • 自动宽度,只按手动换行排版。

光标工具(A)

  • 左键拖动:一次只拖一个对象,且只拖命中点上最上层的那一个(不会把整个选区带走)。
  • 双击文本:直接编辑。
  • 右键菜单(对象上):编辑文本 · 复制 · 剪切 · 创建副本 · 置顶 · 置底 · 水平/垂直翻转 · 重置变换 · 导出 PNG · 锁定 · 删除。
  • 右键菜单(空白处):粘贴 · 清空画布。粘贴同时支持系统剪贴板的文本/图像与白板内部复制的对象。
  • SVG 对象额外提供透明背景:先解析 SVG 去掉背景层,解析不行再像素抠白/黑底。

选择与变换

  • 矩形选择(V)与自由套索选择(B),笔迹与插入对象都能选中。
  • 选中后在选区内拖动即可移动;拖四角手柄在选区上右键横拖即可等比缩放。
  • 旋转工具(R):左键选中目标,再右键拖动绕目标中心旋转,Shift 吸附 15°。
  • Delete / Backspace 删除选中,Esc 取消。
  • 渐变色在旋转缩放后保持世界坐标映射,多个对象的渐变会自然衔接。

存档与导出

  • .wbd v3:笔迹、图片/SVG/文本对象、内嵌资源字节、变换(位置/旋转/缩放/翻转)、锁定、擦除遮罩与视口全部无损保存;兼容读取 v1 / v2 旧档。
  • 导出 PNG:全图按内容边界裁切、仅选区、或右键导出单个对象。
  • 自动保存 v2:场景与视口存 localStorage,图片/SVG 资源存 IndexedDB(wb-assets),两者按 assetId 关联。

界面

  • 中文界面,深色 / 浅色主题一键切换;面板可自动折叠,鼠标移到最左侧弹出。
  • UI 缩放随窗口自适应,窗口较小时自动切入紧凑模式(工具栏变两列)。

快捷键总表

操作 快捷键
切换笔刷 17
光标 / 旋转 / 直线 / 插入 A / R / L / I
橡皮擦 / 矩形选择 / 自由选择 / 移动视角 E / V / B / H
复制 / 剪切 / 粘贴 / 副本 Ctrl+C / Ctrl+X / Ctrl+V / Ctrl+D
临时切到橡皮擦 按住 Ctrl + 左键(松开即恢复)
调橡皮擦大小 Ctrl + 右键左右拖动
等比缩放选区 拖四角手柄,或选区上右键左右拖动
旋转对象 R 后左键选中、右键拖动(Shift 吸附 15°)
平移视角 Alt + 左键拖动,或按住空格拖动
缩小 / 放大视角 Alt + 右键左右拖动,或滚轮
缩放归位 100% 0
逐级缩放 + / -
调笔刷粗细 [ / ]
撤销(无重做) ZCtrl+Z
删除选中 Delete / Backspace
取消选区 / 关菜单 Esc
网格 / 主题 / 折叠面板 G / T / F

文件结构

index.html
styles/
  base.css        主题变量、画布层、HUD、提示条
  panel.css       左侧面板布局与折叠动画
  widgets.css     滑块、色轮、色卡、按钮等控件
  menu.css        插入菜单、右键菜单、文本样式条
src/
  utils/math.js          插值、重采样、简化、包围盒、色带(ribbon)填充、确定性随机
  utils/color.js         HEX/HSV 转换、世界坐标渐变
  core/Xform.js          对象变换(位置/旋转/缩放/翻转)与矩阵
  core/Viewport.js       世界↔屏幕变换
  core/Scene.js          对象集合、剪裁、命中测试、层序
  core/History.js        撤销栈
  core/OverscanBuffer.js 超采样缓冲(性能核心)
  core/Renderer.js       四层画布调度
  core/InputRouter.js    指针/滚轮/键盘分发
  objects/               资源缓存、图片、SVG、文本排版与渲染
  brushes/               7 种笔刷 + 直线 + 公共笔刷底层 + 注册表
  tools/                 绘制、直线、橡皮擦、平移、缩放、选择、光标、旋转、插入、变换会话
  ui/                    面板、色轮、提示、网格、插入菜单、右键菜单、文本编辑器
  io/                    idb 资源库、.wbd 存档、PNG 导出、自动保存
  main.js                装配与全局状态

性能设计

  1. 四层画布分工:网格 / 已定稿内容 / 当前一笔或拖动预览 / 交互浮层。
  2. 超采样缓冲 + GPU 变换:平移缩放过程中只给 canvas 打 CSS transform,手势结束才重烘一次。
  3. 增量描绘:不透明类笔刷每帧只画新增那一小段,避开长笔画的 O(n²)。
  4. 笔触宽度在输入时算一次并随点存储,无论重绘多少次都完全一致。
  5. 对象变换只存一个 tf(位置/旋转/缩放/翻转),渲染时才展开成矩阵,因此旋转缩放任意次也不会累积误差、不会损失精度。
  6. SVG 按缩放重新栅格化(带缓存),因此放大后仍然锐利。
  7. 包围盒剪裁 + 单一 rAF 脏标记循环:没有变化就一个像素也不画。
  8. 指针事件合并采样getCoalescedEvents):高刷新率设备上不丢点。

已知取舍

  1. 擦除是“叠在上面的遮罩”,不是重写几何。好处是撤销精确、存档无损、无限缩放不像素化;代价是大量擦除后重烘需要按序合成。
  2. 选区移动/缩放的是整个对象,不是像素块。只要笔迹有任何一个点落在选区内,整条就会跟着走;好处是结果仍是矢量。
  3. 擦除痕迹随对象一起变换。变换提交时,压在目标上的擦除会按“变换前”的位置固化成对象自带的本地遮罩(类似图层蒙版),因此移动/旋转/缩放后缺口位置完全正确。代价:这样的对象提交时会被置顶(否则原处的擦除笔迹会对它二次打洞)。撤销会一并还原遮罩与层序。
  4. Alt/Ctrl + 右键手势与右键菜单共用右键,因此画布区域不会弹出浏览器自带的上下文菜单;选择/旋转手势优先于菜单。
  5. 插入的资源存在 IndexedDB,因此浏览器隐私模式或手动清站点数据后,自动恢复里的图片/SVG 会丢失(导出的 .wbd 内嵌资源,不受影响)。
  6. 视频与 GIF 动画暂不支持(GIF 只取首帧作为静图)。
  7. 只有撤销,没有重做(有意保持的轻量心智模型)。

About

纯静态 HTML + CSS + JavaScript 实现的高性能无限画布白板

Resources

Stars

3 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages