使用指南

HTML-in-Canvas

将实时 HTML 渲染为 WebGL 纹理——对任何 DOM 内容使用 GPU 着色器、3D 几何体和电影效果。

HTML-in-Canvas API(drawElementImage)让你以 GPU 速度将实时渲染的 DOM 元素直接捕获到 canvas 中。这意味着你可以获取任何 HTML——仪表板、表单、落地页、应用 UI——并在 WebGL 场景中将它们渲染为纹理,使用着色器、3D 变换和后处理效果。

⚠️ Warning

需要 Chrome 标志。 drawElementImage API 是实验性的,必须手动启用:

  1. 在 Chrome 或 Brave 中打开 chrome://flags/#canvas-draw-element
  2. CanvasDrawElement 设置为 Enabled
  3. 重启浏览器

HyperFrames 在渲染期间自动启用此标志(--enable-features=CanvasDrawElement),因此渲染后的视频无需手动设置即可工作。该标志仅在 Studio 中的实时预览时需要。

工作原理

  1. 将 HTML 内容放在 <canvas layoutsubtree> 元素内
  2. 浏览器将 HTML 子元素作为普通 DOM 渲染
  3. 调用 ctx.drawElementImage(element, x, y, w, h) 将渲染的像素捕获到 canvas 中
  4. 将 canvas 用作 Three.js 纹理,应用着色器,映射到 3D 几何体
<!-- 1. HTML 内容位于 canvas 内 -->
<canvas id="capture" layoutsubtree width="1920" height="1080">
<div class="my-dashboard">
<h1>Revenue: $4.2M</h1>
<div class="chart">...</div>
</div>
</canvas>

<!-- 2. 用于 3D 渲染的 WebGL canvas -->
<canvas id="theater" width="1920" height="1080"></canvas>
// 3. 将 HTML 捕获到 canvas
var capCanvas = document.getElementById("capture");
var ctx = capCanvas.getContext("2d");
ctx.drawElementImage(capCanvas.querySelector(".my-dashboard"), 0, 0, 1920, 1080);

// 4. 用作 Three.js 纹理
var texture = new THREE.CanvasTexture(capCanvas);
var material = new THREE.MeshBasicMaterial({ map: texture });

与其他方案的区别

传统方法如 html2canvas 在 JavaScript 中重新解析和重新渲染 DOM——它们速度慢、有损,且遗漏 CSS 特性如 backdrop-filter、复杂阴影和 Web 字体。drawElementImage API 使用浏览器自己的合成器,因此:

  • 像素完美 — 每个 CSS 特性都受支持,因为浏览器原生渲染它
  • GPU 加速 — 以 60fps 捕获,足够快以实现实时动画
  • 实时内容 — HTML 可以在捕获之间进行动画、滚动和变化
  • 同时多次捕获 — 无嵌套限制,多个 <canvas layoutsubtree> 元素可以在同一合成中捕获不同内容

特性检测

使用 API 前始终进行特性检测。合成应该为未启用该标志的浏览器提供优雅降级。

function isSupported() {
var tc = document.createElement("canvas");
if (!("layoutSubtree" in tc)) return false;
c.setAttribute("layoutsubtree", "");
var ctx = tc.getContext("2d");
return ctx && typeof ctx.drawElementImage === "function";
}

if (isSupported()) {
ctx.drawElementImage(element, 0, 0, w, h);
} else {
// 降级:直接在 canvas 上绘制文本、使用静态图片等
}

每帧重新捕获

对于动画内容(滚动、过渡、计数器),在渲染循环内调用 drawElementImage 以每帧更新纹理:

function render() {
// 更新 HTML 状态
scrollContainer.style.transform = "translateY(-" + scrollOffset + "px)";
counterEl.textContent = Math.round(currentValue);

// 重新捕获
ctx.clearRect(0, 0, W, H);
ctx.drawElementImage(htmlElement, 0, 0, W, H);
exture.needsUpdate = true;

// 使用更新的纹理渲染 3D 场景
renderer.render(scene, camera);
}

目录 blocks

一次安装所有 HTML-in-Canvas blocks:

npx hyperframes add html-in-canvas

或单独安装:

Block描述安装
iOS 26 Liquid Glass 主屏幕带有实时 Liquid Glass 通知和小组件的 iPhone 主屏幕npx hyperframes add ios26-liquid-glass
macOS Tahoe Liquid Glass 桌面带有液态玻璃窗口、Dock 和通知的 MacBook 桌面npx hyperframes add macos-tahoe-liquid-glass
Liquid Glass 通知具有原生感的玻璃通知堆栈,带进度和回复状态npx hyperframes add liquid-glass-notification
iPhone & MacBook带有实时 HTML 屏幕的真实 3D GLTF 设备npx hyperframes add vfx-iphone-device
Text Cursor带有色彩阴影的戏剧性文本揭示npx hyperframes add vfx-text-cursor
Portal带有体积光的维度突破npx hyperframes add vfx-portal
ShatterHTML 碎裂成玻璃碎片npx hyperframes add vfx-shatter
Magnetic磁场粒子可视化npx hyperframes add vfx-magnetic
Liquid Background有机液体模拟npx hyperframes add vfx-liquid-background

渲染

HyperFrames 在渲染期间自动启用 Chrome 标志。无需特殊配置:

npx hyperframes render --output my-video.mp4

对于 Docker 渲染,该标志也会在容器内自动启用。