惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
Vulnerabilities – Threatpost
aimingoo的专栏
aimingoo的专栏
B
Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
GbyAI
GbyAI
阮一峰的网络日志
阮一峰的网络日志
Engineering at Meta
Engineering at Meta
IT之家
IT之家
V
Visual Studio Blog
The Cloudflare Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
A
About on SuperTechFans
博客园 - 聂微东
Blog — PlanetScale
Blog — PlanetScale
N
News and Events Feed by Topic
A
Arctic Wolf
WordPress大学
WordPress大学
小众软件
小众软件
C
CERT Recently Published Vulnerability Notes
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
D
Darknet – Hacking Tools, Hacker News & Cyber Security
F
Fortinet All Blogs
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Y
Y Combinator Blog
T
Threat Research - Cisco Blogs
Latest news
Latest news
Simon Willison's Weblog
Simon Willison's Weblog
Cyberwarzone
Cyberwarzone
S
Schneier on Security
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
L
Lohrmann on Cybersecurity
Stack Overflow Blog
Stack Overflow Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
P
Privacy International News Feed
J
Java Code Geeks
Spread Privacy
Spread Privacy
宝玉的分享
宝玉的分享
I
Intezer
L
LangChain Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
G
GRAHAM CLULEY
博客园 - 叶小钗
博客园 - 三生石上(FineUI控件)
The GitHub Blog
The GitHub Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
N
News and Events Feed by Topic
AWS News Blog
AWS News Blog
Attack and Defense Labs
Attack and Defense Labs
Security Archives - TechRepublic
Security Archives - TechRepublic
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO

V2EX - 技术

牛逼了,我的阿里云百炼 Coding Plan Pro 莫名被永久封禁,联系客服,无法解封。寻求替代。 Antigravity 断连 - V2EX Local-first 软件收录站 从 X 上搬运来的白嫖 GPT Plus 教程 阿里云百炼 Coding Plan Pro 套餐 新增当日 token 限制 大家的 Claude 弹了 kyc 嘛 现在 Google 的 Gemini 和 AI 模式降智的厉害啊 用的 TAG 家的 T, ip 跳变是否影响使用 claude 同一 apple 账户能给不同 claude 账号充值么 做了个 Go 的 MCP Server 框架,一行代码把 Gin API 接入 AI - V2EX 请教各位,想回归技术,如何系统学习 Agent? OpenAI GPT-IMAGE-2 提示词合集 你是说, claude opus4.6 写代码的能力不如 gpt5.4? 关于智谱 Max 套餐要不要升级续费呢? App → CLI → App ? Github 账号被 404 了,现在没法恢复,求各位大佬指点 cursor 的次数套餐以后应该都用不了新模型了 - V2EX openrouter 使用国外模型 买了咸鱼低价 Gemini pro,账号差点被盗。突然发现国内诈骗成本为零 - V2EX Gemini 手机版客户端登陆总是在此国家/地区无法使用 gemini 感觉 gpt 这些低价渠道要爆了 claude code 和 codex 在 vibe coding 还有质的区别吗? 阿里 Coding Plan 一天三变, Lite 版本到期不能续费了 RAG 难以让人满意啊 2026 年了,这个世界还存在互联网精神🥹 两个账号阵亡,尼区 Claude Pro 订阅 分享下最近低价 GPT Codex 的来源(源头) OpenAI 发布 Codex 重大更新:支持自动操作电脑与长期任务自动化 使用 claude 从 0 开始开发一个校友会系统可行吗 同一个 appleid 可以给不同 chatGPT 账号订阅 plus 吗? 自动驾驶项目开发建议 终于, 降智几天之后, opus4.7 出来了 自己开发了个 VSCODE 扩展,可以接入自定义的模型,并且可以导出 Copilot 的聊天列表到其它设备上导入 - V2EX Claude 这对吗 某鱼上 codex 的价格这么便宜是否有猫腻? 🎉 Claude Opus 4.7 来啦~ 大家体验下来如何? 让 ai 重写了整个 git 的历史,强迫症被拯救了 [分享创造] 写了个自托管的 Chrome 同步服务器,书签密码再也不经过 Google 快讯, Claude Opus 4.7 已经可以使用。 Opus4.7 来了,网页版先上,桌面版本客户端暂时未看到 各位想本地部署大模型的看过来, 有台电脑想转让, 具体请查看截图, 价格请自己开价 这样用 ClaudeCode 怎么样? 我用 AI 写代码,但终端管理反而成了累赘——于是我做了 codux - V2EX [调研] 各位在公司都用什么 ide 和 agent 写代码? 丹麦国别域名(.dk)政策变更 - V2EX 目前付费订阅 chatgpt Plus 的最佳方式是什么? 老运维 share 一个运维平台 新电脑 brew install node 之后,一个小设置可以提升对供应链投毒的防御 - V2EX 看到有公司考核 token 指标,很好奇大家上个月的 AI 账单是多少 GLM-Coding 调用持续报错: z.ai 的 Lite 套餐几乎无法使用,官方 Pro/Max 是否稳定? - V2EX 现在还有什么渠道可以稳定安全地使用 Claude 吗? Chatgpt Pro 用量用不完的可以开这些设置 字节为啥不出个国内版 Vercel? 我的硬盘 Memblaze Pblaze 5 Linux 下不识别,给 Linux 内核提交了补丁, AI 说有望被合并 - V2EX Claude Web 端貌似 claude-opus-4-7 偷偷上了? 现在 Apple 开发者帳號應該是用哪个地区会更好? - V2EX ChatGPT Pro 5x 套餐 量真的很足! chrome 最新的 147 版直接卡爆炸了 - V2EX 为什么厂家不在 skill/mcp 这类的工具中塞广告呢?这样不是可以大赚嘛? minimax 真是脸都不要了,工作日下午 14:00 定时开启 529,脸都不要了。训练模型居然占用用户使用时间 外资非核心部门 vs 另一家外资的核心部门,该跳吗? iTad 标签 扩展 加小动作 ? - V2EX 去年 H200 能买,不让买是代替快出来了? - V2EX AI 赛事通 - 2026 年 4 月中国区新增 AI 竞赛和黑客松汇总 - V2EX V2EX › 登录 现在安卓开发都在做啥 - V2EX 浏览器插件 沉浸式翻译 是不支持自定义模型了吗? - V2EX Codex 里的 GPT5.4 也能降智?上午让它改两个问题,改了一个小时了, plus 额度用了一半了还是没改好,和前几天用的体感完全不一样。要它改的问题也不复杂。服了。 目前有使用 claude code 的收到人脸认证的吗 - V2EX 分享一个自己做的 Nginx 管理工具,实时请求动态预览!(无奈市面上实在找不到好用的,自己撸了个) - V2EX claude code 崩了么? 今天在反重力上用 claude 一点都不丝滑,有同样的感受吗? opencode 消息周知插件 今天 claude opus 和前两天比,质的飞跃 - V2EX 999 包月价? - V2EX 一个版本, 50 项更新:我们几乎重做了整个播放页 本地大模型多大显存够用? GOGDNS 一款简易的私人 DNS 服务器 - V2EX API key (GLM) 怎么使用 claude code desktop ? Claude 这样订阅有问题吗 - V2EX 求推荐稳定、高性价比使用 Claude Opus 4.6 的渠道/平台 搞个云端 claude code 防止 封号 - V2EX 用 Claude 要实名了,内地用户怎么办? OpenAI Plus 和 Team 都缩水了吗 海外 Android 手机有什么好用的国内第三方应用市场推荐吗 - V2EX 把电脑伪装成电视,用 DLNA 投屏拿到视频号直播流地址 - V2EX claude 认证莫慌 北京互联网法院有什么攻略么?起诉北京智谱华章科技股份有限公司退款可行么? - V2EX 求 vscode 做笔记软件的插件推荐 - V2EX Anthropic 宣布在 Claude 平台推行身份验证机制 科普一下低价 gpt 是怎么来的 现在那家的 coding plan 还能买到 是不是最近会有什么更聪明的大模型要发布了呀? 用多了 AI 后,有没有觉得 AI 生成的文章有很强的既视感? 如何 实践 Harness 工程? 如何建一个自己的号池,让 cursor 真正实现 token 自由 写了三个月 Agent Harness,我终于敢让 Claude Code 全自动写代码了 感叹一下 GLM 5.1 真的强 现在专线的机场是不是都凉了,还有稳定行强的链路推荐吗 老哥们,阿里云的 coding plan 现在哪个模型写代码体验比较好呢?
HTML in Canvas,下一代 Web 图形开发范式?
occupy555 · 2026-04-28 · via V2EX - 技术

Demo

arrival-space

html-in-canvas-cracks

解决了哪些问题

Web 开发者在处理 Canvas 内容时长期面临一个尴尬的现实:Canvas 擅长像素级操作,但对 HTML 的布局能力一无所知。这导致了几个核心问题:

可访问性的缺失 - 当你用 Canvas 绘制复杂的文本或 UI 时,屏幕阅读器可能无能为力。传统的 fallback 内容往往与实际渲染内容不同步,开发者需要手动维护两套内容。

国际化噩梦 - Canvas 没有内置的文本排版引擎。从右到左( RTL )的文本、垂直书写模式、多语言混排、表情符号,这些在 HTML 中现成的功能在 Canvas 里都需要从零实现。

性能与质量的权衡 - 许多应用选择用 Canvas 渲染 UI 以获得高性能,但不得不牺牲文本渲染的质量和交互性。或者用 DOM 渲染获得完美体验,但付出性能代价。

无法组合现代 Web 技术 - 你想在 WebGL 场景中显示精美的 HTML UI ?想在 3D 立方体上贴上动态的 HTML 内容?抱歉,现有的组合方式要么性能低下,要么实现极其复杂。

媒体导出困难 - 想将网页中的某个 HTML 区域导出为图片或视频?没有标准 API ,开发者只能依赖各种 hack 或第三方库。

这个提案通过三个核心原语——layoutsubtree 属性、drawElementImage 方法和 paint 事件——让 HTML 元素可以无缝地渲染到 2D 或 3D Canvas 中,同时保留其完整的语义和交互能力。

使用场景

1. 图表与数据可视化

想象一下,你的图表库需要在 Canvas 中绘制精美的图例、坐标轴和注释。现在你可以直接用 HTML 编写这些元素,利用完整的 CSS 样式和排版能力,然后将其绘制到 Canvas 中。参考 pie-chart.html 的无障碍饼图实现。

2. 游戏与创意工具的 UI

游戏开发者经常需要在 Canvas 中构建复杂的界面——装备面板、技能树、聊天窗口。用 HTML 构建这些 UI 既快速又美观,还能获得原生的表单控件和输入体验。见 text-input.html 的飞船控制面板示例。

3. 3D 场景中的 2D 内容

WebGL 和 WebGPU 应用需要将文本、图标等 2D 元素贴到 3D 表面上。以前这需要将文本渲染为纹理,现在可以直接使用 HTML 元素,支持实时更新和动画。webGL.html 展示了如何在旋转的 3D 立方体上显示 HTML 。

4. 国际化富文本编辑器

需要支持多语言、复杂文本布局的编辑器可以结合 Canvas 的高性能和 HTML 的排版能力。complex-text.html 演示了同时处理水平文本、垂直文本、RTL 文本和表情符号。

5. 高性能媒体导出

当你需要将网页内容导出为图片或视频时,captureElementImage API 可以捕获 HTML 元素的渲染快照,在 Worker 线程中进行处理,避免阻塞主线程。

6. WebGPU 高级效果

最激动人心的是与 WebGPU 的结合。基于光线步进( ray-marching )的果冻滑块示例展示了如何将 HTML 文本集成到复杂的着色器效果中,这是传统方法无法实现的。

工作原理

HTML-in-Canvas 的核心思想是:让浏览器同时处理 HTML 布局和 Canvas 渲染,并保持两者同步

1. layoutsubtree 属性

<canvas layoutsubtree>
  <div id="content">这是要绘制的 HTML 内容</div>
</canvas>

这个属性告诉浏览器:Canvas 的直接子元素应该参与正常的 DOM 布局流程,包括盒模型、层叠上下文、点击测试等。这些元素在视觉上是"隐藏"的(不在页面渲染树中),但它们的布局信息会被保留。

2. drawElementImage 方法

const ctx = canvas.getContext('2d');
const transform = ctx.drawElementImage(element, x, y, width, height);

这个方法将元素绘制到 Canvas 中,并返回一个变换矩阵。关键点:

  • 元素的 CSS 样式(包括复杂文本布局、渐变、阴影等)会被完整保留
  • 绘制时应用 Canvas 当前变换矩阵( CTM )
  • 内容会被裁剪到元素的边框盒
  • 返回的变换矩阵可以用于同步 DOM 位置,确保点击测试和无障碍功能正常工作

3. paint 事件与 requestPaint

canvas.onpaint = (event) => {
  // 重新绘制变化的内容
  ctx.reset();
  ctx.drawElementImage(element, 0, 0);
};

canvas.requestPaint(); // 手动触发绘制

当 Canvas 子元素的渲染发生变化时,paint 事件会自动触发。对于需要每帧更新的场景(如动画),可以调用 requestPaint() 强制触发绘制。

4. DOM 到 Canvas 变换同步

这是最精妙的部分。为了让点击测试、Intersection Observer 和无障碍功能正常工作,元素在 DOM 中的位置需要与在 Canvas 中绘制的位置保持一致。

drawElementImage 返回的变换矩阵可以直接应用到 element.style.transform

const transform = ctx.drawElementImage(element, x, y);
element.style.transform = transform.toString();

这个变换考虑了:

  • Canvas 的当前变换矩阵( CTM )
  • 绘制位置和尺寸
  • CSS 像素到 Canvas Grid 像素的缩放
  • 元素的 transform-origin

5. WebGL/WebGPU 集成

对于 3D 上下文,提供专门的方法:

// WebGL
gl.texElementImage2D(target, level, internalFormat, format, type, element);

// WebGPU
// 通过 copyElementImageToTexture 将元素复制到纹理

webGL.html 中,HTML 内容被直接渲染到纹理,然后映射到旋转的立方体上。

6. OffscreenCanvas 支持

为了利用 Worker 线程的性能优势,可以使用 captureElementImage

// 主线程
const elementImage = canvas.captureElementImage(element);
worker.postMessage({ elementImage }, [elementImage]);

// Worker 线程
const transform = offscreenCtx.drawElementImage(elementImage, x, y);

README.md 中的示例展示了完整的 Worker 模式。

源码解读

核心 API 设计

README.md 中可以看到完整的 IDL 定义:

partial interface HTMLCanvasElement {
  [CEReactions, Reflect] attribute boolean layoutSubtree;
  attribute EventHandler onpaint;
  void requestPaint();
  ElementImage captureElementImage(Element element);
  DOMMatrix getElementTransform((Element or ElementImage) element, DOMMatrix drawTransform);
};

interface mixin CanvasDrawElementImage {
  DOMMatrix drawElementImage((Element or ElementImage) element, ...);
};

CanvasRenderingContext2D includes CanvasDrawElementImage;

这个设计遵循了几个重要原则:

  1. 渐进增强 - 通过属性而不是全新的元素来扩展功能,保持向后兼容
  2. 上下文无关 - drawElementImage 是混入( mixin ),可以在 2D 、WebGL 、WebGPU 上下文中使用
  3. 事件驱动 - 使用 onpaint 事件而非轮询,性能更好

示例实现细节

文本输入示例text-input.html)展示了标准模式:

canvas.onpaint = (event) => {
  ctx.reset(); // 清除并重置变换
  const transform = ctx.drawElementImage(draw_element, x, y);
  draw_element.style.transform = transform.toString(); // 同步位置
};

饼图示例pie-chart.html)展示了如何与 Canvas 绘图结合:

// 1. 用 Canvas API 绘制扇区
const path = new Path2D();
path.arc(0, 0, radius, angle, angle + slice);
ctx.fill(path);

// 2. 用 drawElementImage 绘制标签
const transform = ctx.drawElementImage(label, x, y);
label.style.transform = transform;

// 3. 用 Canvas API 绘制焦点环
if (document.activeElement === label)
  ctx.drawFocusIfNeeded(path, document.activeElement);

还存在哪些问题

尽管这个提案已经相当成熟(已在 Chromium 中实现并通过 flag 启用),但仍有一些挑战和未解决的问题:

1. 浏览器支持有限

目前只有 Chromium 支持,且需要手动启用 chrome://flags/#canvas-draw-flag。Firefox 、Safari 尚未表态。没有跨浏览器的一致实现,开发者很难在生产环境使用。

2. 性能考量未完全明确

虽然理论上 Worker 模式应该更快,但实际的性能基准测试还不足。以下问题需要答案:

  • 复杂 DOM 树的 captureElementImage 有多昂贵?
  • 在高帧率动画中频繁同步变换是否会导致抖动?
  • 与传统的文本绘制 API 相比,性能如何?

3. 隐私与安全边界

HTML-in-Canvas 可能被用于"截屏"攻击,恶意网站可以捕获用户输入或敏感内容。提案提到了"隐私保护绘制"(相关文档),但具体的安全模型还在讨论中。

4. 复合层管理

Canvas 中的 HTML 元素如果包含复杂的 CSS 效果(如 backdrop-filter 、混合模式),如何正确处理复合?这需要浏览器引擎的深度集成。

5. 可访问性工具的适配

虽然语义元素会被保留,但屏幕阅读器等辅助技术需要理解"这个元素同时在 DOM 中和 Canvas 中"的状态。需要 ARIA 规范的相应更新。

6. 开发者体验的优化

目前的 API 需要开发者手动管理变换同步。虽然这是为了保证最大灵活性,但对于简单的用例可能过于复杂。未来可能需要更简化的 API ,如自动同步模式。

7. 测试与调试

如何在开发者工具中调试 Canvas 中的 HTML 元素?现有的 DOM Inspector 需要扩展,或者需要新的调试面板。

8. 与现有技术的协调

如何与现有的 HTML Canvas API (如 measureText)、SVG <foreignObject>、以及 CSS Houdini 等技术共存?需要明确的使用场景划分。


总结

HTML-in-Canvas 是一个有望改变 Web 图形开发范式的提案。它巧妙地解决了长期存在的"Canvas vs DOM"对立问题,让开发者可以"既要又要"——既享受 Canvas 的渲染控制力和性能,又保留 HTML 的语义、可访问性和排版能力。

核心价值在于组合性:这不是让 Canvas 重新实现 HTML ,也不是让 HTML 变得像 Canvas ,而是让两者无缝协作。这种设计哲学与 Web 的开放性本质一脉相承。

随着浏览器厂商的更多支持、性能基准测试的完善、以及开发者社区的反馈,这个技术有潜力成为现代 Web 应用的基础设施之一。对于游戏引擎、图表库、创意编码工具等领域,这是一个值得密切关注的方向。


视频版本: [ HTML in Canvas — 下一代 Web 图形开发范式?-哔哩哔哩] https://b23.tv/Js1KDKp